Mercurial > emacs
annotate src/eval.c @ 23323:0800a4f84757
(underlying_strftime):
Set the buffer to a nonzero value before calling
strftime, and check to see whether strftime has set the buffer to zero.
This lets us distinguish between an empty buffer and an error.
I'm installing this patch by hand now; it will be superseded whenever
the glibc sources are propagated back to fsf.org.
| author | Paul Eggert <eggert@twinsun.com> |
|---|---|
| date | Fri, 25 Sep 1998 21:40:23 +0000 |
| parents | a9090a71e969 |
| children | a4b29402f761 |
| rev | line source |
|---|---|
| 272 | 1 /* Evaluator for GNU Emacs Lisp interpreter. |
|
10342
01d13c22797e
(Fcommandp): Use & PSEUDOVECTOR_SIZE_MASK on `size' field of compiled
Roland McGrath <roland@gnu.org>
parents:
10201
diff
changeset
|
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995 Free Software Foundation, Inc. |
| 272 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
|
10342
01d13c22797e
(Fcommandp): Use & PSEUDOVECTOR_SIZE_MASK on `size' field of compiled
Roland McGrath <roland@gnu.org>
parents:
10201
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
| 272 | 9 any later version. |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
|
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14073
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14073
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
| 272 | 20 |
| 21 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4474
diff
changeset
|
22 #include <config.h> |
| 21514 | 23 |
| 24 #ifdef STDC_HEADERS | |
| 25 #include <stdlib.h> | |
| 26 #endif | |
| 27 | |
| 272 | 28 #include "lisp.h" |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
1564
diff
changeset
|
29 #include "blockinput.h" |
| 272 | 30 |
| 31 #ifndef standalone | |
| 32 #include "commands.h" | |
| 515 | 33 #include "keyboard.h" |
| 272 | 34 #else |
| 35 #define INTERACTIVE 1 | |
| 36 #endif | |
| 37 | |
| 38 #include <setjmp.h> | |
| 39 | |
| 40 /* This definition is duplicated in alloc.c and keyboard.c */ | |
| 41 /* Putting it in lisp.h makes cc bomb out! */ | |
| 42 | |
| 43 struct backtrace | |
| 44 { | |
| 45 struct backtrace *next; | |
| 46 Lisp_Object *function; | |
| 47 Lisp_Object *args; /* Points to vector of args. */ | |
| 727 | 48 int nargs; /* Length of vector. |
| 49 If nargs is UNEVALLED, args points to slot holding | |
| 50 list of unevalled args */ | |
| 272 | 51 char evalargs; |
| 52 /* Nonzero means call value of debugger when done with this operation. */ | |
| 53 char debug_on_exit; | |
| 54 }; | |
| 55 | |
| 56 struct backtrace *backtrace_list; | |
| 57 | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
58 /* This structure helps implement the `catch' and `throw' control |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
59 structure. A struct catchtag contains all the information needed |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
60 to restore the state of the interpreter after a non-local jump. |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
61 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
62 Handlers for error conditions (represented by `struct handler' |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
63 structures) just point to a catch tag to do the cleanup required |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
64 for their jumps. |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
65 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
66 catchtag structures are chained together in the C calling stack; |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
67 the `next' member points to the next outer catchtag. |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
68 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
69 A call like (throw TAG VAL) searches for a catchtag whose `tag' |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
70 member is TAG, and then unbinds to it. The `val' member is used to |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
71 hold VAL while the stack is unwound; `val' is returned as the value |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
72 of the catch form. |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
73 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
74 All the other members are concerned with restoring the interpreter |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
75 state. */ |
| 272 | 76 struct catchtag |
| 77 { | |
| 78 Lisp_Object tag; | |
| 79 Lisp_Object val; | |
| 80 struct catchtag *next; | |
| 81 struct gcpro *gcpro; | |
| 82 jmp_buf jmp; | |
| 83 struct backtrace *backlist; | |
| 84 struct handler *handlerlist; | |
| 85 int lisp_eval_depth; | |
| 86 int pdlcount; | |
| 87 int poll_suppress_count; | |
| 88 }; | |
| 89 | |
| 90 struct catchtag *catchlist; | |
| 91 | |
| 92 Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun; | |
| 381 | 93 Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag; |
| 272 | 94 Lisp_Object Qmocklisp_arguments, Vmocklisp_arguments, Qmocklisp; |
| 95 Lisp_Object Qand_rest, Qand_optional; | |
| 96 Lisp_Object Qdebug_on_error; | |
| 97 | |
|
16296
584310941e70
(syms_of_eval): Initialize Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
16113
diff
changeset
|
98 /* This holds either the symbol `run-hooks' or nil. |
|
584310941e70
(syms_of_eval): Initialize Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
16113
diff
changeset
|
99 It is nil at an early stage of startup, and when Emacs |
|
584310941e70
(syms_of_eval): Initialize Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
16113
diff
changeset
|
100 is shutting down. */ |
| 272 | 101 Lisp_Object Vrun_hooks; |
| 102 | |
| 103 /* Non-nil means record all fset's and provide's, to be undone | |
| 104 if the file being autoloaded is not fully loaded. | |
| 105 They are recorded by being consed onto the front of Vautoload_queue: | |
| 106 (FUN . ODEF) for a defun, (OFEATURES . nil) for a provide. */ | |
| 107 | |
| 108 Lisp_Object Vautoload_queue; | |
| 109 | |
| 110 /* Current number of specbindings allocated in specpdl. */ | |
| 111 int specpdl_size; | |
| 112 | |
| 113 /* Pointer to beginning of specpdl. */ | |
| 114 struct specbinding *specpdl; | |
| 115 | |
| 116 /* Pointer to first unused element in specpdl. */ | |
| 117 struct specbinding *specpdl_ptr; | |
| 118 | |
| 119 /* Maximum size allowed for specpdl allocation */ | |
| 120 int max_specpdl_size; | |
| 121 | |
| 122 /* Depth in Lisp evaluations and function calls. */ | |
| 123 int lisp_eval_depth; | |
| 124 | |
| 125 /* Maximum allowed depth in Lisp evaluations and function calls. */ | |
| 126 int max_lisp_eval_depth; | |
| 127 | |
| 128 /* Nonzero means enter debugger before next function call */ | |
| 129 int debug_on_next_call; | |
| 130 | |
| 684 | 131 /* List of conditions (non-nil atom means all) which cause a backtrace |
|
706
86cb5db0b6c3
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
687
diff
changeset
|
132 if an error is handled by the command loop's error handler. */ |
| 684 | 133 Lisp_Object Vstack_trace_on_error; |
| 272 | 134 |
| 684 | 135 /* List of conditions (non-nil atom means all) which enter the debugger |
|
706
86cb5db0b6c3
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
687
diff
changeset
|
136 if an error is handled by the command loop's error handler. */ |
| 684 | 137 Lisp_Object Vdebug_on_error; |
| 272 | 138 |
| 13768 | 139 /* List of conditions and regexps specifying error messages which |
| 140 do not enter the debugger even if Vdebug_on_errors says they should. */ | |
| 141 Lisp_Object Vdebug_ignored_errors; | |
| 142 | |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
143 /* Non-nil means call the debugger even if the error will be handled. */ |
|
16443
0128b923d281
(Vdebug_on_signal): Renamed from Vdebug_force.
Richard M. Stallman <rms@gnu.org>
parents:
16355
diff
changeset
|
144 Lisp_Object Vdebug_on_signal; |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
145 |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
146 /* Hook for edebug to use. */ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
147 Lisp_Object Vsignal_hook_function; |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
148 |
| 272 | 149 /* Nonzero means enter debugger if a quit signal |
| 684 | 150 is handled by the command loop's error handler. */ |
| 272 | 151 int debug_on_quit; |
| 152 | |
|
17872
31b2c6763574
(num_nonmacro_input_events):
Richard M. Stallman <rms@gnu.org>
parents:
17275
diff
changeset
|
153 /* The value of num_nonmacro_input_events as of the last time we |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
154 started to enter the debugger. If we decide to enter the debugger |
|
17872
31b2c6763574
(num_nonmacro_input_events):
Richard M. Stallman <rms@gnu.org>
parents:
17275
diff
changeset
|
155 again when this is still equal to num_nonmacro_input_events, then we |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
156 know that the debugger itself has an error, and we should just |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
157 signal the error instead of entering an infinite loop of debugger |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
158 invocations. */ |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
159 int when_entered_debugger; |
| 272 | 160 |
| 161 Lisp_Object Vdebugger; | |
| 162 | |
| 163 void specbind (), record_unwind_protect (); | |
| 164 | |
|
13314
661060193eb8
(run_hook_with_args): Add forward declaration.
Richard M. Stallman <rms@gnu.org>
parents:
13103
diff
changeset
|
165 Lisp_Object run_hook_with_args (); |
|
661060193eb8
(run_hook_with_args): Add forward declaration.
Richard M. Stallman <rms@gnu.org>
parents:
13103
diff
changeset
|
166 |
| 272 | 167 Lisp_Object funcall_lambda (); |
| 168 extern Lisp_Object ml_apply (); /* Apply a mocklisp function to unevaluated argument list */ | |
| 169 | |
| 21514 | 170 void |
| 272 | 171 init_eval_once () |
| 172 { | |
| 173 specpdl_size = 50; | |
|
7885
bc6406a90796
(init_eval_once): Call xmalloc, not malloc.
Richard M. Stallman <rms@gnu.org>
parents:
7533
diff
changeset
|
174 specpdl = (struct specbinding *) xmalloc (specpdl_size * sizeof (struct specbinding)); |
|
14600
f32beac333a0
(init_eval_once): Initialize specpdl_ptr.
Karl Heuer <kwzh@gnu.org>
parents:
14218
diff
changeset
|
175 specpdl_ptr = specpdl; |
| 272 | 176 max_specpdl_size = 600; |
|
17061
bc9a4db95edb
(init_eval_once): Increase max_lisp_eval_depth to 300.
Karl Heuer <kwzh@gnu.org>
parents:
16930
diff
changeset
|
177 max_lisp_eval_depth = 300; |
|
8980
e641b60610a1
(init_eval_once): Init Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
8902
diff
changeset
|
178 |
|
e641b60610a1
(init_eval_once): Init Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
8902
diff
changeset
|
179 Vrun_hooks = Qnil; |
| 272 | 180 } |
| 181 | |
| 21514 | 182 void |
| 272 | 183 init_eval () |
| 184 { | |
| 185 specpdl_ptr = specpdl; | |
| 186 catchlist = 0; | |
| 187 handlerlist = 0; | |
| 188 backtrace_list = 0; | |
| 189 Vquit_flag = Qnil; | |
| 190 debug_on_next_call = 0; | |
| 191 lisp_eval_depth = 0; | |
|
17872
31b2c6763574
(num_nonmacro_input_events):
Richard M. Stallman <rms@gnu.org>
parents:
17275
diff
changeset
|
192 /* This is less than the initial value of num_nonmacro_input_events. */ |
|
7213
bb5db306a305
(init_eval): Initialize when_entered_debugger to -1.
Richard M. Stallman <rms@gnu.org>
parents:
6918
diff
changeset
|
193 when_entered_debugger = -1; |
| 272 | 194 } |
| 195 | |
| 196 Lisp_Object | |
| 197 call_debugger (arg) | |
| 198 Lisp_Object arg; | |
| 199 { | |
| 200 if (lisp_eval_depth + 20 > max_lisp_eval_depth) | |
| 201 max_lisp_eval_depth = lisp_eval_depth + 20; | |
| 202 if (specpdl_size + 40 > max_specpdl_size) | |
| 203 max_specpdl_size = specpdl_size + 40; | |
| 204 debug_on_next_call = 0; | |
|
17872
31b2c6763574
(num_nonmacro_input_events):
Richard M. Stallman <rms@gnu.org>
parents:
17275
diff
changeset
|
205 when_entered_debugger = num_nonmacro_input_events; |
| 272 | 206 return apply1 (Vdebugger, arg); |
| 207 } | |
| 208 | |
| 21514 | 209 void |
| 272 | 210 do_debug_on_call (code) |
| 211 Lisp_Object code; | |
| 212 { | |
| 213 debug_on_next_call = 0; | |
| 214 backtrace_list->debug_on_exit = 1; | |
| 215 call_debugger (Fcons (code, Qnil)); | |
| 216 } | |
| 217 | |
| 218 /* NOTE!!! Every function that can call EVAL must protect its args | |
| 219 and temporaries from garbage collection while it needs them. | |
| 220 The definition of `For' shows what you have to do. */ | |
| 221 | |
| 222 DEFUN ("or", For, Sor, 0, UNEVALLED, 0, | |
| 223 "Eval args until one of them yields non-nil, then return that value.\n\ | |
| 224 The remaining args are not evalled at all.\n\ | |
| 225 If all args return nil, return nil.") | |
| 226 (args) | |
| 227 Lisp_Object args; | |
| 228 { | |
| 229 register Lisp_Object val; | |
| 230 Lisp_Object args_left; | |
| 231 struct gcpro gcpro1; | |
| 232 | |
| 485 | 233 if (NILP(args)) |
| 272 | 234 return Qnil; |
| 235 | |
| 236 args_left = args; | |
| 237 GCPRO1 (args_left); | |
| 238 | |
| 239 do | |
| 240 { | |
| 241 val = Feval (Fcar (args_left)); | |
| 485 | 242 if (!NILP (val)) |
| 272 | 243 break; |
| 244 args_left = Fcdr (args_left); | |
| 245 } | |
| 485 | 246 while (!NILP(args_left)); |
| 272 | 247 |
| 248 UNGCPRO; | |
| 249 return val; | |
| 250 } | |
| 251 | |
| 252 DEFUN ("and", Fand, Sand, 0, UNEVALLED, 0, | |
| 253 "Eval args until one of them yields nil, then return nil.\n\ | |
| 254 The remaining args are not evalled at all.\n\ | |
| 255 If no arg yields nil, return the last arg's value.") | |
| 256 (args) | |
| 257 Lisp_Object args; | |
| 258 { | |
| 259 register Lisp_Object val; | |
| 260 Lisp_Object args_left; | |
| 261 struct gcpro gcpro1; | |
| 262 | |
| 485 | 263 if (NILP(args)) |
| 272 | 264 return Qt; |
| 265 | |
| 266 args_left = args; | |
| 267 GCPRO1 (args_left); | |
| 268 | |
| 269 do | |
| 270 { | |
| 271 val = Feval (Fcar (args_left)); | |
| 485 | 272 if (NILP (val)) |
| 272 | 273 break; |
| 274 args_left = Fcdr (args_left); | |
| 275 } | |
| 485 | 276 while (!NILP(args_left)); |
| 272 | 277 |
| 278 UNGCPRO; | |
| 279 return val; | |
| 280 } | |
| 281 | |
| 282 DEFUN ("if", Fif, Sif, 2, UNEVALLED, 0, | |
| 283 "(if COND THEN ELSE...): if COND yields non-nil, do THEN, else do ELSE...\n\ | |
| 284 Returns the value of THEN or the value of the last of the ELSE's.\n\ | |
| 285 THEN must be one expression, but ELSE... can be zero or more expressions.\n\ | |
| 286 If COND yields nil, and there are no ELSE's, the value is nil.") | |
| 287 (args) | |
| 288 Lisp_Object args; | |
| 289 { | |
| 290 register Lisp_Object cond; | |
| 291 struct gcpro gcpro1; | |
| 292 | |
| 293 GCPRO1 (args); | |
| 294 cond = Feval (Fcar (args)); | |
| 295 UNGCPRO; | |
| 296 | |
| 485 | 297 if (!NILP (cond)) |
| 272 | 298 return Feval (Fcar (Fcdr (args))); |
| 299 return Fprogn (Fcdr (Fcdr (args))); | |
| 300 } | |
| 301 | |
| 302 DEFUN ("cond", Fcond, Scond, 0, UNEVALLED, 0, | |
| 303 "(cond CLAUSES...): try each clause until one succeeds.\n\ | |
| 304 Each clause looks like (CONDITION BODY...). CONDITION is evaluated\n\ | |
| 305 and, if the value is non-nil, this clause succeeds:\n\ | |
| 306 then the expressions in BODY are evaluated and the last one's\n\ | |
| 307 value is the value of the cond-form.\n\ | |
| 308 If no clause succeeds, cond returns nil.\n\ | |
| 309 If a clause has one element, as in (CONDITION),\n\ | |
| 310 CONDITION's value if non-nil is returned from the cond-form.") | |
| 311 (args) | |
| 312 Lisp_Object args; | |
| 313 { | |
| 314 register Lisp_Object clause, val; | |
| 315 struct gcpro gcpro1; | |
| 316 | |
| 317 val = Qnil; | |
| 318 GCPRO1 (args); | |
| 485 | 319 while (!NILP (args)) |
| 272 | 320 { |
| 321 clause = Fcar (args); | |
| 322 val = Feval (Fcar (clause)); | |
| 485 | 323 if (!NILP (val)) |
| 272 | 324 { |
| 325 if (!EQ (XCONS (clause)->cdr, Qnil)) | |
| 326 val = Fprogn (XCONS (clause)->cdr); | |
| 327 break; | |
| 328 } | |
| 329 args = XCONS (args)->cdr; | |
| 330 } | |
| 331 UNGCPRO; | |
| 332 | |
| 333 return val; | |
| 334 } | |
| 335 | |
| 336 DEFUN ("progn", Fprogn, Sprogn, 0, UNEVALLED, 0, | |
| 337 "(progn BODY...): eval BODY forms sequentially and return value of last one.") | |
| 338 (args) | |
| 339 Lisp_Object args; | |
| 340 { | |
| 341 register Lisp_Object val, tem; | |
| 342 Lisp_Object args_left; | |
| 343 struct gcpro gcpro1; | |
| 344 | |
| 345 /* In Mocklisp code, symbols at the front of the progn arglist | |
| 346 are to be bound to zero. */ | |
| 347 if (!EQ (Vmocklisp_arguments, Qt)) | |
| 348 { | |
| 349 val = make_number (0); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
350 while (!NILP (args) && (tem = Fcar (args), SYMBOLP (tem))) |
| 272 | 351 { |
| 352 QUIT; | |
| 353 specbind (tem, val), args = Fcdr (args); | |
| 354 } | |
| 355 } | |
| 356 | |
| 485 | 357 if (NILP(args)) |
| 272 | 358 return Qnil; |
| 359 | |
| 360 args_left = args; | |
| 361 GCPRO1 (args_left); | |
| 362 | |
| 363 do | |
| 364 { | |
| 365 val = Feval (Fcar (args_left)); | |
| 366 args_left = Fcdr (args_left); | |
| 367 } | |
| 485 | 368 while (!NILP(args_left)); |
| 272 | 369 |
| 370 UNGCPRO; | |
| 371 return val; | |
| 372 } | |
| 373 | |
| 374 DEFUN ("prog1", Fprog1, Sprog1, 1, UNEVALLED, 0, | |
| 375 "(prog1 FIRST BODY...): eval FIRST and BODY sequentially; value from FIRST.\n\ | |
| 376 The value of FIRST is saved during the evaluation of the remaining args,\n\ | |
| 377 whose values are discarded.") | |
| 378 (args) | |
| 379 Lisp_Object args; | |
| 380 { | |
| 381 Lisp_Object val; | |
| 382 register Lisp_Object args_left; | |
| 383 struct gcpro gcpro1, gcpro2; | |
| 384 register int argnum = 0; | |
| 385 | |
| 485 | 386 if (NILP(args)) |
| 272 | 387 return Qnil; |
| 388 | |
| 389 args_left = args; | |
| 390 val = Qnil; | |
| 391 GCPRO2 (args, val); | |
| 392 | |
| 393 do | |
| 394 { | |
| 395 if (!(argnum++)) | |
| 396 val = Feval (Fcar (args_left)); | |
| 397 else | |
| 398 Feval (Fcar (args_left)); | |
| 399 args_left = Fcdr (args_left); | |
| 400 } | |
| 485 | 401 while (!NILP(args_left)); |
| 272 | 402 |
| 403 UNGCPRO; | |
| 404 return val; | |
| 405 } | |
| 406 | |
| 407 DEFUN ("prog2", Fprog2, Sprog2, 2, UNEVALLED, 0, | |
| 8412 | 408 "(prog2 X Y BODY...): eval X, Y and BODY sequentially; value from Y.\n\ |
| 272 | 409 The value of Y is saved during the evaluation of the remaining args,\n\ |
| 410 whose values are discarded.") | |
| 411 (args) | |
| 412 Lisp_Object args; | |
| 413 { | |
| 414 Lisp_Object val; | |
| 415 register Lisp_Object args_left; | |
| 416 struct gcpro gcpro1, gcpro2; | |
| 417 register int argnum = -1; | |
| 418 | |
| 419 val = Qnil; | |
| 420 | |
| 6803 | 421 if (NILP (args)) |
| 272 | 422 return Qnil; |
| 423 | |
| 424 args_left = args; | |
| 425 val = Qnil; | |
| 426 GCPRO2 (args, val); | |
| 427 | |
| 428 do | |
| 429 { | |
| 430 if (!(argnum++)) | |
| 431 val = Feval (Fcar (args_left)); | |
| 432 else | |
| 433 Feval (Fcar (args_left)); | |
| 434 args_left = Fcdr (args_left); | |
| 435 } | |
| 6803 | 436 while (!NILP (args_left)); |
| 272 | 437 |
| 438 UNGCPRO; | |
| 439 return val; | |
| 440 } | |
| 441 | |
| 442 DEFUN ("setq", Fsetq, Ssetq, 0, UNEVALLED, 0, | |
| 443 "(setq SYM VAL SYM VAL ...): set each SYM to the value of its VAL.\n\ | |
| 6918 | 444 The symbols SYM are variables; they are literal (not evaluated).\n\ |
| 445 The values VAL are expressions; they are evaluated.\n\ | |
| 446 Thus, (setq x (1+ y)) sets `x' to the value of `(1+ y)'.\n\ | |
| 447 The second VAL is not computed until after the first SYM is set, and so on;\n\ | |
| 448 each VAL can use the new value of variables set earlier in the `setq'.\n\ | |
| 6713 | 449 The return value of the `setq' form is the value of the last VAL.") |
| 272 | 450 (args) |
| 451 Lisp_Object args; | |
| 452 { | |
| 453 register Lisp_Object args_left; | |
| 454 register Lisp_Object val, sym; | |
| 455 struct gcpro gcpro1; | |
| 456 | |
| 485 | 457 if (NILP(args)) |
| 272 | 458 return Qnil; |
| 459 | |
| 460 args_left = args; | |
| 461 GCPRO1 (args); | |
| 462 | |
| 463 do | |
| 464 { | |
| 465 val = Feval (Fcar (Fcdr (args_left))); | |
| 466 sym = Fcar (args_left); | |
| 467 Fset (sym, val); | |
| 468 args_left = Fcdr (Fcdr (args_left)); | |
| 469 } | |
| 485 | 470 while (!NILP(args_left)); |
| 272 | 471 |
| 472 UNGCPRO; | |
| 473 return val; | |
| 474 } | |
| 475 | |
| 476 DEFUN ("quote", Fquote, Squote, 1, UNEVALLED, 0, | |
| 477 "Return the argument, without evaluating it. `(quote x)' yields `x'.") | |
| 478 (args) | |
| 479 Lisp_Object args; | |
| 480 { | |
| 481 return Fcar (args); | |
| 482 } | |
| 483 | |
| 484 DEFUN ("function", Ffunction, Sfunction, 1, UNEVALLED, 0, | |
| 485 "Like `quote', but preferred for objects which are functions.\n\ | |
| 486 In byte compilation, `function' causes its argument to be compiled.\n\ | |
| 487 `quote' cannot do that.") | |
| 488 (args) | |
| 489 Lisp_Object args; | |
| 490 { | |
| 491 return Fcar (args); | |
| 492 } | |
| 493 | |
| 494 DEFUN ("interactive-p", Finteractive_p, Sinteractive_p, 0, 0, 0, | |
| 495 "Return t if function in which this appears was called interactively.\n\ | |
| 496 This means that the function was called with call-interactively (which\n\ | |
| 497 includes being called as the binding of a key)\n\ | |
| 498 and input is currently coming from the keyboard (not in keyboard macro).") | |
| 499 () | |
| 500 { | |
| 501 register struct backtrace *btp; | |
| 502 register Lisp_Object fun; | |
| 503 | |
| 504 if (!INTERACTIVE) | |
| 505 return Qnil; | |
| 506 | |
| 507 btp = backtrace_list; | |
| 727 | 508 |
| 509 /* If this isn't a byte-compiled function, there may be a frame at | |
| 510 the top for Finteractive_p itself. If so, skip it. */ | |
| 511 fun = Findirect_function (*btp->function); | |
|
9959
c942c7e6ebbd
(Finteractive_p): Use XSUBR instead of its expansion.
Karl Heuer <kwzh@gnu.org>
parents:
9306
diff
changeset
|
512 if (SUBRP (fun) && XSUBR (fun) == &Sinteractive_p) |
| 323 | 513 btp = btp->next; |
| 514 | |
| 727 | 515 /* If we're running an Emacs 18-style byte-compiled function, there |
| 516 may be a frame for Fbytecode. Now, given the strictest | |
| 517 definition, this function isn't really being called | |
| 518 interactively, but because that's the way Emacs 18 always builds | |
| 519 byte-compiled functions, we'll accept it for now. */ | |
| 520 if (EQ (*btp->function, Qbytecode)) | |
| 521 btp = btp->next; | |
| 522 | |
| 523 /* If this isn't a byte-compiled function, then we may now be | |
| 524 looking at several frames for special forms. Skip past them. */ | |
| 525 while (btp && | |
| 526 btp->nargs == UNEVALLED) | |
| 527 btp = btp->next; | |
| 528 | |
| 529 /* btp now points at the frame of the innermost function that isn't | |
| 530 a special form, ignoring frames for Finteractive_p and/or | |
| 531 Fbytecode at the top. If this frame is for a built-in function | |
| 532 (such as load or eval-region) return nil. */ | |
| 648 | 533 fun = Findirect_function (*btp->function); |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
534 if (SUBRP (fun)) |
| 272 | 535 return Qnil; |
| 536 /* btp points to the frame of a Lisp function that called interactive-p. | |
| 537 Return t if that function was called interactively. */ | |
| 538 if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively)) | |
| 539 return Qt; | |
| 540 return Qnil; | |
| 541 } | |
| 542 | |
| 543 DEFUN ("defun", Fdefun, Sdefun, 2, UNEVALLED, 0, | |
| 544 "(defun NAME ARGLIST [DOCSTRING] BODY...): define NAME as a function.\n\ | |
| 545 The definition is (lambda ARGLIST [DOCSTRING] BODY...).\n\ | |
| 546 See also the function `interactive'.") | |
| 547 (args) | |
| 548 Lisp_Object args; | |
| 549 { | |
| 550 register Lisp_Object fn_name; | |
| 551 register Lisp_Object defn; | |
| 552 | |
| 553 fn_name = Fcar (args); | |
| 554 defn = Fcons (Qlambda, Fcdr (args)); | |
| 485 | 555 if (!NILP (Vpurify_flag)) |
| 272 | 556 defn = Fpurecopy (defn); |
| 557 Ffset (fn_name, defn); | |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
558 LOADHIST_ATTACH (fn_name); |
| 272 | 559 return fn_name; |
| 560 } | |
| 561 | |
| 562 DEFUN ("defmacro", Fdefmacro, Sdefmacro, 2, UNEVALLED, 0, | |
| 563 "(defmacro NAME ARGLIST [DOCSTRING] BODY...): define NAME as a macro.\n\ | |
| 564 The definition is (macro lambda ARGLIST [DOCSTRING] BODY...).\n\ | |
| 565 When the macro is called, as in (NAME ARGS...),\n\ | |
| 566 the function (lambda ARGLIST BODY...) is applied to\n\ | |
| 567 the list ARGS... as it appears in the expression,\n\ | |
| 568 and the result should be a form to be evaluated instead of the original.") | |
| 569 (args) | |
| 570 Lisp_Object args; | |
| 571 { | |
| 572 register Lisp_Object fn_name; | |
| 573 register Lisp_Object defn; | |
| 574 | |
| 575 fn_name = Fcar (args); | |
| 576 defn = Fcons (Qmacro, Fcons (Qlambda, Fcdr (args))); | |
| 485 | 577 if (!NILP (Vpurify_flag)) |
| 272 | 578 defn = Fpurecopy (defn); |
| 579 Ffset (fn_name, defn); | |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
580 LOADHIST_ATTACH (fn_name); |
| 272 | 581 return fn_name; |
| 582 } | |
| 583 | |
| 584 DEFUN ("defvar", Fdefvar, Sdefvar, 1, UNEVALLED, 0, | |
| 585 "(defvar SYMBOL INITVALUE DOCSTRING): define SYMBOL as a variable.\n\ | |
| 586 You are not required to define a variable in order to use it,\n\ | |
| 587 but the definition can supply documentation and an initial value\n\ | |
| 588 in a way that tags can recognize.\n\n\ | |
| 589 INITVALUE is evaluated, and used to set SYMBOL, only if SYMBOL's value is void.\n\ | |
|
687
e2b747dd6a6e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
684
diff
changeset
|
590 If SYMBOL is buffer-local, its default value is what is set;\n\ |
|
e2b747dd6a6e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
684
diff
changeset
|
591 buffer-local values are not affected.\n\ |
| 272 | 592 INITVALUE and DOCSTRING are optional.\n\ |
| 593 If DOCSTRING starts with *, this variable is identified as a user option.\n\ | |
| 594 This means that M-x set-variable and M-x edit-options recognize it.\n\ | |
| 595 If INITVALUE is missing, SYMBOL's value is not set.") | |
| 596 (args) | |
| 597 Lisp_Object args; | |
| 598 { | |
|
10161
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
599 register Lisp_Object sym, tem, tail; |
| 272 | 600 |
| 601 sym = Fcar (args); | |
|
10161
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
602 tail = Fcdr (args); |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
603 if (!NILP (Fcdr (Fcdr (tail)))) |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
604 error ("too many arguments"); |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
605 |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
606 if (!NILP (tail)) |
| 272 | 607 { |
| 608 tem = Fdefault_boundp (sym); | |
| 485 | 609 if (NILP (tem)) |
| 272 | 610 Fset_default (sym, Feval (Fcar (Fcdr (args)))); |
| 611 } | |
|
10161
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
612 tail = Fcdr (Fcdr (args)); |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
613 if (!NILP (Fcar (tail))) |
| 272 | 614 { |
|
10201
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
615 tem = Fcar (tail); |
| 485 | 616 if (!NILP (Vpurify_flag)) |
| 272 | 617 tem = Fpurecopy (tem); |
| 618 Fput (sym, Qvariable_documentation, tem); | |
| 619 } | |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
620 LOADHIST_ATTACH (sym); |
| 272 | 621 return sym; |
| 622 } | |
| 623 | |
| 624 DEFUN ("defconst", Fdefconst, Sdefconst, 2, UNEVALLED, 0, | |
| 625 "(defconst SYMBOL INITVALUE DOCSTRING): define SYMBOL as a constant variable.\n\ | |
| 626 The intent is that programs do not change this value, but users may.\n\ | |
| 627 Always sets the value of SYMBOL to the result of evalling INITVALUE.\n\ | |
|
687
e2b747dd6a6e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
684
diff
changeset
|
628 If SYMBOL is buffer-local, its default value is what is set;\n\ |
|
e2b747dd6a6e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
684
diff
changeset
|
629 buffer-local values are not affected.\n\ |
| 272 | 630 DOCSTRING is optional.\n\ |
| 631 If DOCSTRING starts with *, this variable is identified as a user option.\n\ | |
| 632 This means that M-x set-variable and M-x edit-options recognize it.\n\n\ | |
| 633 Note: do not use `defconst' for user options in libraries that are not\n\ | |
| 634 normally loaded, since it is useful for users to be able to specify\n\ | |
| 635 their own values for such variables before loading the library.\n\ | |
| 636 Since `defconst' unconditionally assigns the variable,\n\ | |
| 637 it would override the user's choice.") | |
| 638 (args) | |
| 639 Lisp_Object args; | |
| 640 { | |
| 641 register Lisp_Object sym, tem; | |
| 642 | |
| 643 sym = Fcar (args); | |
|
10161
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
644 if (!NILP (Fcdr (Fcdr (Fcdr (args))))) |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
645 error ("too many arguments"); |
|
512a84fb3c75
(Fdefconst, Fdefvar): Error if too many arguments.
Richard M. Stallman <rms@gnu.org>
parents:
9959
diff
changeset
|
646 |
| 272 | 647 Fset_default (sym, Feval (Fcar (Fcdr (args)))); |
| 648 tem = Fcar (Fcdr (Fcdr (args))); | |
| 485 | 649 if (!NILP (tem)) |
| 272 | 650 { |
| 485 | 651 if (!NILP (Vpurify_flag)) |
| 272 | 652 tem = Fpurecopy (tem); |
| 653 Fput (sym, Qvariable_documentation, tem); | |
| 654 } | |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
655 LOADHIST_ATTACH (sym); |
| 272 | 656 return sym; |
| 657 } | |
| 658 | |
| 659 DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0, | |
| 660 "Returns t if VARIABLE is intended to be set and modified by users.\n\ | |
| 661 \(The alternative is a variable used internally in a Lisp program.)\n\ | |
| 662 Determined by whether the first character of the documentation\n\ | |
|
11251
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
663 for the variable is `*'.") |
| 272 | 664 (variable) |
| 665 Lisp_Object variable; | |
| 666 { | |
| 667 Lisp_Object documentation; | |
| 668 | |
|
17275
03f89f7e614e
(Fuser_variable_p): If not a symbol, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
17061
diff
changeset
|
669 if (!SYMBOLP (variable)) |
|
03f89f7e614e
(Fuser_variable_p): If not a symbol, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
17061
diff
changeset
|
670 return Qnil; |
|
03f89f7e614e
(Fuser_variable_p): If not a symbol, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
17061
diff
changeset
|
671 |
| 272 | 672 documentation = Fget (variable, Qvariable_documentation); |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
673 if (INTEGERP (documentation) && XINT (documentation) < 0) |
| 272 | 674 return Qt; |
|
11251
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
675 if (STRINGP (documentation) |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
676 && ((unsigned char) XSTRING (documentation)->data[0] == '*')) |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
677 return Qt; |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
678 /* If it is (STRING . INTEGER), a negative integer means a user variable. */ |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
679 if (CONSP (documentation) |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
680 && STRINGP (XCONS (documentation)->car) |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
681 && INTEGERP (XCONS (documentation)->cdr) |
|
f6bc91242185
(Fuser_variable_p): For (STRING . INTEGER), test sign.
Richard M. Stallman <rms@gnu.org>
parents:
11205
diff
changeset
|
682 && XINT (XCONS (documentation)->cdr) < 0) |
| 272 | 683 return Qt; |
| 684 return Qnil; | |
| 685 } | |
| 686 | |
| 687 DEFUN ("let*", FletX, SletX, 1, UNEVALLED, 0, | |
| 688 "(let* VARLIST BODY...): bind variables according to VARLIST then eval BODY.\n\ | |
| 689 The value of the last form in BODY is returned.\n\ | |
| 690 Each element of VARLIST is a symbol (which is bound to nil)\n\ | |
| 691 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\ | |
| 692 Each VALUEFORM can refer to the symbols already bound by this VARLIST.") | |
| 693 (args) | |
| 694 Lisp_Object args; | |
| 695 { | |
| 696 Lisp_Object varlist, val, elt; | |
| 697 int count = specpdl_ptr - specpdl; | |
| 698 struct gcpro gcpro1, gcpro2, gcpro3; | |
| 699 | |
| 700 GCPRO3 (args, elt, varlist); | |
| 701 | |
| 702 varlist = Fcar (args); | |
| 485 | 703 while (!NILP (varlist)) |
| 272 | 704 { |
| 705 QUIT; | |
| 706 elt = Fcar (varlist); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
707 if (SYMBOLP (elt)) |
| 272 | 708 specbind (elt, Qnil); |
| 604 | 709 else if (! NILP (Fcdr (Fcdr (elt)))) |
| 710 Fsignal (Qerror, | |
| 711 Fcons (build_string ("`let' bindings can have only one value-form"), | |
| 712 elt)); | |
| 272 | 713 else |
| 714 { | |
| 715 val = Feval (Fcar (Fcdr (elt))); | |
| 716 specbind (Fcar (elt), val); | |
| 717 } | |
| 718 varlist = Fcdr (varlist); | |
| 719 } | |
| 720 UNGCPRO; | |
| 721 val = Fprogn (Fcdr (args)); | |
| 722 return unbind_to (count, val); | |
| 723 } | |
| 724 | |
| 725 DEFUN ("let", Flet, Slet, 1, UNEVALLED, 0, | |
| 726 "(let VARLIST BODY...): bind variables according to VARLIST then eval BODY.\n\ | |
| 727 The value of the last form in BODY is returned.\n\ | |
| 728 Each element of VARLIST is a symbol (which is bound to nil)\n\ | |
| 729 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\ | |
| 730 All the VALUEFORMs are evalled before any symbols are bound.") | |
| 731 (args) | |
| 732 Lisp_Object args; | |
| 733 { | |
| 734 Lisp_Object *temps, tem; | |
| 735 register Lisp_Object elt, varlist; | |
| 736 int count = specpdl_ptr - specpdl; | |
| 737 register int argnum; | |
| 738 struct gcpro gcpro1, gcpro2; | |
| 739 | |
| 740 varlist = Fcar (args); | |
| 741 | |
| 742 /* Make space to hold the values to give the bound variables */ | |
| 743 elt = Flength (varlist); | |
| 744 temps = (Lisp_Object *) alloca (XFASTINT (elt) * sizeof (Lisp_Object)); | |
| 745 | |
| 746 /* Compute the values and store them in `temps' */ | |
| 747 | |
| 748 GCPRO2 (args, *temps); | |
| 749 gcpro2.nvars = 0; | |
| 750 | |
| 485 | 751 for (argnum = 0; !NILP (varlist); varlist = Fcdr (varlist)) |
| 272 | 752 { |
| 753 QUIT; | |
| 754 elt = Fcar (varlist); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
755 if (SYMBOLP (elt)) |
| 272 | 756 temps [argnum++] = Qnil; |
| 604 | 757 else if (! NILP (Fcdr (Fcdr (elt)))) |
| 758 Fsignal (Qerror, | |
| 759 Fcons (build_string ("`let' bindings can have only one value-form"), | |
| 760 elt)); | |
| 272 | 761 else |
| 762 temps [argnum++] = Feval (Fcar (Fcdr (elt))); | |
| 763 gcpro2.nvars = argnum; | |
| 764 } | |
| 765 UNGCPRO; | |
| 766 | |
| 767 varlist = Fcar (args); | |
| 485 | 768 for (argnum = 0; !NILP (varlist); varlist = Fcdr (varlist)) |
| 272 | 769 { |
| 770 elt = Fcar (varlist); | |
| 771 tem = temps[argnum++]; | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
772 if (SYMBOLP (elt)) |
| 272 | 773 specbind (elt, tem); |
| 774 else | |
| 775 specbind (Fcar (elt), tem); | |
| 776 } | |
| 777 | |
| 778 elt = Fprogn (Fcdr (args)); | |
| 779 return unbind_to (count, elt); | |
| 780 } | |
| 781 | |
| 782 DEFUN ("while", Fwhile, Swhile, 1, UNEVALLED, 0, | |
| 783 "(while TEST BODY...): if TEST yields non-nil, eval BODY... and repeat.\n\ | |
| 784 The order of execution is thus TEST, BODY, TEST, BODY and so on\n\ | |
| 785 until TEST returns nil.") | |
| 786 (args) | |
| 787 Lisp_Object args; | |
| 788 { | |
| 789 Lisp_Object test, body, tem; | |
| 790 struct gcpro gcpro1, gcpro2; | |
| 791 | |
| 792 GCPRO2 (test, body); | |
| 793 | |
| 794 test = Fcar (args); | |
| 795 body = Fcdr (args); | |
|
4167
f037b1f51320
(Fwhile): If mocklisp, test for nonzeroness.
Richard M. Stallman <rms@gnu.org>
parents:
3973
diff
changeset
|
796 while (tem = Feval (test), |
|
f037b1f51320
(Fwhile): If mocklisp, test for nonzeroness.
Richard M. Stallman <rms@gnu.org>
parents:
3973
diff
changeset
|
797 (!EQ (Vmocklisp_arguments, Qt) ? XINT (tem) : !NILP (tem))) |
| 272 | 798 { |
| 799 QUIT; | |
| 800 Fprogn (body); | |
| 801 } | |
| 802 | |
| 803 UNGCPRO; | |
| 804 return Qnil; | |
| 805 } | |
| 806 | |
| 807 DEFUN ("macroexpand", Fmacroexpand, Smacroexpand, 1, 2, 0, | |
| 808 "Return result of expanding macros at top level of FORM.\n\ | |
| 809 If FORM is not a macro call, it is returned unchanged.\n\ | |
| 810 Otherwise, the macro is expanded and the expansion is considered\n\ | |
| 811 in place of FORM. When a non-macro-call results, it is returned.\n\n\ | |
| 812 The second optional arg ENVIRONMENT species an environment of macro\n\ | |
| 813 definitions to shadow the loaded ones for use in file byte-compilation.") | |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
814 (form, environment) |
|
16113
df832a303ce5
(Fmacroexpand): Don't declare `form' as register.
Richard M. Stallman <rms@gnu.org>
parents:
16108
diff
changeset
|
815 Lisp_Object form; |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
816 Lisp_Object environment; |
| 272 | 817 { |
| 753 | 818 /* With cleanups from Hallvard Furuseth. */ |
| 272 | 819 register Lisp_Object expander, sym, def, tem; |
| 820 | |
| 821 while (1) | |
| 822 { | |
| 823 /* Come back here each time we expand a macro call, | |
| 824 in case it expands into another macro call. */ | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
825 if (!CONSP (form)) |
| 272 | 826 break; |
| 753 | 827 /* Set SYM, give DEF and TEM right values in case SYM is not a symbol. */ |
| 828 def = sym = XCONS (form)->car; | |
| 829 tem = Qnil; | |
| 272 | 830 /* Trace symbols aliases to other symbols |
| 831 until we get a symbol that is not an alias. */ | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
832 while (SYMBOLP (def)) |
| 272 | 833 { |
| 834 QUIT; | |
| 753 | 835 sym = def; |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
836 tem = Fassq (sym, environment); |
| 485 | 837 if (NILP (tem)) |
| 272 | 838 { |
| 839 def = XSYMBOL (sym)->function; | |
| 753 | 840 if (!EQ (def, Qunbound)) |
| 841 continue; | |
| 272 | 842 } |
| 753 | 843 break; |
| 272 | 844 } |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
845 /* Right now TEM is the result from SYM in ENVIRONMENT, |
| 272 | 846 and if TEM is nil then DEF is SYM's function definition. */ |
| 485 | 847 if (NILP (tem)) |
| 272 | 848 { |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
849 /* SYM is not mentioned in ENVIRONMENT. |
| 272 | 850 Look at its function definition. */ |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
851 if (EQ (def, Qunbound) || !CONSP (def)) |
| 272 | 852 /* Not defined or definition not suitable */ |
| 853 break; | |
| 854 if (EQ (XCONS (def)->car, Qautoload)) | |
| 855 { | |
| 856 /* Autoloading function: will it be a macro when loaded? */ | |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
857 tem = Fnth (make_number (4), def); |
|
5254
b38b74fe1722
(Fmacroexpand): For an autoload definition,
Richard M. Stallman <rms@gnu.org>
parents:
4782
diff
changeset
|
858 if (EQ (tem, Qt) || EQ (tem, Qmacro)) |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
859 /* Yes, load it and try again. */ |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
860 { |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
861 struct gcpro gcpro1; |
|
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
862 GCPRO1 (form); |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
863 do_autoload (def, sym); |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
864 UNGCPRO; |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
865 continue; |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
866 } |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
867 else |
| 272 | 868 break; |
| 869 } | |
| 870 else if (!EQ (XCONS (def)->car, Qmacro)) | |
| 871 break; | |
| 872 else expander = XCONS (def)->cdr; | |
| 873 } | |
| 874 else | |
| 875 { | |
| 876 expander = XCONS (tem)->cdr; | |
| 485 | 877 if (NILP (expander)) |
| 272 | 878 break; |
| 879 } | |
| 880 form = apply1 (expander, XCONS (form)->cdr); | |
| 881 } | |
| 882 return form; | |
| 883 } | |
| 884 | |
| 885 DEFUN ("catch", Fcatch, Scatch, 1, UNEVALLED, 0, | |
| 886 "(catch TAG BODY...): eval BODY allowing nonlocal exits using `throw'.\n\ | |
| 21589 | 887 TAG is evalled to get the tag to use; it must not be nil.\n\ |
| 888 \n\ | |
| 889 Then the BODY is executed.\n\ | |
| 272 | 890 Within BODY, (throw TAG) with same tag exits BODY and exits this `catch'.\n\ |
| 891 If no throw happens, `catch' returns the value of the last BODY form.\n\ | |
| 892 If a throw happens, it specifies the value to return from `catch'.") | |
| 893 (args) | |
| 894 Lisp_Object args; | |
| 895 { | |
| 896 register Lisp_Object tag; | |
| 897 struct gcpro gcpro1; | |
| 898 | |
| 899 GCPRO1 (args); | |
| 900 tag = Feval (Fcar (args)); | |
| 901 UNGCPRO; | |
| 902 return internal_catch (tag, Fprogn, Fcdr (args)); | |
| 903 } | |
| 904 | |
| 905 /* Set up a catch, then call C function FUNC on argument ARG. | |
| 906 FUNC should return a Lisp_Object. | |
| 907 This is how catches are done from within C code. */ | |
| 908 | |
| 909 Lisp_Object | |
| 910 internal_catch (tag, func, arg) | |
| 911 Lisp_Object tag; | |
| 912 Lisp_Object (*func) (); | |
| 913 Lisp_Object arg; | |
| 914 { | |
| 915 /* This structure is made part of the chain `catchlist'. */ | |
| 916 struct catchtag c; | |
| 917 | |
| 918 /* Fill in the components of c, and put it on the list. */ | |
| 919 c.next = catchlist; | |
| 920 c.tag = tag; | |
| 921 c.val = Qnil; | |
| 922 c.backlist = backtrace_list; | |
| 923 c.handlerlist = handlerlist; | |
| 924 c.lisp_eval_depth = lisp_eval_depth; | |
| 925 c.pdlcount = specpdl_ptr - specpdl; | |
| 926 c.poll_suppress_count = poll_suppress_count; | |
| 927 c.gcpro = gcprolist; | |
| 928 catchlist = &c; | |
| 929 | |
| 930 /* Call FUNC. */ | |
| 931 if (! _setjmp (c.jmp)) | |
| 932 c.val = (*func) (arg); | |
| 933 | |
| 934 /* Throw works by a longjmp that comes right here. */ | |
| 935 catchlist = c.next; | |
| 936 return c.val; | |
| 937 } | |
| 938 | |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
939 /* Unwind the specbind, catch, and handler stacks back to CATCH, and |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
940 jump to that CATCH, returning VALUE as the value of that catch. |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
941 |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
942 This is the guts Fthrow and Fsignal; they differ only in the way |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
943 they choose the catch tag to throw to. A catch tag for a |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
944 condition-case form has a TAG of Qnil. |
| 272 | 945 |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
946 Before each catch is discarded, unbind all special bindings and |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
947 execute all unwind-protect clauses made above that catch. Unwind |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
948 the handler stack as we go, so that the proper handlers are in |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
949 effect for each unwind-protect clause we run. At the end, restore |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
950 some static info saved in CATCH, and longjmp to the location |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
951 specified in the |
| 272 | 952 |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
953 This is used for correct unwinding in Fthrow and Fsignal. */ |
| 272 | 954 |
| 955 static void | |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
956 unwind_to_catch (catch, value) |
| 272 | 957 struct catchtag *catch; |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
958 Lisp_Object value; |
| 272 | 959 { |
| 960 register int last_time; | |
| 961 | |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
962 /* Save the value in the tag. */ |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
963 catch->val = value; |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
964 |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
965 /* Restore the polling-suppression count. */ |
|
4474
23d5b09bd218
(unwind_to_catch): Call set_poll_suppress_count.
Richard M. Stallman <rms@gnu.org>
parents:
4462
diff
changeset
|
966 set_poll_suppress_count (catch->poll_suppress_count); |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
967 |
| 272 | 968 do |
| 969 { | |
| 970 last_time = catchlist == catch; | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
971 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
972 /* Unwind the specpdl stack, and then restore the proper set of |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
973 handlers. */ |
| 272 | 974 unbind_to (catchlist->pdlcount, Qnil); |
| 975 handlerlist = catchlist->handlerlist; | |
| 976 catchlist = catchlist->next; | |
| 977 } | |
| 978 while (! last_time); | |
| 979 | |
| 980 gcprolist = catch->gcpro; | |
| 981 backtrace_list = catch->backlist; | |
| 982 lisp_eval_depth = catch->lisp_eval_depth; | |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
983 |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
984 _longjmp (catch->jmp, 1); |
| 272 | 985 } |
| 986 | |
| 987 DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0, | |
| 988 "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\ | |
| 989 Both TAG and VALUE are evalled.") | |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
990 (tag, value) |
|
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
991 register Lisp_Object tag, value; |
| 272 | 992 { |
| 993 register struct catchtag *c; | |
| 994 | |
| 995 while (1) | |
| 996 { | |
| 485 | 997 if (!NILP (tag)) |
| 272 | 998 for (c = catchlist; c; c = c->next) |
| 999 { | |
| 1000 if (EQ (c->tag, tag)) | |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
1001 unwind_to_catch (c, value); |
| 272 | 1002 } |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
1003 tag = Fsignal (Qno_catch, Fcons (tag, Fcons (value, Qnil))); |
| 272 | 1004 } |
| 1005 } | |
| 1006 | |
| 1007 | |
| 1008 DEFUN ("unwind-protect", Funwind_protect, Sunwind_protect, 1, UNEVALLED, 0, | |
| 1009 "Do BODYFORM, protecting with UNWINDFORMS.\n\ | |
| 1010 Usage looks like (unwind-protect BODYFORM UNWINDFORMS...).\n\ | |
| 1011 If BODYFORM completes normally, its value is returned\n\ | |
| 1012 after executing the UNWINDFORMS.\n\ | |
| 1013 If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.") | |
| 1014 (args) | |
| 1015 Lisp_Object args; | |
| 1016 { | |
| 1017 Lisp_Object val; | |
| 1018 int count = specpdl_ptr - specpdl; | |
| 1019 | |
| 1020 record_unwind_protect (0, Fcdr (args)); | |
| 1021 val = Feval (Fcar (args)); | |
| 1022 return unbind_to (count, val); | |
| 1023 } | |
| 1024 | |
| 1025 /* Chain of condition handlers currently in effect. | |
| 1026 The elements of this chain are contained in the stack frames | |
| 1027 of Fcondition_case and internal_condition_case. | |
| 1028 When an error is signaled (by calling Fsignal, below), | |
| 1029 this chain is searched for an element that applies. */ | |
| 1030 | |
| 1031 struct handler *handlerlist; | |
| 1032 | |
| 1033 DEFUN ("condition-case", Fcondition_case, Scondition_case, 2, UNEVALLED, 0, | |
| 1034 "Regain control when an error is signaled.\n\ | |
| 1035 Usage looks like (condition-case VAR BODYFORM HANDLERS...).\n\ | |
| 1036 executes BODYFORM and returns its value if no error happens.\n\ | |
| 1037 Each element of HANDLERS looks like (CONDITION-NAME BODY...)\n\ | |
| 1038 where the BODY is made of Lisp expressions.\n\n\ | |
| 1039 A handler is applicable to an error\n\ | |
| 1040 if CONDITION-NAME is one of the error's condition names.\n\ | |
| 1041 If an error happens, the first applicable handler is run.\n\ | |
| 1042 \n\ | |
|
5567
c61f49e4283a
(Fcondition_case): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
5566
diff
changeset
|
1043 The car of a handler may be a list of condition names\n\ |
|
c61f49e4283a
(Fcondition_case): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
5566
diff
changeset
|
1044 instead of a single condition name.\n\ |
|
c61f49e4283a
(Fcondition_case): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
5566
diff
changeset
|
1045 \n\ |
| 272 | 1046 When a handler handles an error,\n\ |
| 1047 control returns to the condition-case and the handler BODY... is executed\n\ | |
| 1048 with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).\n\ | |
| 1049 VAR may be nil; then you do not get access to the signal information.\n\ | |
| 1050 \n\ | |
| 1051 The value of the last BODY form is returned from the condition-case.\n\ | |
| 1052 See also the function `signal' for more info.") | |
| 1053 (args) | |
| 1054 Lisp_Object args; | |
| 1055 { | |
| 1056 Lisp_Object val; | |
| 1057 struct catchtag c; | |
| 1058 struct handler h; | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1059 register Lisp_Object var, bodyform, handlers; |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1060 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1061 var = Fcar (args); |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1062 bodyform = Fcar (Fcdr (args)); |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1063 handlers = Fcdr (Fcdr (args)); |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1064 CHECK_SYMBOL (var, 0); |
| 272 | 1065 |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1066 for (val = handlers; ! NILP (val); val = Fcdr (val)) |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1067 { |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1068 Lisp_Object tem; |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1069 tem = Fcar (val); |
|
5563
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1070 if (! (NILP (tem) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1071 || (CONSP (tem) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1072 && (SYMBOLP (XCONS (tem)->car) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1073 || CONSP (XCONS (tem)->car))))) |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1074 error ("Invalid condition handler", tem); |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1075 } |
| 272 | 1076 |
| 1077 c.tag = Qnil; | |
| 1078 c.val = Qnil; | |
| 1079 c.backlist = backtrace_list; | |
| 1080 c.handlerlist = handlerlist; | |
| 1081 c.lisp_eval_depth = lisp_eval_depth; | |
| 1082 c.pdlcount = specpdl_ptr - specpdl; | |
| 1083 c.poll_suppress_count = poll_suppress_count; | |
| 1084 c.gcpro = gcprolist; | |
| 1085 if (_setjmp (c.jmp)) | |
| 1086 { | |
| 485 | 1087 if (!NILP (h.var)) |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1088 specbind (h.var, c.val); |
|
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1089 val = Fprogn (Fcdr (h.chosen_clause)); |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1090 |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1091 /* Note that this just undoes the binding of h.var; whoever |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1092 longjumped to us unwound the stack to c.pdlcount before |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1093 throwing. */ |
| 272 | 1094 unbind_to (c.pdlcount, Qnil); |
| 1095 return val; | |
| 1096 } | |
| 1097 c.next = catchlist; | |
| 1098 catchlist = &c; | |
| 1099 | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1100 h.var = var; |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1101 h.handler = handlers; |
| 272 | 1102 h.next = handlerlist; |
| 1103 h.tag = &c; | |
| 1104 handlerlist = &h; | |
| 1105 | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1106 val = Feval (bodyform); |
| 272 | 1107 catchlist = c.next; |
| 1108 handlerlist = h.next; | |
| 1109 return val; | |
| 1110 } | |
| 1111 | |
|
14218
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1112 /* Call the function BFUN with no arguments, catching errors within it |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1113 according to HANDLERS. If there is an error, call HFUN with |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1114 one argument which is the data that describes the error: |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1115 (SIGNALNAME . DATA) |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1116 |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1117 HANDLERS can be a list of conditions to catch. |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1118 If HANDLERS is Qt, catch all errors. |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1119 If HANDLERS is Qerror, catch all errors |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1120 but allow the debugger to run if that is enabled. */ |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1121 |
| 272 | 1122 Lisp_Object |
| 1123 internal_condition_case (bfun, handlers, hfun) | |
| 1124 Lisp_Object (*bfun) (); | |
| 1125 Lisp_Object handlers; | |
| 1126 Lisp_Object (*hfun) (); | |
| 1127 { | |
| 1128 Lisp_Object val; | |
| 1129 struct catchtag c; | |
| 1130 struct handler h; | |
| 1131 | |
|
11365
1e2290c04cce
(internal_condition_case): Abort if interrupt_input_blocked>0.
Richard M. Stallman <rms@gnu.org>
parents:
11251
diff
changeset
|
1132 /* Since Fsignal resets this to 0, it had better be 0 now |
|
1e2290c04cce
(internal_condition_case): Abort if interrupt_input_blocked>0.
Richard M. Stallman <rms@gnu.org>
parents:
11251
diff
changeset
|
1133 or else we have a potential bug. */ |
|
1e2290c04cce
(internal_condition_case): Abort if interrupt_input_blocked>0.
Richard M. Stallman <rms@gnu.org>
parents:
11251
diff
changeset
|
1134 if (interrupt_input_blocked != 0) |
|
1e2290c04cce
(internal_condition_case): Abort if interrupt_input_blocked>0.
Richard M. Stallman <rms@gnu.org>
parents:
11251
diff
changeset
|
1135 abort (); |
|
1e2290c04cce
(internal_condition_case): Abort if interrupt_input_blocked>0.
Richard M. Stallman <rms@gnu.org>
parents:
11251
diff
changeset
|
1136 |
| 272 | 1137 c.tag = Qnil; |
| 1138 c.val = Qnil; | |
| 1139 c.backlist = backtrace_list; | |
| 1140 c.handlerlist = handlerlist; | |
| 1141 c.lisp_eval_depth = lisp_eval_depth; | |
| 1142 c.pdlcount = specpdl_ptr - specpdl; | |
| 1143 c.poll_suppress_count = poll_suppress_count; | |
| 1144 c.gcpro = gcprolist; | |
| 1145 if (_setjmp (c.jmp)) | |
| 1146 { | |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1147 return (*hfun) (c.val); |
| 272 | 1148 } |
| 1149 c.next = catchlist; | |
| 1150 catchlist = &c; | |
| 1151 h.handler = handlers; | |
| 1152 h.var = Qnil; | |
| 1153 h.next = handlerlist; | |
| 1154 h.tag = &c; | |
| 1155 handlerlist = &h; | |
| 1156 | |
| 1157 val = (*bfun) (); | |
| 1158 catchlist = c.next; | |
| 1159 handlerlist = h.next; | |
| 1160 return val; | |
| 1161 } | |
| 1162 | |
|
14218
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1163 /* Like internal_condition_case but call HFUN with ARG as its argument. */ |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1164 |
|
5807
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1165 Lisp_Object |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1166 internal_condition_case_1 (bfun, arg, handlers, hfun) |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1167 Lisp_Object (*bfun) (); |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1168 Lisp_Object arg; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1169 Lisp_Object handlers; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1170 Lisp_Object (*hfun) (); |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1171 { |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1172 Lisp_Object val; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1173 struct catchtag c; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1174 struct handler h; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1175 |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1176 c.tag = Qnil; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1177 c.val = Qnil; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1178 c.backlist = backtrace_list; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1179 c.handlerlist = handlerlist; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1180 c.lisp_eval_depth = lisp_eval_depth; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1181 c.pdlcount = specpdl_ptr - specpdl; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1182 c.poll_suppress_count = poll_suppress_count; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1183 c.gcpro = gcprolist; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1184 if (_setjmp (c.jmp)) |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1185 { |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1186 return (*hfun) (c.val); |
|
5807
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1187 } |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1188 c.next = catchlist; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1189 catchlist = &c; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1190 h.handler = handlers; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1191 h.var = Qnil; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1192 h.next = handlerlist; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1193 h.tag = &c; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1194 handlerlist = &h; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1195 |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1196 val = (*bfun) (arg); |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1197 catchlist = c.next; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1198 handlerlist = h.next; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1199 return val; |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1200 } |
|
cc9d9ab24008
(internal_condition_case_1): New function.
Richard M. Stallman <rms@gnu.org>
parents:
5567
diff
changeset
|
1201 |
| 272 | 1202 static Lisp_Object find_handler_clause (); |
| 1203 | |
| 1204 DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, | |
|
5566
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1205 "Signal an error. Args are ERROR-SYMBOL and associated DATA.\n\ |
| 272 | 1206 This function does not return.\n\n\ |
|
5566
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1207 An error symbol is a symbol with an `error-conditions' property\n\ |
| 272 | 1208 that is a list of condition names.\n\ |
| 1209 A handler for any of those names will get to handle this signal.\n\ | |
| 1210 The symbol `error' should normally be one of them.\n\ | |
| 1211 \n\ | |
| 1212 DATA should be a list. Its elements are printed as part of the error message.\n\ | |
| 1213 If the signal is handled, DATA is made available to the handler.\n\ | |
| 1214 See also the function `condition-case'.") | |
|
5566
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1215 (error_symbol, data) |
|
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1216 Lisp_Object error_symbol, data; |
| 272 | 1217 { |
| 1218 register struct handler *allhandlers = handlerlist; | |
| 1219 Lisp_Object conditions; | |
| 1220 extern int gc_in_progress; | |
| 1221 extern int waiting_for_input; | |
| 1222 Lisp_Object debugger_value; | |
|
16895
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1223 Lisp_Object string; |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1224 Lisp_Object real_error_symbol; |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1225 Lisp_Object combined_data; |
| 272 | 1226 |
| 1227 quit_error_check (); | |
| 1228 immediate_quit = 0; | |
| 1229 if (gc_in_progress || waiting_for_input) | |
| 1230 abort (); | |
| 1231 | |
| 1232 TOTALLY_UNBLOCK_INPUT; | |
| 1233 | |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1234 if (NILP (error_symbol)) |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1235 real_error_symbol = Fcar (data); |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1236 else |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1237 real_error_symbol = error_symbol; |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1238 |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1239 /* This hook is used by edebug. */ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1240 if (! NILP (Vsignal_hook_function)) |
|
18018
2a11f1e4bd6b
(Fsignal): Use call2 to call Vsignal_hook_function.
Richard M. Stallman <rms@gnu.org>
parents:
17872
diff
changeset
|
1241 call2 (Vsignal_hook_function, error_symbol, data); |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1242 |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1243 conditions = Fget (real_error_symbol, Qerror_conditions); |
| 272 | 1244 |
| 1245 for (; handlerlist; handlerlist = handlerlist->next) | |
| 1246 { | |
| 1247 register Lisp_Object clause; | |
| 1248 clause = find_handler_clause (handlerlist->handler, conditions, | |
|
5566
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1249 error_symbol, data, &debugger_value); |
| 272 | 1250 |
| 1251 #if 0 /* Most callers are not prepared to handle gc if this returns. | |
| 1252 So, since this feature is not very useful, take it out. */ | |
| 1253 /* If have called debugger and user wants to continue, | |
| 1254 just return nil. */ | |
| 1255 if (EQ (clause, Qlambda)) | |
| 1256 return debugger_value; | |
| 1257 #else | |
| 1258 if (EQ (clause, Qlambda)) | |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1259 { |
|
13945
6a653c300631
(syms_of_eval): Doc fix for inhibit-quit.
Karl Heuer <kwzh@gnu.org>
parents:
13768
diff
changeset
|
1260 /* We can't return values to code which signaled an error, but we |
|
6a653c300631
(syms_of_eval): Doc fix for inhibit-quit.
Karl Heuer <kwzh@gnu.org>
parents:
13768
diff
changeset
|
1261 can continue code which has signaled a quit. */ |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1262 if (EQ (real_error_symbol, Qquit)) |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1263 return Qnil; |
|
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1264 else |
|
3973
ab06b106c490
(Fsignal): Clarify error message.
Richard M. Stallman <rms@gnu.org>
parents:
3703
diff
changeset
|
1265 error ("Cannot return from the debugger in an error"); |
|
1196
65e2edefe748
* eval.c (Fcondition_case): Rearranged for clarity. Don't worry
Jim Blandy <jimb@redhat.com>
parents:
940
diff
changeset
|
1266 } |
| 272 | 1267 #endif |
| 1268 | |
| 485 | 1269 if (!NILP (clause)) |
| 272 | 1270 { |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1271 Lisp_Object unwind_data; |
| 272 | 1272 struct handler *h = handlerlist; |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1273 |
| 272 | 1274 handlerlist = allhandlers; |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1275 |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1276 if (NILP (error_symbol)) |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1277 unwind_data = data; |
|
6132
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1278 else |
|
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1279 unwind_data = Fcons (error_symbol, data); |
|
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1280 h->chosen_clause = clause; |
|
ddf57829cf03
(Fsignal): If DATA is memory_signal_data, don't add to it.
Richard M. Stallman <rms@gnu.org>
parents:
5807
diff
changeset
|
1281 unwind_to_catch (h->tag, unwind_data); |
| 272 | 1282 } |
| 1283 } | |
| 1284 | |
| 1285 handlerlist = allhandlers; | |
| 1286 /* If no handler is present now, try to run the debugger, | |
| 1287 and if that fails, throw to top level. */ | |
|
5566
e2925466c923
(Fsignal): Rename 1st arg to error_symbol.
Richard M. Stallman <rms@gnu.org>
parents:
5563
diff
changeset
|
1288 find_handler_clause (Qerror, conditions, error_symbol, data, &debugger_value); |
|
16895
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1289 if (catchlist != 0) |
|
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1290 Fthrow (Qtop_level, Qt); |
|
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1291 |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1292 if (! NILP (error_symbol)) |
|
16895
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1293 data = Fcons (error_symbol, data); |
|
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1294 |
|
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1295 string = Ferror_message_string (data); |
|
32945f27ed20
(Fsignal): Call fatal if no error handlers and no catch.
Richard M. Stallman <rms@gnu.org>
parents:
16485
diff
changeset
|
1296 fatal (XSTRING (string)->data, 0, 0); |
| 272 | 1297 } |
| 1298 | |
| 684 | 1299 /* Return nonzero iff LIST is a non-nil atom or |
| 1300 a list containing one of CONDITIONS. */ | |
| 1301 | |
| 1302 static int | |
| 1303 wants_debugger (list, conditions) | |
| 1304 Lisp_Object list, conditions; | |
| 1305 { | |
|
706
86cb5db0b6c3
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
687
diff
changeset
|
1306 if (NILP (list)) |
| 684 | 1307 return 0; |
| 1308 if (! CONSP (list)) | |
| 1309 return 1; | |
| 1310 | |
|
878
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1311 while (CONSP (conditions)) |
| 684 | 1312 { |
|
878
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1313 Lisp_Object this, tail; |
|
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1314 this = XCONS (conditions)->car; |
|
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1315 for (tail = list; CONSP (tail); tail = XCONS (tail)->cdr) |
|
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1316 if (EQ (XCONS (tail)->car, this)) |
| 684 | 1317 return 1; |
| 1318 conditions = XCONS (conditions)->cdr; | |
| 1319 } | |
|
878
5b1c5b4286e7
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
863
diff
changeset
|
1320 return 0; |
| 684 | 1321 } |
| 1322 | |
| 13768 | 1323 /* Return 1 if an error with condition-symbols CONDITIONS, |
| 1324 and described by SIGNAL-DATA, should skip the debugger | |
| 1325 according to debugger-ignore-errors. */ | |
| 1326 | |
| 1327 static int | |
| 1328 skip_debugger (conditions, data) | |
| 1329 Lisp_Object conditions, data; | |
| 1330 { | |
| 1331 Lisp_Object tail; | |
| 1332 int first_string = 1; | |
| 1333 Lisp_Object error_message; | |
| 1334 | |
| 1335 for (tail = Vdebug_ignored_errors; CONSP (tail); | |
| 1336 tail = XCONS (tail)->cdr) | |
| 1337 { | |
| 1338 if (STRINGP (XCONS (tail)->car)) | |
| 1339 { | |
| 1340 if (first_string) | |
| 1341 { | |
| 1342 error_message = Ferror_message_string (data); | |
| 1343 first_string = 0; | |
| 1344 } | |
| 1345 if (fast_string_match (XCONS (tail)->car, error_message) >= 0) | |
| 1346 return 1; | |
| 1347 } | |
| 1348 else | |
| 1349 { | |
| 1350 Lisp_Object contail; | |
| 1351 | |
| 1352 for (contail = conditions; CONSP (contail); | |
| 1353 contail = XCONS (contail)->cdr) | |
| 1354 if (EQ (XCONS (tail)->car, XCONS (contail)->car)) | |
| 1355 return 1; | |
| 1356 } | |
| 1357 } | |
| 1358 | |
| 1359 return 0; | |
| 1360 } | |
| 1361 | |
| 684 | 1362 /* Value of Qlambda means we have called debugger and user has continued. |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1363 There are two ways to pass SIG and DATA: |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1364 - SIG is the error symbol, and DATA is the rest of the data. |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1365 = SIG is nil, and DATA is (SYMBOL . REST-OF-DATA). |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1366 |
| 684 | 1367 Store value returned from debugger into *DEBUGGER_VALUE_PTR. */ |
| 272 | 1368 |
| 1369 static Lisp_Object | |
| 1370 find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr) | |
| 1371 Lisp_Object handlers, conditions, sig, data; | |
| 1372 Lisp_Object *debugger_value_ptr; | |
| 1373 { | |
| 1374 register Lisp_Object h; | |
| 1375 register Lisp_Object tem; | |
| 1376 | |
| 1377 if (EQ (handlers, Qt)) /* t is used by handlers for all conditions, set up by C code. */ | |
| 1378 return Qt; | |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1379 /* error is used similarly, but means print an error message |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1380 and run the debugger if that is enabled. */ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1381 if (EQ (handlers, Qerror) |
|
16443
0128b923d281
(Vdebug_on_signal): Renamed from Vdebug_force.
Richard M. Stallman <rms@gnu.org>
parents:
16355
diff
changeset
|
1382 || !NILP (Vdebug_on_signal)) /* This says call debugger even if |
|
0128b923d281
(Vdebug_on_signal): Renamed from Vdebug_force.
Richard M. Stallman <rms@gnu.org>
parents:
16355
diff
changeset
|
1383 there is a handler. */ |
| 272 | 1384 { |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1385 int count = specpdl_ptr - specpdl; |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1386 int debugger_called = 0; |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1387 Lisp_Object sig_symbol, combined_data; |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1388 |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1389 if (NILP (sig)) |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1390 { |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1391 combined_data = data; |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1392 sig_symbol = Fcar (data); |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1393 } |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1394 else |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1395 { |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1396 combined_data = Fcons (sig, data); |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1397 sig_symbol = sig; |
|
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1398 } |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1399 |
| 684 | 1400 if (wants_debugger (Vstack_trace_on_error, conditions)) |
|
21853
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1401 { |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1402 #ifdef __STDC__ |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1403 internal_with_output_to_temp_buffer ("*Backtrace*", |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1404 (Lisp_Object (*) (Lisp_Object)) Fbacktrace, |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1405 Qnil); |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1406 #else |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1407 internal_with_output_to_temp_buffer ("*Backtrace*", |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1408 Fbacktrace, Qnil); |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1409 #endif |
|
6e93713b7d30
(find_handler_clause): Cast Fbacktrace to proper type.
Richard M. Stallman <rms@gnu.org>
parents:
21699
diff
changeset
|
1410 } |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1411 if ((EQ (sig_symbol, Qquit) |
|
1199
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
1412 ? debug_on_quit |
|
ab2d88e2505b
* eval.c (unbind_catch): Do the long-jump here. Take a VALUE
Jim Blandy <jimb@redhat.com>
parents:
1196
diff
changeset
|
1413 : wants_debugger (Vdebug_on_error, conditions)) |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1414 && ! skip_debugger (conditions, combined_data) |
|
17872
31b2c6763574
(num_nonmacro_input_events):
Richard M. Stallman <rms@gnu.org>
parents:
17275
diff
changeset
|
1415 && when_entered_debugger < num_nonmacro_input_events) |
| 272 | 1416 { |
| 1417 specbind (Qdebug_on_error, Qnil); | |
| 13768 | 1418 *debugger_value_ptr |
| 1419 = call_debugger (Fcons (Qerror, | |
|
18636
b3f3cd32fa70
(Fsignal, find_handler_clause): If ERROR_SYMBOL
Richard M. Stallman <rms@gnu.org>
parents:
18018
diff
changeset
|
1420 Fcons (combined_data, Qnil))); |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1421 debugger_called = 1; |
| 272 | 1422 } |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1423 /* If there is no handler, return saying whether we ran the debugger. */ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1424 if (EQ (handlers, Qerror)) |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1425 { |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1426 if (debugger_called) |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1427 return unbind_to (count, Qlambda); |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1428 return Qt; |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
1429 } |
| 272 | 1430 } |
| 1431 for (h = handlers; CONSP (h); h = Fcdr (h)) | |
| 1432 { | |
|
5563
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1433 Lisp_Object handler, condit; |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1434 |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1435 handler = Fcar (h); |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1436 if (!CONSP (handler)) |
| 272 | 1437 continue; |
|
5563
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1438 condit = Fcar (handler); |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1439 /* Handle a single condition name in handler HANDLER. */ |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1440 if (SYMBOLP (condit)) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1441 { |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1442 tem = Fmemq (Fcar (handler), conditions); |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1443 if (!NILP (tem)) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1444 return handler; |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1445 } |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1446 /* Handle a list of condition names in handler HANDLER. */ |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1447 else if (CONSP (condit)) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1448 { |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1449 while (CONSP (condit)) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1450 { |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1451 tem = Fmemq (Fcar (condit), conditions); |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1452 if (!NILP (tem)) |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1453 return handler; |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1454 condit = XCONS (condit)->cdr; |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1455 } |
|
50ada322de3e
(Fcondition_case): Allow a list of condition names in a handler.
Richard M. Stallman <rms@gnu.org>
parents:
5254
diff
changeset
|
1456 } |
| 272 | 1457 } |
| 1458 return Qnil; | |
| 1459 } | |
| 1460 | |
| 1461 /* dump an error message; called like printf */ | |
| 1462 | |
| 1463 /* VARARGS 1 */ | |
| 1464 void | |
| 1465 error (m, a1, a2, a3) | |
| 1466 char *m; | |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1467 char *a1, *a2, *a3; |
| 272 | 1468 { |
| 1469 char buf[200]; | |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1470 int size = 200; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1471 int mlen; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1472 char *buffer = buf; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1473 char *args[3]; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1474 int allocated = 0; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1475 Lisp_Object string; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1476 |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1477 args[0] = a1; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1478 args[1] = a2; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1479 args[2] = a3; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1480 |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1481 mlen = strlen (m); |
| 272 | 1482 |
| 1483 while (1) | |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1484 { |
|
23206
a9090a71e969
(error): After enlarging buffer, write to it, not to buf.
Karl Heuer <kwzh@gnu.org>
parents:
21853
diff
changeset
|
1485 int used = doprnt (buffer, size, m, m + mlen, 3, args); |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1486 if (used < size) |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1487 break; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1488 size *= 2; |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1489 if (allocated) |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1490 buffer = (char *) xrealloc (buffer, size); |
|
7353
334cececa42d
(error): Fix logic in call to xmalloc/xrealloc.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1491 else |
|
334cececa42d
(error): Fix logic in call to xmalloc/xrealloc.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1492 { |
|
334cececa42d
(error): Fix logic in call to xmalloc/xrealloc.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1493 buffer = (char *) xmalloc (size); |
|
334cececa42d
(error): Fix logic in call to xmalloc/xrealloc.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1494 allocated = 1; |
|
334cececa42d
(error): Fix logic in call to xmalloc/xrealloc.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1495 } |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1496 } |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1497 |
|
23206
a9090a71e969
(error): After enlarging buffer, write to it, not to buf.
Karl Heuer <kwzh@gnu.org>
parents:
21853
diff
changeset
|
1498 string = build_string (buffer); |
|
6225
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1499 if (allocated) |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1500 free (buffer); |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1501 |
|
8f92cf89ed7c
(error): Use doprnt. Make buffer larger as necessary.
Richard M. Stallman <rms@gnu.org>
parents:
6132
diff
changeset
|
1502 Fsignal (Qerror, Fcons (string, Qnil)); |
| 272 | 1503 } |
| 1504 | |
| 1505 DEFUN ("commandp", Fcommandp, Scommandp, 1, 1, 0, | |
| 1506 "T if FUNCTION makes provisions for interactive calling.\n\ | |
| 1507 This means it contains a description for how to read arguments to give it.\n\ | |
| 1508 The value is nil for an invalid function or a symbol with no function\n\ | |
| 1509 definition.\n\ | |
| 1510 \n\ | |
| 1511 Interactively callable functions include strings and vectors (treated\n\ | |
| 1512 as keyboard macros), lambda-expressions that contain a top-level call\n\ | |
| 1513 to `interactive', autoload definitions made by `autoload' with non-nil\n\ | |
| 1514 fourth argument, and some of the built-in functions of Lisp.\n\ | |
| 1515 \n\ | |
| 1516 Also, a symbol satisfies `commandp' if its function definition does so.") | |
| 1517 (function) | |
| 1518 Lisp_Object function; | |
| 1519 { | |
| 1520 register Lisp_Object fun; | |
| 1521 register Lisp_Object funcar; | |
| 1522 register Lisp_Object tem; | |
| 1523 register int i = 0; | |
| 1524 | |
| 1525 fun = function; | |
| 1526 | |
| 648 | 1527 fun = indirect_function (fun); |
| 1528 if (EQ (fun, Qunbound)) | |
| 1529 return Qnil; | |
| 272 | 1530 |
| 1531 /* Emacs primitives are interactive if their DEFUN specifies an | |
| 1532 interactive spec. */ | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1533 if (SUBRP (fun)) |
| 272 | 1534 { |
| 1535 if (XSUBR (fun)->prompt) | |
| 1536 return Qt; | |
| 1537 else | |
| 1538 return Qnil; | |
| 1539 } | |
| 1540 | |
| 1541 /* Bytecode objects are interactive if they are long enough to | |
| 1542 have an element whose index is COMPILED_INTERACTIVE, which is | |
| 1543 where the interactive spec is stored. */ | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1544 else if (COMPILEDP (fun)) |
| 10345 | 1545 return ((XVECTOR (fun)->size & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE |
| 272 | 1546 ? Qt : Qnil); |
| 1547 | |
| 1548 /* Strings and vectors are keyboard macros. */ | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1549 if (STRINGP (fun) || VECTORP (fun)) |
| 272 | 1550 return Qt; |
| 1551 | |
| 1552 /* Lists may represent commands. */ | |
| 1553 if (!CONSP (fun)) | |
| 1554 return Qnil; | |
| 1555 funcar = Fcar (fun); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1556 if (!SYMBOLP (funcar)) |
| 272 | 1557 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); |
| 1558 if (EQ (funcar, Qlambda)) | |
| 1559 return Fassq (Qinteractive, Fcdr (Fcdr (fun))); | |
| 1560 if (EQ (funcar, Qmocklisp)) | |
| 1561 return Qt; /* All mocklisp functions can be called interactively */ | |
| 1562 if (EQ (funcar, Qautoload)) | |
| 1563 return Fcar (Fcdr (Fcdr (Fcdr (fun)))); | |
| 1564 else | |
| 1565 return Qnil; | |
| 1566 } | |
| 1567 | |
| 1568 /* ARGSUSED */ | |
| 1569 DEFUN ("autoload", Fautoload, Sautoload, 2, 5, 0, | |
| 1570 "Define FUNCTION to autoload from FILE.\n\ | |
| 1571 FUNCTION is a symbol; FILE is a file name string to pass to `load'.\n\ | |
| 1572 Third arg DOCSTRING is documentation for the function.\n\ | |
| 1573 Fourth arg INTERACTIVE if non-nil says function can be called interactively.\n\ | |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1574 Fifth arg TYPE indicates the type of the object:\n\ |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1575 nil or omitted says FUNCTION is a function,\n\ |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1576 `keymap' says FUNCTION is really a keymap, and\n\ |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1577 `macro' or t says FUNCTION is really a macro.\n\ |
| 272 | 1578 Third through fifth args give info about the real definition.\n\ |
| 1579 They default to nil.\n\ | |
| 1580 If FUNCTION is already defined other than as an autoload,\n\ | |
| 1581 this does nothing and returns nil.") | |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1582 (function, file, docstring, interactive, type) |
|
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1583 Lisp_Object function, file, docstring, interactive, type; |
| 272 | 1584 { |
| 1585 #ifdef NO_ARG_ARRAY | |
| 1586 Lisp_Object args[4]; | |
| 1587 #endif | |
| 1588 | |
| 1589 CHECK_SYMBOL (function, 0); | |
| 1590 CHECK_STRING (file, 1); | |
| 1591 | |
| 1592 /* If function is defined and not as an autoload, don't override */ | |
| 1593 if (!EQ (XSYMBOL (function)->function, Qunbound) | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1594 && !(CONSP (XSYMBOL (function)->function) |
| 272 | 1595 && EQ (XCONS (XSYMBOL (function)->function)->car, Qautoload))) |
| 1596 return Qnil; | |
| 1597 | |
| 1598 #ifdef NO_ARG_ARRAY | |
| 1599 args[0] = file; | |
| 1600 args[1] = docstring; | |
| 1601 args[2] = interactive; | |
|
1564
b327816041d1
* eval.c (Fautoload): Renamed fifth argument TYPE. Document the
Jim Blandy <jimb@redhat.com>
parents:
1452
diff
changeset
|
1602 args[3] = type; |
| 272 | 1603 |
| 1604 return Ffset (function, Fcons (Qautoload, Flist (4, &args[0]))); | |
| 1605 #else /* NO_ARG_ARRAY */ | |
| 1606 return Ffset (function, Fcons (Qautoload, Flist (4, &file))); | |
| 1607 #endif /* not NO_ARG_ARRAY */ | |
| 1608 } | |
| 1609 | |
| 1610 Lisp_Object | |
| 1611 un_autoload (oldqueue) | |
| 1612 Lisp_Object oldqueue; | |
| 1613 { | |
| 1614 register Lisp_Object queue, first, second; | |
| 1615 | |
| 1616 /* Queue to unwind is current value of Vautoload_queue. | |
| 1617 oldqueue is the shadowed value to leave in Vautoload_queue. */ | |
| 1618 queue = Vautoload_queue; | |
| 1619 Vautoload_queue = oldqueue; | |
| 1620 while (CONSP (queue)) | |
| 1621 { | |
| 1622 first = Fcar (queue); | |
| 1623 second = Fcdr (first); | |
| 1624 first = Fcar (first); | |
| 1625 if (EQ (second, Qnil)) | |
| 1626 Vfeatures = first; | |
| 1627 else | |
| 1628 Ffset (first, second); | |
| 1629 queue = Fcdr (queue); | |
| 1630 } | |
| 1631 return Qnil; | |
| 1632 } | |
| 1633 | |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1634 /* Load an autoloaded function. |
|
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1635 FUNNAME is the symbol which is the function's name. |
|
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1636 FUNDEF is the autoload definition (a list). */ |
|
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1637 |
|
20378
cf1b52f5c34a
(do_autoload): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20312
diff
changeset
|
1638 void |
| 272 | 1639 do_autoload (fundef, funname) |
| 1640 Lisp_Object fundef, funname; | |
| 1641 { | |
| 1642 int count = specpdl_ptr - specpdl; | |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1643 Lisp_Object fun, val, queue, first, second; |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1644 struct gcpro gcpro1, gcpro2, gcpro3; |
| 272 | 1645 |
| 1646 fun = funname; | |
| 1647 CHECK_SYMBOL (funname, 0); | |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1648 GCPRO3 (fun, funname, fundef); |
| 272 | 1649 |
| 1650 /* Value saved here is to be restored into Vautoload_queue */ | |
| 1651 record_unwind_protect (un_autoload, Vautoload_queue); | |
| 1652 Vautoload_queue = Qt; | |
|
19237
42cc2b7bc6c6
(do_autoload): Require a suffix for the file.
Richard M. Stallman <rms@gnu.org>
parents:
19116
diff
changeset
|
1653 Fload (Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil, Qt); |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1654 |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1655 /* Save the old autoloads, in case we ever do an unload. */ |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1656 queue = Vautoload_queue; |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1657 while (CONSP (queue)) |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1658 { |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1659 first = Fcar (queue); |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1660 second = Fcdr (first); |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1661 first = Fcar (first); |
|
2599
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1662 |
|
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1663 /* Note: This test is subtle. The cdr of an autoload-queue entry |
|
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1664 may be an atom if the autoload entry was generated by a defalias |
|
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1665 or fset. */ |
|
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1666 if (CONSP (second)) |
| 4782 | 1667 Fput (first, Qautoload, (Fcdr (second))); |
|
2599
5122736c0a03
(do_autoload): Fixed the bug in the autoload-saving code.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2596
diff
changeset
|
1668 |
|
2547
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1669 queue = Fcdr (queue); |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1670 } |
|
c73c68a87cd5
(defun, defmacro, defvar, defconst):
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
1671 |
| 272 | 1672 /* Once loading finishes, don't undo it. */ |
| 1673 Vautoload_queue = Qt; | |
| 1674 unbind_to (count, Qnil); | |
| 1675 | |
| 648 | 1676 fun = Findirect_function (fun); |
| 1677 | |
|
4462
9fbc6c74cab5
(do_autoload): Don't report autoload failure
Richard M. Stallman <rms@gnu.org>
parents:
4167
diff
changeset
|
1678 if (!NILP (Fequal (fun, fundef))) |
| 272 | 1679 error ("Autoloading failed to define function %s", |
| 1680 XSYMBOL (funname)->name->data); | |
|
16108
2c9c0c867e00
(Fmacroexpand): gcpro form while calling do_autoload.
Richard M. Stallman <rms@gnu.org>
parents:
15275
diff
changeset
|
1681 UNGCPRO; |
| 272 | 1682 } |
| 1683 | |
| 1684 DEFUN ("eval", Feval, Seval, 1, 1, 0, | |
| 1685 "Evaluate FORM and return its value.") | |
| 1686 (form) | |
| 1687 Lisp_Object form; | |
| 1688 { | |
| 1689 Lisp_Object fun, val, original_fun, original_args; | |
| 1690 Lisp_Object funcar; | |
| 1691 struct backtrace backtrace; | |
| 1692 struct gcpro gcpro1, gcpro2, gcpro3; | |
| 1693 | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1694 if (SYMBOLP (form)) |
| 272 | 1695 { |
| 1696 if (EQ (Vmocklisp_arguments, Qt)) | |
| 1697 return Fsymbol_value (form); | |
| 1698 val = Fsymbol_value (form); | |
| 485 | 1699 if (NILP (val)) |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
1700 XSETFASTINT (val, 0); |
| 272 | 1701 else if (EQ (val, Qt)) |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
1702 XSETFASTINT (val, 1); |
| 272 | 1703 return val; |
| 1704 } | |
| 1705 if (!CONSP (form)) | |
| 1706 return form; | |
| 1707 | |
| 1708 QUIT; | |
| 1709 if (consing_since_gc > gc_cons_threshold) | |
| 1710 { | |
| 1711 GCPRO1 (form); | |
| 1712 Fgarbage_collect (); | |
| 1713 UNGCPRO; | |
| 1714 } | |
| 1715 | |
| 1716 if (++lisp_eval_depth > max_lisp_eval_depth) | |
| 1717 { | |
| 1718 if (max_lisp_eval_depth < 100) | |
| 1719 max_lisp_eval_depth = 100; | |
| 1720 if (lisp_eval_depth > max_lisp_eval_depth) | |
| 1721 error ("Lisp nesting exceeds max-lisp-eval-depth"); | |
| 1722 } | |
| 1723 | |
| 1724 original_fun = Fcar (form); | |
| 1725 original_args = Fcdr (form); | |
| 1726 | |
| 1727 backtrace.next = backtrace_list; | |
| 1728 backtrace_list = &backtrace; | |
| 1729 backtrace.function = &original_fun; /* This also protects them from gc */ | |
| 1730 backtrace.args = &original_args; | |
| 1731 backtrace.nargs = UNEVALLED; | |
| 1732 backtrace.evalargs = 1; | |
| 1733 backtrace.debug_on_exit = 0; | |
| 1734 | |
| 1735 if (debug_on_next_call) | |
| 1736 do_debug_on_call (Qt); | |
| 1737 | |
| 1738 /* At this point, only original_fun and original_args | |
| 1739 have values that will be used below */ | |
| 1740 retry: | |
| 648 | 1741 fun = Findirect_function (original_fun); |
| 272 | 1742 |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1743 if (SUBRP (fun)) |
| 272 | 1744 { |
| 1745 Lisp_Object numargs; | |
|
19544
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1746 Lisp_Object argvals[8]; |
| 272 | 1747 Lisp_Object args_left; |
| 1748 register int i, maxargs; | |
| 1749 | |
| 1750 args_left = original_args; | |
| 1751 numargs = Flength (args_left); | |
| 1752 | |
| 1753 if (XINT (numargs) < XSUBR (fun)->min_args || | |
| 1754 (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs))) | |
| 1755 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil))); | |
| 1756 | |
| 1757 if (XSUBR (fun)->max_args == UNEVALLED) | |
| 1758 { | |
| 1759 backtrace.evalargs = 0; | |
| 1760 val = (*XSUBR (fun)->function) (args_left); | |
| 1761 goto done; | |
| 1762 } | |
| 1763 | |
| 1764 if (XSUBR (fun)->max_args == MANY) | |
| 1765 { | |
| 1766 /* Pass a vector of evaluated arguments */ | |
| 1767 Lisp_Object *vals; | |
| 1768 register int argnum = 0; | |
| 1769 | |
| 1770 vals = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object)); | |
| 1771 | |
| 1772 GCPRO3 (args_left, fun, fun); | |
| 1773 gcpro3.var = vals; | |
| 1774 gcpro3.nvars = 0; | |
| 1775 | |
| 485 | 1776 while (!NILP (args_left)) |
| 272 | 1777 { |
| 1778 vals[argnum++] = Feval (Fcar (args_left)); | |
| 1779 args_left = Fcdr (args_left); | |
| 1780 gcpro3.nvars = argnum; | |
| 1781 } | |
| 1782 | |
| 1783 backtrace.args = vals; | |
| 1784 backtrace.nargs = XINT (numargs); | |
| 1785 | |
| 1786 val = (*XSUBR (fun)->function) (XINT (numargs), vals); | |
| 323 | 1787 UNGCPRO; |
| 272 | 1788 goto done; |
| 1789 } | |
| 1790 | |
| 1791 GCPRO3 (args_left, fun, fun); | |
| 1792 gcpro3.var = argvals; | |
| 1793 gcpro3.nvars = 0; | |
| 1794 | |
| 1795 maxargs = XSUBR (fun)->max_args; | |
| 1796 for (i = 0; i < maxargs; args_left = Fcdr (args_left)) | |
| 1797 { | |
| 1798 argvals[i] = Feval (Fcar (args_left)); | |
| 1799 gcpro3.nvars = ++i; | |
| 1800 } | |
| 1801 | |
| 1802 UNGCPRO; | |
| 1803 | |
| 1804 backtrace.args = argvals; | |
| 1805 backtrace.nargs = XINT (numargs); | |
| 1806 | |
| 1807 switch (i) | |
| 1808 { | |
| 1809 case 0: | |
| 1810 val = (*XSUBR (fun)->function) (); | |
| 1811 goto done; | |
| 1812 case 1: | |
| 1813 val = (*XSUBR (fun)->function) (argvals[0]); | |
| 1814 goto done; | |
| 1815 case 2: | |
| 1816 val = (*XSUBR (fun)->function) (argvals[0], argvals[1]); | |
| 1817 goto done; | |
| 1818 case 3: | |
| 1819 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], | |
| 1820 argvals[2]); | |
| 1821 goto done; | |
| 1822 case 4: | |
| 1823 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], | |
| 1824 argvals[2], argvals[3]); | |
| 1825 goto done; | |
| 1826 case 5: | |
| 1827 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2], | |
| 1828 argvals[3], argvals[4]); | |
| 1829 goto done; | |
| 1830 case 6: | |
| 1831 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2], | |
| 1832 argvals[3], argvals[4], argvals[5]); | |
| 1833 goto done; | |
|
863
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
1834 case 7: |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
1835 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2], |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
1836 argvals[3], argvals[4], argvals[5], |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
1837 argvals[6]); |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
1838 goto done; |
| 272 | 1839 |
|
19544
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1840 case 8: |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1841 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2], |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1842 argvals[3], argvals[4], argvals[5], |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1843 argvals[6], argvals[7]); |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1844 goto done; |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
1845 |
| 272 | 1846 default: |
| 604 | 1847 /* Someone has created a subr that takes more arguments than |
| 1848 is supported by this code. We need to either rewrite the | |
| 1849 subr to use a different argument protocol, or add more | |
| 1850 cases to this switch. */ | |
| 1851 abort (); | |
| 272 | 1852 } |
| 1853 } | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1854 if (COMPILEDP (fun)) |
| 272 | 1855 val = apply_lambda (fun, original_args, 1); |
| 1856 else | |
| 1857 { | |
| 1858 if (!CONSP (fun)) | |
| 1859 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); | |
| 1860 funcar = Fcar (fun); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1861 if (!SYMBOLP (funcar)) |
| 272 | 1862 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); |
| 1863 if (EQ (funcar, Qautoload)) | |
| 1864 { | |
| 1865 do_autoload (fun, original_fun); | |
| 1866 goto retry; | |
| 1867 } | |
| 1868 if (EQ (funcar, Qmacro)) | |
| 1869 val = Feval (apply1 (Fcdr (fun), original_args)); | |
| 1870 else if (EQ (funcar, Qlambda)) | |
| 1871 val = apply_lambda (fun, original_args, 1); | |
| 1872 else if (EQ (funcar, Qmocklisp)) | |
| 1873 val = ml_apply (fun, original_args); | |
| 1874 else | |
| 1875 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); | |
| 1876 } | |
| 1877 done: | |
| 1878 if (!EQ (Vmocklisp_arguments, Qt)) | |
| 1879 { | |
| 485 | 1880 if (NILP (val)) |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
1881 XSETFASTINT (val, 0); |
| 272 | 1882 else if (EQ (val, Qt)) |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
1883 XSETFASTINT (val, 1); |
| 272 | 1884 } |
| 1885 lisp_eval_depth--; | |
| 1886 if (backtrace.debug_on_exit) | |
| 1887 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil))); | |
| 1888 backtrace_list = backtrace.next; | |
| 1889 return val; | |
| 1890 } | |
| 1891 | |
| 1892 DEFUN ("apply", Fapply, Sapply, 2, MANY, 0, | |
| 1893 "Call FUNCTION with our remaining args, using our last arg as list of args.\n\ | |
|
12583
73ac42b9be24
(Ffuncall, Fapply): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11481
diff
changeset
|
1894 Then return the value FUNCTION returns.\n\ |
| 272 | 1895 Thus, (apply '+ 1 2 '(3 4)) returns 10.") |
| 1896 (nargs, args) | |
| 1897 int nargs; | |
| 1898 Lisp_Object *args; | |
| 1899 { | |
| 1900 register int i, numargs; | |
| 1901 register Lisp_Object spread_arg; | |
| 1902 register Lisp_Object *funcall_args; | |
| 1903 Lisp_Object fun; | |
| 323 | 1904 struct gcpro gcpro1; |
| 272 | 1905 |
| 1906 fun = args [0]; | |
| 1907 funcall_args = 0; | |
| 1908 spread_arg = args [nargs - 1]; | |
| 1909 CHECK_LIST (spread_arg, nargs); | |
| 1910 | |
| 1911 numargs = XINT (Flength (spread_arg)); | |
| 1912 | |
| 1913 if (numargs == 0) | |
| 1914 return Ffuncall (nargs - 1, args); | |
| 1915 else if (numargs == 1) | |
| 1916 { | |
| 1917 args [nargs - 1] = XCONS (spread_arg)->car; | |
| 1918 return Ffuncall (nargs, args); | |
| 1919 } | |
| 1920 | |
| 323 | 1921 numargs += nargs - 2; |
| 272 | 1922 |
| 648 | 1923 fun = indirect_function (fun); |
| 1924 if (EQ (fun, Qunbound)) | |
| 272 | 1925 { |
| 648 | 1926 /* Let funcall get the error */ |
| 1927 fun = args[0]; | |
| 1928 goto funcall; | |
| 272 | 1929 } |
| 1930 | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
1931 if (SUBRP (fun)) |
| 272 | 1932 { |
| 1933 if (numargs < XSUBR (fun)->min_args | |
| 1934 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs)) | |
| 1935 goto funcall; /* Let funcall get the error */ | |
| 1936 else if (XSUBR (fun)->max_args > numargs) | |
| 1937 { | |
| 1938 /* Avoid making funcall cons up a yet another new vector of arguments | |
| 1939 by explicitly supplying nil's for optional values */ | |
| 1940 funcall_args = (Lisp_Object *) alloca ((1 + XSUBR (fun)->max_args) | |
| 1941 * sizeof (Lisp_Object)); | |
| 1942 for (i = numargs; i < XSUBR (fun)->max_args;) | |
| 1943 funcall_args[++i] = Qnil; | |
| 323 | 1944 GCPRO1 (*funcall_args); |
| 1945 gcpro1.nvars = 1 + XSUBR (fun)->max_args; | |
| 272 | 1946 } |
| 1947 } | |
| 1948 funcall: | |
| 1949 /* We add 1 to numargs because funcall_args includes the | |
| 1950 function itself as well as its arguments. */ | |
| 1951 if (!funcall_args) | |
| 323 | 1952 { |
| 1953 funcall_args = (Lisp_Object *) alloca ((1 + numargs) | |
| 1954 * sizeof (Lisp_Object)); | |
| 1955 GCPRO1 (*funcall_args); | |
| 1956 gcpro1.nvars = 1 + numargs; | |
| 1957 } | |
| 1958 | |
| 272 | 1959 bcopy (args, funcall_args, nargs * sizeof (Lisp_Object)); |
| 1960 /* Spread the last arg we got. Its first element goes in | |
| 1961 the slot that it used to occupy, hence this value of I. */ | |
| 1962 i = nargs - 1; | |
| 485 | 1963 while (!NILP (spread_arg)) |
| 272 | 1964 { |
| 1965 funcall_args [i++] = XCONS (spread_arg)->car; | |
| 1966 spread_arg = XCONS (spread_arg)->cdr; | |
| 1967 } | |
| 323 | 1968 |
| 1969 RETURN_UNGCPRO (Ffuncall (gcpro1.nvars, funcall_args)); | |
| 272 | 1970 } |
| 1971 | |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1972 /* Run hook variables in various ways. */ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1973 |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1974 enum run_hooks_condition {to_completion, until_success, until_failure}; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1975 |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1976 DEFUN ("run-hooks", Frun_hooks, Srun_hooks, 1, MANY, 0, |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1977 "Run each hook in HOOKS. Major mode functions use this.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1978 Each argument should be a symbol, a hook variable.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1979 These symbols are processed in the order specified.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1980 If a hook symbol has a non-nil value, that value may be a function\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1981 or a list of functions to be called to run the hook.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1982 If the value is a function, it is called with no arguments.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1983 If it is a list, the elements are called, in order, with no arguments.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1984 \n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1985 To make a hook variable buffer-local, use `make-local-hook',\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1986 not `make-local-variable'.") |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1987 (nargs, args) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1988 int nargs; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1989 Lisp_Object *args; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1990 { |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1991 Lisp_Object hook[1]; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1992 register int i; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1993 |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1994 for (i = 0; i < nargs; i++) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1995 { |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1996 hook[0] = args[i]; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1997 run_hook_with_args (1, hook, to_completion); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1998 } |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
1999 |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2000 return Qnil; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2001 } |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2002 |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2003 DEFUN ("run-hook-with-args", Frun_hook_with_args, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2004 Srun_hook_with_args, 1, MANY, 0, |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2005 "Run HOOK with the specified arguments ARGS.\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2006 HOOK should be a symbol, a hook variable. If HOOK has a non-nil\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2007 value, that value may be a function or a list of functions to be\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2008 called to run the hook. If the value is a function, it is called with\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2009 the given arguments and its return value is returned. If it is a list\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2010 of functions, those functions are called, in order,\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2011 with the given arguments ARGS.\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2012 It is best not to depend on the value return by `run-hook-with-args',\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2013 as that may change.\n\ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2014 \n\ |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2015 To make a hook variable buffer-local, use `make-local-hook',\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2016 not `make-local-variable'.") |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2017 (nargs, args) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2018 int nargs; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2019 Lisp_Object *args; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2020 { |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2021 return run_hook_with_args (nargs, args, to_completion); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2022 } |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2023 |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2024 DEFUN ("run-hook-with-args-until-success", Frun_hook_with_args_until_success, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2025 Srun_hook_with_args_until_success, 1, MANY, 0, |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2026 "Run HOOK with the specified arguments ARGS.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2027 HOOK should be a symbol, a hook variable. Its value should\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2028 be a list of functions. We call those functions, one by one,\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2029 passing arguments ARGS to each of them, until one of them\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2030 returns a non-nil value. Then we return that value.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2031 If all the functions return nil, we return nil.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2032 \n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2033 To make a hook variable buffer-local, use `make-local-hook',\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2034 not `make-local-variable'.") |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2035 (nargs, args) |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2036 int nargs; |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2037 Lisp_Object *args; |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2038 { |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2039 return run_hook_with_args (nargs, args, until_success); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2040 } |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2041 |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2042 DEFUN ("run-hook-with-args-until-failure", Frun_hook_with_args_until_failure, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
16443
diff
changeset
|
2043 Srun_hook_with_args_until_failure, 1, MANY, 0, |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2044 "Run HOOK with the specified arguments ARGS.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2045 HOOK should be a symbol, a hook variable. Its value should\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2046 be a list of functions. We call those functions, one by one,\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2047 passing arguments ARGS to each of them, until one of them\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2048 returns nil. Then we return nil.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2049 If all the functions return non-nil, we return non-nil.\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2050 \n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2051 To make a hook variable buffer-local, use `make-local-hook',\n\ |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2052 not `make-local-variable'.") |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2053 (nargs, args) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2054 int nargs; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2055 Lisp_Object *args; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2056 { |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2057 return run_hook_with_args (nargs, args, until_failure); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2058 } |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2059 |
|
12781
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2060 /* ARGS[0] should be a hook symbol. |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2061 Call each of the functions in the hook value, passing each of them |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2062 as arguments all the rest of ARGS (all NARGS - 1 elements). |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2063 COND specifies a condition to test after each call |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2064 to decide whether to stop. |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2065 The caller (or its caller, etc) must gcpro all of ARGS, |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2066 except that it isn't necessary to gcpro ARGS[0]. */ |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2067 |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2068 Lisp_Object |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2069 run_hook_with_args (nargs, args, cond) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2070 int nargs; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2071 Lisp_Object *args; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2072 enum run_hooks_condition cond; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2073 { |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2074 Lisp_Object sym, val, ret; |
|
12781
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2075 struct gcpro gcpro1, gcpro2; |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2076 |
|
14218
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2077 /* If we are dying or still initializing, |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2078 don't do anything--it would probably crash if we tried. */ |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2079 if (NILP (Vrun_hooks)) |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2080 return; |
|
346d4cf758f5
(run_hook_with_args): Do nothing if Vrun_hooks is nil.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2081 |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2082 sym = args[0]; |
|
12663
14d407b83eb3
(run-hook-with-args): Fix previous code.
Karl Heuer <kwzh@gnu.org>
parents:
12654
diff
changeset
|
2083 val = find_symbol_value (sym); |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2084 ret = (cond == until_failure ? Qt : Qnil); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2085 |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2086 if (EQ (val, Qunbound) || NILP (val)) |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2087 return ret; |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2088 else if (!CONSP (val) || EQ (XCONS (val)->car, Qlambda)) |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2089 { |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2090 args[0] = val; |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2091 return Ffuncall (nargs, args); |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2092 } |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2093 else |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2094 { |
|
12788
eceb3f25e115
(run_hook_with_args): Move the GCPRO2; add UNGCPRO.
Richard M. Stallman <rms@gnu.org>
parents:
12781
diff
changeset
|
2095 GCPRO2 (sym, val); |
|
eceb3f25e115
(run_hook_with_args): Move the GCPRO2; add UNGCPRO.
Richard M. Stallman <rms@gnu.org>
parents:
12781
diff
changeset
|
2096 |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2097 for (; |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2098 CONSP (val) && ((cond == to_completion) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2099 || (cond == until_success ? NILP (ret) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2100 : !NILP (ret))); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2101 val = XCONS (val)->cdr) |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2102 { |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2103 if (EQ (XCONS (val)->car, Qt)) |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2104 { |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2105 /* t indicates this hook has a local binding; |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2106 it means to run the global binding too. */ |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2107 Lisp_Object globals; |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2108 |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2109 for (globals = Fdefault_value (sym); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2110 CONSP (globals) && ((cond == to_completion) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2111 || (cond == until_success ? NILP (ret) |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2112 : !NILP (ret))); |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2113 globals = XCONS (globals)->cdr) |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2114 { |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2115 args[0] = XCONS (globals)->car; |
|
13444
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2116 /* In a global value, t should not occur. If it does, we |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2117 must ignore it to avoid an endless loop. */ |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2118 if (!EQ (args[0], Qt)) |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2119 ret = Ffuncall (nargs, args); |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2120 } |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2121 } |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2122 else |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2123 { |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2124 args[0] = XCONS (val)->car; |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2125 ret = Ffuncall (nargs, args); |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2126 } |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2127 } |
|
12788
eceb3f25e115
(run_hook_with_args): Move the GCPRO2; add UNGCPRO.
Richard M. Stallman <rms@gnu.org>
parents:
12781
diff
changeset
|
2128 |
|
eceb3f25e115
(run_hook_with_args): Move the GCPRO2; add UNGCPRO.
Richard M. Stallman <rms@gnu.org>
parents:
12781
diff
changeset
|
2129 UNGCPRO; |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2130 return ret; |
|
12654
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2131 } |
|
14721fd8dcc1
(Frun_hook_with_args): New C function, formerly in subr.el.
Karl Heuer <kwzh@gnu.org>
parents:
12583
diff
changeset
|
2132 } |
|
12781
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2133 |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2134 /* Run a hook symbol ARGS[0], but use FUNLIST instead of the actual |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2135 present value of that symbol. |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2136 Call each element of FUNLIST, |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2137 passing each of them the rest of ARGS. |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2138 The caller (or its caller, etc) must gcpro all of ARGS, |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2139 except that it isn't necessary to gcpro ARGS[0]. */ |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2140 |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2141 Lisp_Object |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2142 run_hook_list_with_args (funlist, nargs, args) |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2143 Lisp_Object funlist; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2144 int nargs; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2145 Lisp_Object *args; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2146 { |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2147 Lisp_Object sym; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2148 Lisp_Object val; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2149 struct gcpro gcpro1, gcpro2; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2150 |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2151 sym = args[0]; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2152 GCPRO2 (sym, val); |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2153 |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2154 for (val = funlist; CONSP (val); val = XCONS (val)->cdr) |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2155 { |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2156 if (EQ (XCONS (val)->car, Qt)) |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2157 { |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2158 /* t indicates this hook has a local binding; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2159 it means to run the global binding too. */ |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2160 Lisp_Object globals; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2161 |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2162 for (globals = Fdefault_value (sym); |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2163 CONSP (globals); |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2164 globals = XCONS (globals)->cdr) |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2165 { |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2166 args[0] = XCONS (globals)->car; |
|
13444
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2167 /* In a global value, t should not occur. If it does, we |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2168 must ignore it to avoid an endless loop. */ |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2169 if (!EQ (args[0], Qt)) |
|
17f3f1c1bdf8
(run-hook-with-args, run-hook-list-with-args): Safeguard
Richard M. Stallman <rms@gnu.org>
parents:
13314
diff
changeset
|
2170 Ffuncall (nargs, args); |
|
12781
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2171 } |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2172 } |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2173 else |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2174 { |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2175 args[0] = XCONS (val)->car; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2176 Ffuncall (nargs, args); |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2177 } |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2178 } |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2179 UNGCPRO; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2180 return Qnil; |
|
2a8036f0b585
(run_hook_with_args): Add gcpros.
Richard M. Stallman <rms@gnu.org>
parents:
12732
diff
changeset
|
2181 } |
|
13103
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2182 |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2183 /* Run the hook HOOK, giving each function the two args ARG1 and ARG2. */ |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2184 |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2185 void |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2186 run_hook_with_args_2 (hook, arg1, arg2) |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2187 Lisp_Object hook, arg1, arg2; |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2188 { |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2189 Lisp_Object temp[3]; |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2190 temp[0] = hook; |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2191 temp[1] = arg1; |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2192 temp[2] = arg2; |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2193 |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2194 Frun_hook_with_args (3, temp); |
|
a537b52d6668
(run_hook_with_args_2): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12788
diff
changeset
|
2195 } |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
2196 |
| 272 | 2197 /* Apply fn to arg */ |
| 2198 Lisp_Object | |
| 2199 apply1 (fn, arg) | |
| 2200 Lisp_Object fn, arg; | |
| 2201 { | |
| 323 | 2202 struct gcpro gcpro1; |
| 2203 | |
| 2204 GCPRO1 (fn); | |
| 485 | 2205 if (NILP (arg)) |
| 323 | 2206 RETURN_UNGCPRO (Ffuncall (1, &fn)); |
| 2207 gcpro1.nvars = 2; | |
| 272 | 2208 #ifdef NO_ARG_ARRAY |
| 2209 { | |
| 2210 Lisp_Object args[2]; | |
| 2211 args[0] = fn; | |
| 2212 args[1] = arg; | |
| 323 | 2213 gcpro1.var = args; |
| 2214 RETURN_UNGCPRO (Fapply (2, args)); | |
| 272 | 2215 } |
| 2216 #else /* not NO_ARG_ARRAY */ | |
| 323 | 2217 RETURN_UNGCPRO (Fapply (2, &fn)); |
| 272 | 2218 #endif /* not NO_ARG_ARRAY */ |
| 2219 } | |
| 2220 | |
| 2221 /* Call function fn on no arguments */ | |
| 2222 Lisp_Object | |
| 2223 call0 (fn) | |
| 2224 Lisp_Object fn; | |
| 2225 { | |
| 323 | 2226 struct gcpro gcpro1; |
| 2227 | |
| 2228 GCPRO1 (fn); | |
| 2229 RETURN_UNGCPRO (Ffuncall (1, &fn)); | |
| 272 | 2230 } |
| 2231 | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2232 /* Call function fn with 1 argument arg1 */ |
| 272 | 2233 /* ARGSUSED */ |
| 2234 Lisp_Object | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2235 call1 (fn, arg1) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2236 Lisp_Object fn, arg1; |
| 272 | 2237 { |
| 323 | 2238 struct gcpro gcpro1; |
| 272 | 2239 #ifdef NO_ARG_ARRAY |
| 323 | 2240 Lisp_Object args[2]; |
| 2241 | |
| 272 | 2242 args[0] = fn; |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2243 args[1] = arg1; |
| 323 | 2244 GCPRO1 (args[0]); |
| 2245 gcpro1.nvars = 2; | |
| 2246 RETURN_UNGCPRO (Ffuncall (2, args)); | |
| 272 | 2247 #else /* not NO_ARG_ARRAY */ |
| 323 | 2248 GCPRO1 (fn); |
| 2249 gcpro1.nvars = 2; | |
| 2250 RETURN_UNGCPRO (Ffuncall (2, &fn)); | |
| 272 | 2251 #endif /* not NO_ARG_ARRAY */ |
| 2252 } | |
| 2253 | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2254 /* Call function fn with 2 arguments arg1, arg2 */ |
| 272 | 2255 /* ARGSUSED */ |
| 2256 Lisp_Object | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2257 call2 (fn, arg1, arg2) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2258 Lisp_Object fn, arg1, arg2; |
| 272 | 2259 { |
| 323 | 2260 struct gcpro gcpro1; |
| 272 | 2261 #ifdef NO_ARG_ARRAY |
| 2262 Lisp_Object args[3]; | |
| 2263 args[0] = fn; | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2264 args[1] = arg1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2265 args[2] = arg2; |
| 323 | 2266 GCPRO1 (args[0]); |
| 2267 gcpro1.nvars = 3; | |
| 2268 RETURN_UNGCPRO (Ffuncall (3, args)); | |
| 272 | 2269 #else /* not NO_ARG_ARRAY */ |
| 323 | 2270 GCPRO1 (fn); |
| 2271 gcpro1.nvars = 3; | |
| 2272 RETURN_UNGCPRO (Ffuncall (3, &fn)); | |
| 272 | 2273 #endif /* not NO_ARG_ARRAY */ |
| 2274 } | |
| 2275 | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2276 /* Call function fn with 3 arguments arg1, arg2, arg3 */ |
| 272 | 2277 /* ARGSUSED */ |
| 2278 Lisp_Object | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2279 call3 (fn, arg1, arg2, arg3) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2280 Lisp_Object fn, arg1, arg2, arg3; |
| 272 | 2281 { |
| 323 | 2282 struct gcpro gcpro1; |
| 272 | 2283 #ifdef NO_ARG_ARRAY |
| 2284 Lisp_Object args[4]; | |
| 2285 args[0] = fn; | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2286 args[1] = arg1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2287 args[2] = arg2; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2288 args[3] = arg3; |
| 323 | 2289 GCPRO1 (args[0]); |
| 2290 gcpro1.nvars = 4; | |
| 2291 RETURN_UNGCPRO (Ffuncall (4, args)); | |
| 272 | 2292 #else /* not NO_ARG_ARRAY */ |
| 323 | 2293 GCPRO1 (fn); |
| 2294 gcpro1.nvars = 4; | |
| 2295 RETURN_UNGCPRO (Ffuncall (4, &fn)); | |
| 272 | 2296 #endif /* not NO_ARG_ARRAY */ |
| 2297 } | |
| 2298 | |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2299 /* Call function fn with 4 arguments arg1, arg2, arg3, arg4 */ |
|
3598
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2300 /* ARGSUSED */ |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2301 Lisp_Object |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2302 call4 (fn, arg1, arg2, arg3, arg4) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2303 Lisp_Object fn, arg1, arg2, arg3, arg4; |
|
3598
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2304 { |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2305 struct gcpro gcpro1; |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2306 #ifdef NO_ARG_ARRAY |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2307 Lisp_Object args[5]; |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2308 args[0] = fn; |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2309 args[1] = arg1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2310 args[2] = arg2; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2311 args[3] = arg3; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2312 args[4] = arg4; |
|
3598
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2313 GCPRO1 (args[0]); |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2314 gcpro1.nvars = 5; |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2315 RETURN_UNGCPRO (Ffuncall (5, args)); |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2316 #else /* not NO_ARG_ARRAY */ |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2317 GCPRO1 (fn); |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2318 gcpro1.nvars = 5; |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2319 RETURN_UNGCPRO (Ffuncall (5, &fn)); |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2320 #endif /* not NO_ARG_ARRAY */ |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2321 } |
|
3c4b5489d2b4
* fileio.c (Frename_file): Pass all arguments to the file name handler.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
2322 |
|
3703
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2323 /* Call function fn with 5 arguments arg1, arg2, arg3, arg4, arg5 */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2324 /* ARGSUSED */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2325 Lisp_Object |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2326 call5 (fn, arg1, arg2, arg3, arg4, arg5) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2327 Lisp_Object fn, arg1, arg2, arg3, arg4, arg5; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2328 { |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2329 struct gcpro gcpro1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2330 #ifdef NO_ARG_ARRAY |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2331 Lisp_Object args[6]; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2332 args[0] = fn; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2333 args[1] = arg1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2334 args[2] = arg2; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2335 args[3] = arg3; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2336 args[4] = arg4; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2337 args[5] = arg5; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2338 GCPRO1 (args[0]); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2339 gcpro1.nvars = 6; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2340 RETURN_UNGCPRO (Ffuncall (6, args)); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2341 #else /* not NO_ARG_ARRAY */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2342 GCPRO1 (fn); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2343 gcpro1.nvars = 6; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2344 RETURN_UNGCPRO (Ffuncall (6, &fn)); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2345 #endif /* not NO_ARG_ARRAY */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2346 } |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2347 |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2348 /* Call function fn with 6 arguments arg1, arg2, arg3, arg4, arg5, arg6 */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2349 /* ARGSUSED */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2350 Lisp_Object |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2351 call6 (fn, arg1, arg2, arg3, arg4, arg5, arg6) |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2352 Lisp_Object fn, arg1, arg2, arg3, arg4, arg5, arg6; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2353 { |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2354 struct gcpro gcpro1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2355 #ifdef NO_ARG_ARRAY |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2356 Lisp_Object args[7]; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2357 args[0] = fn; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2358 args[1] = arg1; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2359 args[2] = arg2; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2360 args[3] = arg3; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2361 args[4] = arg4; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2362 args[5] = arg5; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2363 args[6] = arg6; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2364 GCPRO1 (args[0]); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2365 gcpro1.nvars = 7; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2366 RETURN_UNGCPRO (Ffuncall (7, args)); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2367 #else /* not NO_ARG_ARRAY */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2368 GCPRO1 (fn); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2369 gcpro1.nvars = 7; |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2370 RETURN_UNGCPRO (Ffuncall (7, &fn)); |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2371 #endif /* not NO_ARG_ARRAY */ |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2372 } |
|
6930e8f81c88
(call5, call6): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
3598
diff
changeset
|
2373 |
| 272 | 2374 DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0, |
| 2375 "Call first argument as a function, passing remaining arguments to it.\n\ | |
|
12583
73ac42b9be24
(Ffuncall, Fapply): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
11481
diff
changeset
|
2376 Return the value that function returns.\n\ |
| 272 | 2377 Thus, (funcall 'cons 'x 'y) returns (x . y).") |
| 2378 (nargs, args) | |
| 2379 int nargs; | |
| 2380 Lisp_Object *args; | |
| 2381 { | |
| 2382 Lisp_Object fun; | |
| 2383 Lisp_Object funcar; | |
| 2384 int numargs = nargs - 1; | |
| 2385 Lisp_Object lisp_numargs; | |
| 2386 Lisp_Object val; | |
| 2387 struct backtrace backtrace; | |
| 2388 register Lisp_Object *internal_args; | |
| 2389 register int i; | |
| 2390 | |
| 2391 QUIT; | |
| 2392 if (consing_since_gc > gc_cons_threshold) | |
| 323 | 2393 Fgarbage_collect (); |
| 272 | 2394 |
| 2395 if (++lisp_eval_depth > max_lisp_eval_depth) | |
| 2396 { | |
| 2397 if (max_lisp_eval_depth < 100) | |
| 2398 max_lisp_eval_depth = 100; | |
| 2399 if (lisp_eval_depth > max_lisp_eval_depth) | |
| 2400 error ("Lisp nesting exceeds max-lisp-eval-depth"); | |
| 2401 } | |
| 2402 | |
| 2403 backtrace.next = backtrace_list; | |
| 2404 backtrace_list = &backtrace; | |
| 2405 backtrace.function = &args[0]; | |
| 2406 backtrace.args = &args[1]; | |
| 2407 backtrace.nargs = nargs - 1; | |
| 2408 backtrace.evalargs = 0; | |
| 2409 backtrace.debug_on_exit = 0; | |
| 2410 | |
| 2411 if (debug_on_next_call) | |
| 2412 do_debug_on_call (Qlambda); | |
| 2413 | |
| 2414 retry: | |
| 2415 | |
| 2416 fun = args[0]; | |
| 648 | 2417 |
| 2418 fun = Findirect_function (fun); | |
| 272 | 2419 |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2420 if (SUBRP (fun)) |
| 272 | 2421 { |
| 2422 if (numargs < XSUBR (fun)->min_args | |
| 2423 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs)) | |
| 2424 { | |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
2425 XSETFASTINT (lisp_numargs, numargs); |
| 272 | 2426 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (lisp_numargs, Qnil))); |
| 2427 } | |
| 2428 | |
| 2429 if (XSUBR (fun)->max_args == UNEVALLED) | |
| 2430 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); | |
| 2431 | |
| 2432 if (XSUBR (fun)->max_args == MANY) | |
| 2433 { | |
| 2434 val = (*XSUBR (fun)->function) (numargs, args + 1); | |
| 2435 goto done; | |
| 2436 } | |
| 2437 | |
| 2438 if (XSUBR (fun)->max_args > numargs) | |
| 2439 { | |
| 2440 internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object)); | |
| 2441 bcopy (args + 1, internal_args, numargs * sizeof (Lisp_Object)); | |
| 2442 for (i = numargs; i < XSUBR (fun)->max_args; i++) | |
| 2443 internal_args[i] = Qnil; | |
| 2444 } | |
| 2445 else | |
| 2446 internal_args = args + 1; | |
| 2447 switch (XSUBR (fun)->max_args) | |
| 2448 { | |
| 2449 case 0: | |
| 2450 val = (*XSUBR (fun)->function) (); | |
| 2451 goto done; | |
| 2452 case 1: | |
| 2453 val = (*XSUBR (fun)->function) (internal_args[0]); | |
| 2454 goto done; | |
| 2455 case 2: | |
| 2456 val = (*XSUBR (fun)->function) (internal_args[0], | |
| 2457 internal_args[1]); | |
| 2458 goto done; | |
| 2459 case 3: | |
| 2460 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], | |
| 2461 internal_args[2]); | |
| 2462 goto done; | |
| 2463 case 4: | |
| 2464 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], | |
| 2465 internal_args[2], | |
| 2466 internal_args[3]); | |
| 2467 goto done; | |
| 2468 case 5: | |
| 2469 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], | |
| 2470 internal_args[2], internal_args[3], | |
| 2471 internal_args[4]); | |
| 2472 goto done; | |
| 2473 case 6: | |
| 2474 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], | |
| 2475 internal_args[2], internal_args[3], | |
| 2476 internal_args[4], internal_args[5]); | |
| 2477 goto done; | |
|
863
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2478 case 7: |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2479 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2480 internal_args[2], internal_args[3], |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2481 internal_args[4], internal_args[5], |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2482 internal_args[6]); |
|
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
753
diff
changeset
|
2483 goto done; |
| 272 | 2484 |
|
19544
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2485 case 8: |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2486 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1], |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2487 internal_args[2], internal_args[3], |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2488 internal_args[4], internal_args[5], |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2489 internal_args[6], internal_args[7]); |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2490 goto done; |
|
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2491 |
| 272 | 2492 default: |
| 573 | 2493 |
|
19544
fc0bb24597ba
(Feval): Handle a subr which takes 8 arguments.
Kenichi Handa <handa@m17n.org>
parents:
19237
diff
changeset
|
2494 /* If a subr takes more than 8 arguments without using MANY |
| 573 | 2495 or UNEVALLED, we need to extend this function to support it. |
| 2496 Until this is done, there is no way to call the function. */ | |
| 2497 abort (); | |
| 272 | 2498 } |
| 2499 } | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2500 if (COMPILEDP (fun)) |
| 272 | 2501 val = funcall_lambda (fun, numargs, args + 1); |
| 2502 else | |
| 2503 { | |
| 2504 if (!CONSP (fun)) | |
| 2505 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); | |
| 2506 funcar = Fcar (fun); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2507 if (!SYMBOLP (funcar)) |
| 272 | 2508 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); |
| 2509 if (EQ (funcar, Qlambda)) | |
| 2510 val = funcall_lambda (fun, numargs, args + 1); | |
| 2511 else if (EQ (funcar, Qmocklisp)) | |
| 2512 val = ml_apply (fun, Flist (numargs, args + 1)); | |
| 2513 else if (EQ (funcar, Qautoload)) | |
| 2514 { | |
| 2515 do_autoload (fun, args[0]); | |
| 2516 goto retry; | |
| 2517 } | |
| 2518 else | |
| 2519 return Fsignal (Qinvalid_function, Fcons (fun, Qnil)); | |
| 2520 } | |
| 2521 done: | |
| 2522 lisp_eval_depth--; | |
| 2523 if (backtrace.debug_on_exit) | |
| 2524 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil))); | |
| 2525 backtrace_list = backtrace.next; | |
| 2526 return val; | |
| 2527 } | |
| 2528 | |
| 2529 Lisp_Object | |
| 2530 apply_lambda (fun, args, eval_flag) | |
| 2531 Lisp_Object fun, args; | |
| 2532 int eval_flag; | |
| 2533 { | |
| 2534 Lisp_Object args_left; | |
| 2535 Lisp_Object numargs; | |
| 2536 register Lisp_Object *arg_vector; | |
| 2537 struct gcpro gcpro1, gcpro2, gcpro3; | |
| 2538 register int i; | |
| 2539 register Lisp_Object tem; | |
| 2540 | |
| 2541 numargs = Flength (args); | |
| 2542 arg_vector = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object)); | |
| 2543 args_left = args; | |
| 2544 | |
| 2545 GCPRO3 (*arg_vector, args_left, fun); | |
| 2546 gcpro1.nvars = 0; | |
| 2547 | |
| 2548 for (i = 0; i < XINT (numargs);) | |
| 2549 { | |
| 2550 tem = Fcar (args_left), args_left = Fcdr (args_left); | |
| 2551 if (eval_flag) tem = Feval (tem); | |
| 2552 arg_vector[i++] = tem; | |
| 2553 gcpro1.nvars = i; | |
| 2554 } | |
| 2555 | |
| 2556 UNGCPRO; | |
| 2557 | |
| 2558 if (eval_flag) | |
| 2559 { | |
| 2560 backtrace_list->args = arg_vector; | |
| 2561 backtrace_list->nargs = i; | |
| 2562 } | |
| 2563 backtrace_list->evalargs = 0; | |
| 2564 tem = funcall_lambda (fun, XINT (numargs), arg_vector); | |
| 2565 | |
| 2566 /* Do the debug-on-exit now, while arg_vector still exists. */ | |
| 2567 if (backtrace_list->debug_on_exit) | |
| 2568 tem = call_debugger (Fcons (Qexit, Fcons (tem, Qnil))); | |
| 2569 /* Don't do it again when we return to eval. */ | |
| 2570 backtrace_list->debug_on_exit = 0; | |
| 2571 return tem; | |
| 2572 } | |
| 2573 | |
| 2574 /* Apply a Lisp function FUN to the NARGS evaluated arguments in ARG_VECTOR | |
| 2575 and return the result of evaluation. | |
| 2576 FUN must be either a lambda-expression or a compiled-code object. */ | |
| 2577 | |
| 2578 Lisp_Object | |
| 2579 funcall_lambda (fun, nargs, arg_vector) | |
| 2580 Lisp_Object fun; | |
| 2581 int nargs; | |
| 2582 register Lisp_Object *arg_vector; | |
| 2583 { | |
| 2584 Lisp_Object val, tem; | |
| 2585 register Lisp_Object syms_left; | |
| 2586 Lisp_Object numargs; | |
| 2587 register Lisp_Object next; | |
| 2588 int count = specpdl_ptr - specpdl; | |
| 2589 register int i; | |
| 2590 int optional = 0, rest = 0; | |
| 2591 | |
| 2592 specbind (Qmocklisp_arguments, Qt); /* t means NOT mocklisp! */ | |
| 2593 | |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
2594 XSETFASTINT (numargs, nargs); |
| 272 | 2595 |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2596 if (CONSP (fun)) |
| 272 | 2597 syms_left = Fcar (Fcdr (fun)); |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2598 else if (COMPILEDP (fun)) |
| 272 | 2599 syms_left = XVECTOR (fun)->contents[COMPILED_ARGLIST]; |
| 2600 else abort (); | |
| 2601 | |
| 2602 i = 0; | |
| 485 | 2603 for (; !NILP (syms_left); syms_left = Fcdr (syms_left)) |
| 272 | 2604 { |
| 2605 QUIT; | |
| 2606 next = Fcar (syms_left); | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2607 while (!SYMBOLP (next)) |
| 431 | 2608 next = Fsignal (Qinvalid_function, Fcons (fun, Qnil)); |
| 272 | 2609 if (EQ (next, Qand_rest)) |
| 2610 rest = 1; | |
| 2611 else if (EQ (next, Qand_optional)) | |
| 2612 optional = 1; | |
| 2613 else if (rest) | |
| 2614 { | |
| 431 | 2615 specbind (next, Flist (nargs - i, &arg_vector[i])); |
| 272 | 2616 i = nargs; |
| 2617 } | |
| 2618 else if (i < nargs) | |
| 2619 { | |
| 2620 tem = arg_vector[i++]; | |
| 2621 specbind (next, tem); | |
| 2622 } | |
| 2623 else if (!optional) | |
| 2624 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil))); | |
| 2625 else | |
| 2626 specbind (next, Qnil); | |
| 2627 } | |
| 2628 | |
| 2629 if (i < nargs) | |
| 2630 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil))); | |
| 2631 | |
|
9148
e7ab930bb7eb
(Fprogn, Finteractive_p, Fuser_variable_p, FletX, Flet, Fmacroexpand,
Karl Heuer <kwzh@gnu.org>
parents:
8980
diff
changeset
|
2632 if (CONSP (fun)) |
| 272 | 2633 val = Fprogn (Fcdr (Fcdr (fun))); |
| 2634 else | |
|
10201
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2635 { |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2636 /* If we have not actually read the bytecode string |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2637 and constants vector yet, fetch them from the file. */ |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2638 if (CONSP (XVECTOR (fun)->contents[COMPILED_BYTECODE])) |
|
11205
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2639 Ffetch_bytecode (fun); |
|
10201
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2640 val = Fbyte_code (XVECTOR (fun)->contents[COMPILED_BYTECODE], |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2641 XVECTOR (fun)->contents[COMPILED_CONSTANTS], |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2642 XVECTOR (fun)->contents[COMPILED_STACK_DEPTH]); |
|
03f3a1f4264a
(Fdefvar): Fix minor error in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
10161
diff
changeset
|
2643 } |
| 272 | 2644 return unbind_to (count, val); |
| 2645 } | |
|
11205
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2646 |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2647 DEFUN ("fetch-bytecode", Ffetch_bytecode, Sfetch_bytecode, |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2648 1, 1, 0, |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2649 "If byte-compiled OBJECT is lazy-loaded, fetch it now.") |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2650 (object) |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2651 Lisp_Object object; |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2652 { |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2653 Lisp_Object tem; |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2654 |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2655 if (COMPILEDP (object) |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2656 && CONSP (XVECTOR (object)->contents[COMPILED_BYTECODE])) |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2657 { |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2658 tem = read_doc_string (XVECTOR (object)->contents[COMPILED_BYTECODE]); |
|
11481
af7833ecb551
(Ffetch_bytecode): Check the type of the object being read from the file.
Richard M. Stallman <rms@gnu.org>
parents:
11365
diff
changeset
|
2659 if (!CONSP (tem)) |
|
af7833ecb551
(Ffetch_bytecode): Check the type of the object being read from the file.
Richard M. Stallman <rms@gnu.org>
parents:
11365
diff
changeset
|
2660 error ("invalid byte code"); |
|
11205
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2661 XVECTOR (object)->contents[COMPILED_BYTECODE] = XCONS (tem)->car; |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2662 XVECTOR (object)->contents[COMPILED_CONSTANTS] = XCONS (tem)->cdr; |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2663 } |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2664 return object; |
|
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
2665 } |
| 272 | 2666 |
| 2667 void | |
| 2668 grow_specpdl () | |
| 2669 { | |
| 2670 register int count = specpdl_ptr - specpdl; | |
| 2671 if (specpdl_size >= max_specpdl_size) | |
| 2672 { | |
| 2673 if (max_specpdl_size < 400) | |
| 2674 max_specpdl_size = 400; | |
| 2675 if (specpdl_size >= max_specpdl_size) | |
| 2676 { | |
|
1452
ed79bb8047e8
(grow_specpdl): Increase max_specpdl_size before Fsignal.
Richard M. Stallman <rms@gnu.org>
parents:
1199
diff
changeset
|
2677 if (!NILP (Vdebug_on_error)) |
|
ed79bb8047e8
(grow_specpdl): Increase max_specpdl_size before Fsignal.
Richard M. Stallman <rms@gnu.org>
parents:
1199
diff
changeset
|
2678 /* Leave room for some specpdl in the debugger. */ |
|
ed79bb8047e8
(grow_specpdl): Increase max_specpdl_size before Fsignal.
Richard M. Stallman <rms@gnu.org>
parents:
1199
diff
changeset
|
2679 max_specpdl_size = specpdl_size + 100; |
| 272 | 2680 Fsignal (Qerror, |
| 2681 Fcons (build_string ("Variable binding depth exceeds max-specpdl-size"), Qnil)); | |
| 2682 } | |
| 2683 } | |
| 2684 specpdl_size *= 2; | |
| 2685 if (specpdl_size > max_specpdl_size) | |
| 2686 specpdl_size = max_specpdl_size; | |
| 2687 specpdl = (struct specbinding *) xrealloc (specpdl, specpdl_size * sizeof (struct specbinding)); | |
| 2688 specpdl_ptr = specpdl + count; | |
| 2689 } | |
| 2690 | |
| 2691 void | |
| 2692 specbind (symbol, value) | |
| 2693 Lisp_Object symbol, value; | |
| 2694 { | |
| 2695 Lisp_Object ovalue; | |
| 2696 | |
| 431 | 2697 CHECK_SYMBOL (symbol, 0); |
| 2698 | |
| 272 | 2699 if (specpdl_ptr == specpdl + specpdl_size) |
| 2700 grow_specpdl (); | |
| 2701 specpdl_ptr->symbol = symbol; | |
| 2702 specpdl_ptr->func = 0; | |
|
6826
903d03ddf99c
(specbind): Use find_symbol_value.
Richard M. Stallman <rms@gnu.org>
parents:
6803
diff
changeset
|
2703 specpdl_ptr->old_value = ovalue = find_symbol_value (symbol); |
| 272 | 2704 specpdl_ptr++; |
|
11007
433d4013f39b
(specbind): Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents:
10604
diff
changeset
|
2705 if (BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue)) |
| 272 | 2706 store_symval_forwarding (symbol, ovalue, value); |
| 2707 else | |
|
16930
e1aba4a05388
(unbind_to, specbind): Use set_internal.
Richard M. Stallman <rms@gnu.org>
parents:
16895
diff
changeset
|
2708 set_internal (symbol, value, 1); |
| 272 | 2709 } |
| 2710 | |
| 2711 void | |
| 2712 record_unwind_protect (function, arg) | |
|
20312
d75a1b915e20
(record_unwind_protect): Protoize parameter.
Andreas Schwab <schwab@suse.de>
parents:
19544
diff
changeset
|
2713 Lisp_Object (*function) P_ ((Lisp_Object)); |
| 272 | 2714 Lisp_Object arg; |
| 2715 { | |
| 2716 if (specpdl_ptr == specpdl + specpdl_size) | |
| 2717 grow_specpdl (); | |
| 2718 specpdl_ptr->func = function; | |
| 2719 specpdl_ptr->symbol = Qnil; | |
| 2720 specpdl_ptr->old_value = arg; | |
| 2721 specpdl_ptr++; | |
| 2722 } | |
| 2723 | |
| 2724 Lisp_Object | |
| 2725 unbind_to (count, value) | |
| 2726 int count; | |
| 2727 Lisp_Object value; | |
| 2728 { | |
| 485 | 2729 int quitf = !NILP (Vquit_flag); |
| 272 | 2730 struct gcpro gcpro1; |
| 2731 | |
| 2732 GCPRO1 (value); | |
| 2733 | |
| 2734 Vquit_flag = Qnil; | |
| 2735 | |
| 2736 while (specpdl_ptr != specpdl + count) | |
| 2737 { | |
| 2738 --specpdl_ptr; | |
| 2739 if (specpdl_ptr->func != 0) | |
| 2740 (*specpdl_ptr->func) (specpdl_ptr->old_value); | |
| 2741 /* Note that a "binding" of nil is really an unwind protect, | |
| 2742 so in that case the "old value" is a list of forms to evaluate. */ | |
| 485 | 2743 else if (NILP (specpdl_ptr->symbol)) |
| 272 | 2744 Fprogn (specpdl_ptr->old_value); |
| 2745 else | |
|
16930
e1aba4a05388
(unbind_to, specbind): Use set_internal.
Richard M. Stallman <rms@gnu.org>
parents:
16895
diff
changeset
|
2746 set_internal (specpdl_ptr->symbol, specpdl_ptr->old_value, 1); |
| 272 | 2747 } |
| 485 | 2748 if (NILP (Vquit_flag) && quitf) Vquit_flag = Qt; |
| 272 | 2749 |
| 2750 UNGCPRO; | |
| 2751 | |
| 2752 return value; | |
| 2753 } | |
| 2754 | |
| 2755 #if 0 | |
| 2756 | |
| 2757 /* Get the value of symbol's global binding, even if that binding | |
| 2758 is not now dynamically visible. */ | |
| 2759 | |
| 2760 Lisp_Object | |
| 2761 top_level_value (symbol) | |
| 2762 Lisp_Object symbol; | |
| 2763 { | |
| 2764 register struct specbinding *ptr = specpdl; | |
| 2765 | |
| 2766 CHECK_SYMBOL (symbol, 0); | |
| 2767 for (; ptr != specpdl_ptr; ptr++) | |
| 2768 { | |
| 2769 if (EQ (ptr->symbol, symbol)) | |
| 2770 return ptr->old_value; | |
| 2771 } | |
| 2772 return Fsymbol_value (symbol); | |
| 2773 } | |
| 2774 | |
| 2775 Lisp_Object | |
| 2776 top_level_set (symbol, newval) | |
| 2777 Lisp_Object symbol, newval; | |
| 2778 { | |
| 2779 register struct specbinding *ptr = specpdl; | |
| 2780 | |
| 2781 CHECK_SYMBOL (symbol, 0); | |
| 2782 for (; ptr != specpdl_ptr; ptr++) | |
| 2783 { | |
| 2784 if (EQ (ptr->symbol, symbol)) | |
| 2785 { | |
| 2786 ptr->old_value = newval; | |
| 2787 return newval; | |
| 2788 } | |
| 2789 } | |
| 2790 return Fset (symbol, newval); | |
| 2791 } | |
| 2792 | |
| 2793 #endif /* 0 */ | |
| 2794 | |
| 2795 DEFUN ("backtrace-debug", Fbacktrace_debug, Sbacktrace_debug, 2, 2, 0, | |
| 2796 "Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.\n\ | |
| 2797 The debugger is entered when that frame exits, if the flag is non-nil.") | |
| 2798 (level, flag) | |
| 2799 Lisp_Object level, flag; | |
| 2800 { | |
| 2801 register struct backtrace *backlist = backtrace_list; | |
| 2802 register int i; | |
| 2803 | |
| 2804 CHECK_NUMBER (level, 0); | |
| 2805 | |
| 2806 for (i = 0; backlist && i < XINT (level); i++) | |
| 2807 { | |
| 2808 backlist = backlist->next; | |
| 2809 } | |
| 2810 | |
| 2811 if (backlist) | |
| 485 | 2812 backlist->debug_on_exit = !NILP (flag); |
| 272 | 2813 |
| 2814 return flag; | |
| 2815 } | |
| 2816 | |
| 2817 DEFUN ("backtrace", Fbacktrace, Sbacktrace, 0, 0, "", | |
| 2818 "Print a trace of Lisp function calls currently active.\n\ | |
| 2819 Output stream used is value of `standard-output'.") | |
| 2820 () | |
| 2821 { | |
| 2822 register struct backtrace *backlist = backtrace_list; | |
| 2823 register int i; | |
| 2824 Lisp_Object tail; | |
| 2825 Lisp_Object tem; | |
| 2826 extern Lisp_Object Vprint_level; | |
| 2827 struct gcpro gcpro1; | |
| 2828 | |
|
9306
ac852c183fa1
(Feval, Ffuncall, funcall_lambda, Fbacktrace): Don't use XFASTINT as an
Karl Heuer <kwzh@gnu.org>
parents:
9148
diff
changeset
|
2829 XSETFASTINT (Vprint_level, 3); |
| 272 | 2830 |
| 2831 tail = Qnil; | |
| 2832 GCPRO1 (tail); | |
| 2833 | |
| 2834 while (backlist) | |
| 2835 { | |
| 2836 write_string (backlist->debug_on_exit ? "* " : " ", 2); | |
| 2837 if (backlist->nargs == UNEVALLED) | |
| 2838 { | |
| 2839 Fprin1 (Fcons (*backlist->function, *backlist->args), Qnil); | |
|
7533
62e3e25bc8f6
(Fbacktrace): Properly nest parentheses.
Karl Heuer <kwzh@gnu.org>
parents:
7511
diff
changeset
|
2840 write_string ("\n", -1); |
| 272 | 2841 } |
| 2842 else | |
| 2843 { | |
| 2844 tem = *backlist->function; | |
| 2845 Fprin1 (tem, Qnil); /* This can QUIT */ | |
| 2846 write_string ("(", -1); | |
| 2847 if (backlist->nargs == MANY) | |
| 2848 { | |
| 2849 for (tail = *backlist->args, i = 0; | |
| 485 | 2850 !NILP (tail); |
| 272 | 2851 tail = Fcdr (tail), i++) |
| 2852 { | |
| 2853 if (i) write_string (" ", -1); | |
| 2854 Fprin1 (Fcar (tail), Qnil); | |
| 2855 } | |
| 2856 } | |
| 2857 else | |
| 2858 { | |
| 2859 for (i = 0; i < backlist->nargs; i++) | |
| 2860 { | |
| 2861 if (i) write_string (" ", -1); | |
| 2862 Fprin1 (backlist->args[i], Qnil); | |
| 2863 } | |
| 2864 } | |
|
7533
62e3e25bc8f6
(Fbacktrace): Properly nest parentheses.
Karl Heuer <kwzh@gnu.org>
parents:
7511
diff
changeset
|
2865 write_string (")\n", -1); |
| 272 | 2866 } |
| 2867 backlist = backlist->next; | |
| 2868 } | |
| 2869 | |
| 2870 Vprint_level = Qnil; | |
| 2871 UNGCPRO; | |
| 2872 return Qnil; | |
| 2873 } | |
| 2874 | |
| 2875 DEFUN ("backtrace-frame", Fbacktrace_frame, Sbacktrace_frame, 1, 1, "", | |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
2876 "Return the function and arguments NFRAMES up from current execution point.\n\ |
| 272 | 2877 If that frame has not evaluated the arguments yet (or is a special form),\n\ |
| 2878 the value is (nil FUNCTION ARG-FORMS...).\n\ | |
| 2879 If that frame has evaluated its arguments and called its function already,\n\ | |
| 2880 the value is (t FUNCTION ARG-VALUES...).\n\ | |
| 2881 A &rest arg is represented as the tail of the list ARG-VALUES.\n\ | |
| 2882 FUNCTION is whatever was supplied as car of evaluated list,\n\ | |
| 2883 or a lambda expression for macro calls.\n\ | |
|
14073
0df4b4f2a2a1
(Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13945
diff
changeset
|
2884 If NFRAMES is more than the number of frames, the value is nil.") |
| 272 | 2885 (nframes) |
| 2886 Lisp_Object nframes; | |
| 2887 { | |
| 2888 register struct backtrace *backlist = backtrace_list; | |
| 2889 register int i; | |
| 2890 Lisp_Object tem; | |
| 2891 | |
| 2892 CHECK_NATNUM (nframes, 0); | |
| 2893 | |
| 2894 /* Find the frame requested. */ | |
|
7533
62e3e25bc8f6
(Fbacktrace): Properly nest parentheses.
Karl Heuer <kwzh@gnu.org>
parents:
7511
diff
changeset
|
2895 for (i = 0; backlist && i < XFASTINT (nframes); i++) |
| 272 | 2896 backlist = backlist->next; |
| 2897 | |
| 2898 if (!backlist) | |
| 2899 return Qnil; | |
| 2900 if (backlist->nargs == UNEVALLED) | |
| 2901 return Fcons (Qnil, Fcons (*backlist->function, *backlist->args)); | |
| 2902 else | |
| 2903 { | |
| 2904 if (backlist->nargs == MANY) | |
| 2905 tem = *backlist->args; | |
| 2906 else | |
| 2907 tem = Flist (backlist->nargs, backlist->args); | |
| 2908 | |
| 2909 return Fcons (Qt, Fcons (*backlist->function, tem)); | |
| 2910 } | |
| 2911 } | |
| 2912 | |
| 21514 | 2913 void |
| 272 | 2914 syms_of_eval () |
| 2915 { | |
| 2916 DEFVAR_INT ("max-specpdl-size", &max_specpdl_size, | |
|
18920
9c03cae980ed
(syms_of_eval): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18636
diff
changeset
|
2917 "*Limit on number of Lisp variable bindings & unwind-protects.\n\ |
|
9c03cae980ed
(syms_of_eval): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18636
diff
changeset
|
2918 If Lisp code tries to make more than this many at once,\n\ |
|
9c03cae980ed
(syms_of_eval): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18636
diff
changeset
|
2919 an error is signaled."); |
| 272 | 2920 |
| 2921 DEFVAR_INT ("max-lisp-eval-depth", &max_lisp_eval_depth, | |
|
18920
9c03cae980ed
(syms_of_eval): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18636
diff
changeset
|
2922 "*Limit on depth in `eval', `apply' and `funcall' before error.\n\ |
| 272 | 2923 This limit is to catch infinite recursions for you before they cause\n\ |
| 2924 actual stack overflow in C, which would be fatal for Emacs.\n\ | |
| 2925 You can safely make it considerably larger than its default value,\n\ | |
| 2926 if that proves inconveniently small."); | |
| 2927 | |
| 2928 DEFVAR_LISP ("quit-flag", &Vquit_flag, | |
| 2929 "Non-nil causes `eval' to abort, unless `inhibit-quit' is non-nil.\n\ | |
|
7511
9ec3fc16ab3a
(syms_of_eval): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
7353
diff
changeset
|
2930 Typing C-g sets `quit-flag' non-nil, regardless of `inhibit-quit'."); |
| 272 | 2931 Vquit_flag = Qnil; |
| 2932 | |
| 2933 DEFVAR_LISP ("inhibit-quit", &Vinhibit_quit, | |
| 2934 "Non-nil inhibits C-g quitting from happening immediately.\n\ | |
| 2935 Note that `quit-flag' will still be set by typing C-g,\n\ | |
|
13945
6a653c300631
(syms_of_eval): Doc fix for inhibit-quit.
Karl Heuer <kwzh@gnu.org>
parents:
13768
diff
changeset
|
2936 so a quit will be signaled as soon as `inhibit-quit' is nil.\n\ |
| 272 | 2937 To prevent this happening, set `quit-flag' to nil\n\ |
| 2938 before making `inhibit-quit' nil."); | |
| 2939 Vinhibit_quit = Qnil; | |
| 2940 | |
| 381 | 2941 Qinhibit_quit = intern ("inhibit-quit"); |
| 2942 staticpro (&Qinhibit_quit); | |
| 2943 | |
| 272 | 2944 Qautoload = intern ("autoload"); |
| 2945 staticpro (&Qautoload); | |
| 2946 | |
| 2947 Qdebug_on_error = intern ("debug-on-error"); | |
| 2948 staticpro (&Qdebug_on_error); | |
| 2949 | |
| 2950 Qmacro = intern ("macro"); | |
| 2951 staticpro (&Qmacro); | |
| 2952 | |
| 2953 /* Note that the process handling also uses Qexit, but we don't want | |
| 2954 to staticpro it twice, so we just do it here. */ | |
| 2955 Qexit = intern ("exit"); | |
| 2956 staticpro (&Qexit); | |
| 2957 | |
| 2958 Qinteractive = intern ("interactive"); | |
| 2959 staticpro (&Qinteractive); | |
| 2960 | |
| 2961 Qcommandp = intern ("commandp"); | |
| 2962 staticpro (&Qcommandp); | |
| 2963 | |
| 2964 Qdefun = intern ("defun"); | |
| 2965 staticpro (&Qdefun); | |
| 2966 | |
| 2967 Qand_rest = intern ("&rest"); | |
| 2968 staticpro (&Qand_rest); | |
| 2969 | |
| 2970 Qand_optional = intern ("&optional"); | |
| 2971 staticpro (&Qand_optional); | |
| 2972 | |
| 684 | 2973 DEFVAR_LISP ("stack-trace-on-error", &Vstack_trace_on_error, |
| 272 | 2974 "*Non-nil means automatically display a backtrace buffer\n\ |
| 684 | 2975 after any error that is handled by the editor command loop.\n\ |
| 2976 If the value is a list, an error only means to display a backtrace\n\ | |
| 2977 if one of its condition symbols appears in the list."); | |
| 2978 Vstack_trace_on_error = Qnil; | |
| 272 | 2979 |
| 684 | 2980 DEFVAR_LISP ("debug-on-error", &Vdebug_on_error, |
| 272 | 2981 "*Non-nil means enter debugger if an error is signaled.\n\ |
| 2982 Does not apply to errors handled by `condition-case'.\n\ | |
| 684 | 2983 If the value is a list, an error only means to enter the debugger\n\ |
| 2984 if one of its condition symbols appears in the list.\n\ | |
| 272 | 2985 See also variable `debug-on-quit'."); |
| 684 | 2986 Vdebug_on_error = Qnil; |
| 272 | 2987 |
| 13768 | 2988 DEFVAR_LISP ("debug-ignored-errors", &Vdebug_ignored_errors, |
| 2989 "*List of errors for which the debugger should not be called.\n\ | |
| 2990 Each element may be a condition-name or a regexp that matches error messages.\n\ | |
| 2991 If any element applies to a given error, that error skips the debugger\n\ | |
| 2992 and just returns to top level.\n\ | |
| 2993 This overrides the variable `debug-on-error'.\n\ | |
| 2994 It does not apply to errors handled by `condition-case'."); | |
| 2995 Vdebug_ignored_errors = Qnil; | |
| 2996 | |
| 272 | 2997 DEFVAR_BOOL ("debug-on-quit", &debug_on_quit, |
|
7511
9ec3fc16ab3a
(syms_of_eval): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
7353
diff
changeset
|
2998 "*Non-nil means enter debugger if quit is signaled (C-g, for example).\n\ |
| 940 | 2999 Does not apply if quit is handled by a `condition-case'."); |
| 272 | 3000 debug_on_quit = 0; |
| 3001 | |
| 3002 DEFVAR_BOOL ("debug-on-next-call", &debug_on_next_call, | |
| 3003 "Non-nil means enter debugger before next `eval', `apply' or `funcall'."); | |
| 3004 | |
| 3005 DEFVAR_LISP ("debugger", &Vdebugger, | |
| 3006 "Function to call to invoke debugger.\n\ | |
| 3007 If due to frame exit, args are `exit' and the value being returned;\n\ | |
| 3008 this function's value will be returned instead of that.\n\ | |
| 3009 If due to error, args are `error' and a list of the args to `signal'.\n\ | |
| 3010 If due to `apply' or `funcall' entry, one arg, `lambda'.\n\ | |
| 3011 If due to `eval' entry, one arg, t."); | |
| 3012 Vdebugger = Qnil; | |
| 3013 | |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3014 DEFVAR_LISP ("signal-hook-function", &Vsignal_hook_function, |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3015 "If non-nil, this is a function for `signal' to call.\n\ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3016 It receives the same arguments that `signal' was given.\n\ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3017 The Edebug package uses this to regain control."); |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3018 Vsignal_hook_function = Qnil; |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3019 |
| 272 | 3020 Qmocklisp_arguments = intern ("mocklisp-arguments"); |
| 3021 staticpro (&Qmocklisp_arguments); | |
| 3022 DEFVAR_LISP ("mocklisp-arguments", &Vmocklisp_arguments, | |
| 3023 "While in a mocklisp function, the list of its unevaluated args."); | |
| 3024 Vmocklisp_arguments = Qt; | |
| 3025 | |
|
16443
0128b923d281
(Vdebug_on_signal): Renamed from Vdebug_force.
Richard M. Stallman <rms@gnu.org>
parents:
16355
diff
changeset
|
3026 DEFVAR_LISP ("debug-on-signal", &Vdebug_on_signal, |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3027 "*Non-nil means call the debugger regardless of condition handlers.\n\ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3028 Note that `debug-on-error', `debug-on-quit' and friends\n\ |
|
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3029 still determine whether to handle the particular condition."); |
|
16443
0128b923d281
(Vdebug_on_signal): Renamed from Vdebug_force.
Richard M. Stallman <rms@gnu.org>
parents:
16355
diff
changeset
|
3030 Vdebug_on_signal = Qnil; |
|
16355
1d85b2698564
(Vdebug_force): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16296
diff
changeset
|
3031 |
|
16296
584310941e70
(syms_of_eval): Initialize Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
16113
diff
changeset
|
3032 Vrun_hooks = intern ("run-hooks"); |
|
584310941e70
(syms_of_eval): Initialize Vrun_hooks here.
Richard M. Stallman <rms@gnu.org>
parents:
16113
diff
changeset
|
3033 staticpro (&Vrun_hooks); |
| 272 | 3034 |
| 3035 staticpro (&Vautoload_queue); | |
| 3036 Vautoload_queue = Qnil; | |
| 3037 | |
| 3038 defsubr (&Sor); | |
| 3039 defsubr (&Sand); | |
| 3040 defsubr (&Sif); | |
| 3041 defsubr (&Scond); | |
| 3042 defsubr (&Sprogn); | |
| 3043 defsubr (&Sprog1); | |
| 3044 defsubr (&Sprog2); | |
| 3045 defsubr (&Ssetq); | |
| 3046 defsubr (&Squote); | |
| 3047 defsubr (&Sfunction); | |
| 3048 defsubr (&Sdefun); | |
| 3049 defsubr (&Sdefmacro); | |
| 3050 defsubr (&Sdefvar); | |
| 3051 defsubr (&Sdefconst); | |
| 3052 defsubr (&Suser_variable_p); | |
| 3053 defsubr (&Slet); | |
| 3054 defsubr (&SletX); | |
| 3055 defsubr (&Swhile); | |
| 3056 defsubr (&Smacroexpand); | |
| 3057 defsubr (&Scatch); | |
| 3058 defsubr (&Sthrow); | |
| 3059 defsubr (&Sunwind_protect); | |
| 3060 defsubr (&Scondition_case); | |
| 3061 defsubr (&Ssignal); | |
| 3062 defsubr (&Sinteractive_p); | |
| 3063 defsubr (&Scommandp); | |
| 3064 defsubr (&Sautoload); | |
| 3065 defsubr (&Seval); | |
| 3066 defsubr (&Sapply); | |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
3067 defsubr (&Sfuncall); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
3068 defsubr (&Srun_hooks); |
|
12711
a8feaa42d775
(syms_of_eval): Add missing defsubr.
Karl Heuer <kwzh@gnu.org>
parents:
12663
diff
changeset
|
3069 defsubr (&Srun_hook_with_args); |
|
12732
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
3070 defsubr (&Srun_hook_with_args_until_success); |
|
981b924c832b
Add Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success, Frun_hook_with_args_until_failure in terms of run_hook_with_args.
Simon Marshall <simon@gnu.org>
parents:
12711
diff
changeset
|
3071 defsubr (&Srun_hook_with_args_until_failure); |
|
11205
81a008df9184
(Ffetch_bytecode): New function.
Karl Heuer <kwzh@gnu.org>
parents:
11007
diff
changeset
|
3072 defsubr (&Sfetch_bytecode); |
| 272 | 3073 defsubr (&Sbacktrace_debug); |
| 3074 defsubr (&Sbacktrace); | |
| 3075 defsubr (&Sbacktrace_frame); | |
| 3076 } |
