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