From fa4d389029c1a53dbd89ae99638c7b3a4e1b6f7b Mon Sep 17 00:00:00 2001 From: Robin Templeton Date: Sun, 21 Sep 2014 03:56:15 -0400 Subject: 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 for the bug report. --- src/lread.c | 34 +++++++++++++++++++++++++--------- 1 file 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 . */ #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)); } -- cgit v1.2.3