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