aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Templeton <[email protected]>2014-09-21 03:56:15 -0400
committerRobin Templeton <[email protected]>2015-04-20 00:29:03 -0400
commitfa4d389029c1a53dbd89ae99638c7b3a4e1b6f7b (patch)
treead416a38058e77c99ddc164f877f33372874b585
parent55f2168dd4ecd0ff197d5b3d5162cd276a47202d (diff)
remove use of nested function in map_obarray
* src/lread.c (map_obarray_inner): New function. (map_obarray): Remove use of non-standard nested function. Thanks to Jaime Fournier <[email protected]> for the bug report.
-rw-r--r--src/lread.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/lread.c b/src/lread.c
index 9250c3b739..2d81c35c93 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -39,6 +39,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "frame.h"
#include "termhooks.h"
#include "blockinput.h"
+#include "guile.h"
#ifdef MSDOS
#include "msdos.h"
@@ -3886,19 +3887,34 @@ usage: (unintern NAME OBARRAY) */)
return (scm_is_true (scm_unintern (name, obhash (obarray))) ? Qt : Qnil);
}
+struct map_obarray_data
+{
+ Lisp_Object obarray;
+ void (*fn) (Lisp_Object, Lisp_Object);
+ Lisp_Object arg;
+};
+
+static Lisp_Object
+map_obarray_inner (void *data, Lisp_Object sym)
+{
+ struct map_obarray_data *modata = data;
+
+ Lisp_Object tem = Ffind_symbol (SYMBOL_NAME (sym), modata->obarray);
+ if (scm_is_true (scm_c_value_ref (tem, 1))
+ && EQ (sym, scm_c_value_ref (tem, 0)))
+ modata->fn (sym, modata->arg);
+ return SCM_UNSPECIFIED;
+}
+
void
map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg)
{
- Lisp_Object proc (Lisp_Object sym)
- {
- Lisp_Object tem = Ffind_symbol (SYMBOL_NAME (sym), obarray);
- if (scm_is_true (scm_c_value_ref (tem, 1))
- && EQ (sym, scm_c_value_ref (tem, 0)))
- fn (sym, arg);
- return SCM_UNSPECIFIED;
- }
+ struct map_obarray_data data = { .obarray = obarray,
+ .fn = fn,
+ .arg = arg };
+
CHECK_VECTOR (obarray);
- scm_obarray_for_each (scm_c_make_gsubr ("proc", 1, 0, 0, proc),
+ scm_obarray_for_each (make_c_closure (map_obarray_inner, &data, 1, 0),
obhash (obarray));
}