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