diff options
author | Robin Templeton <[email protected]> | 2014-09-21 03:56:15 -0400 |
---|---|---|
committer | Robin Templeton <[email protected]> | 2015-04-20 00:29:03 -0400 |
commit | fa4d389029c1a53dbd89ae99638c7b3a4e1b6f7b (patch) | |
tree | ad416a38058e77c99ddc164f877f33372874b585 /src/lread.c | |
parent | 55f2168dd4ecd0ff197d5b3d5162cd276a47202d (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.
Diffstat (limited to 'src/lread.c')
-rw-r--r-- | src/lread.c | 34 |
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)); } |