From: Richard M. Stallman Date: Sat, 5 Aug 1995 22:53:03 +0000 (+0000) Subject: (run_hook_with_args): Add gcpros. X-Git-Tag: emacs-19.34~3079 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c933ea05f809c1367a1bcbc9a42a11ffcda66b88;p=emacs.git (run_hook_with_args): Add gcpros. (run_hook_list_with_args): New function. --- diff --git a/src/eval.c b/src/eval.c index bc09eb2871e..07fbf871b68 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1906,6 +1906,14 @@ not `make-local-variable'.") return run_hook_with_args (nargs, args, until_failure); } +/* ARGS[0] should be a hook symbol. + Call each of the functions in the hook value, passing each of them + as arguments all the rest of ARGS (all NARGS - 1 elements). + COND specifies a condition to test after each call + to decide whether to stop. + The caller (or its caller, etc) must gcpro all of ARGS, + except that it isn't necessary to gcpro ARGS[0]. */ + Lisp_Object run_hook_with_args (nargs, args, cond) int nargs; @@ -1913,11 +1921,14 @@ run_hook_with_args (nargs, args, cond) enum run_hooks_condition cond; { Lisp_Object sym, val, ret; + struct gcpro gcpro1, gcpro2; sym = args[0]; val = find_symbol_value (sym); ret = (cond == until_failure ? Qt : Qnil); + GCPRO2 (sym, val); + if (EQ (val, Qunbound) || NILP (val)) return ret; else if (!CONSP (val) || EQ (XCONS (val)->car, Qlambda)) @@ -1958,6 +1969,52 @@ run_hook_with_args (nargs, args, cond) return ret; } } + +/* Run a hook symbol ARGS[0], but use FUNLIST instead of the actual + present value of that symbol. + Call each element of FUNLIST, + passing each of them the rest of ARGS. + The caller (or its caller, etc) must gcpro all of ARGS, + except that it isn't necessary to gcpro ARGS[0]. */ + +Lisp_Object +run_hook_list_with_args (funlist, nargs, args) + Lisp_Object funlist; + int nargs; + Lisp_Object *args; +{ + Lisp_Object sym; + Lisp_Object val; + struct gcpro gcpro1, gcpro2; + + sym = args[0]; + GCPRO2 (sym, val); + + for (val = funlist; CONSP (val); val = XCONS (val)->cdr) + { + if (EQ (XCONS (val)->car, Qt)) + { + /* t indicates this hook has a local binding; + it means to run the global binding too. */ + Lisp_Object globals; + + for (globals = Fdefault_value (sym); + CONSP (globals); + globals = XCONS (globals)->cdr) + { + args[0] = XCONS (globals)->car; + Ffuncall (nargs, args); + } + } + else + { + args[0] = XCONS (val)->car; + Ffuncall (nargs, args); + } + } + UNGCPRO; + return Qnil; +} /* Apply fn to arg */ Lisp_Object