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