Initial revision
[bpt/emacs.git] / src / eval.c
CommitLineData
db9f0278 1/* Evaluator for GNU Emacs Lisp interpreter.
70ee42f7 2 Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
db9f0278
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "lisp.h"
23#ifdef HAVE_X_WINDOWS
24#include "xterm.h"
25#endif
26
27#ifndef standalone
28#include "commands.h"
1f98fa48 29#include "keyboard.h"
db9f0278
JB
30#else
31#define INTERACTIVE 1
32#endif
33
34#include <setjmp.h>
35
36/* This definition is duplicated in alloc.c and keyboard.c */
37/* Putting it in lisp.h makes cc bomb out! */
38
39struct backtrace
40 {
41 struct backtrace *next;
42 Lisp_Object *function;
43 Lisp_Object *args; /* Points to vector of args. */
daa37602
JB
44 int nargs; /* Length of vector.
45 If nargs is UNEVALLED, args points to slot holding
46 list of unevalled args */
db9f0278
JB
47 char evalargs;
48 /* Nonzero means call value of debugger when done with this operation. */
49 char debug_on_exit;
50 };
51
52struct backtrace *backtrace_list;
53
54struct catchtag
55 {
56 Lisp_Object tag;
57 Lisp_Object val;
58 struct catchtag *next;
59 struct gcpro *gcpro;
60 jmp_buf jmp;
61 struct backtrace *backlist;
62 struct handler *handlerlist;
63 int lisp_eval_depth;
64 int pdlcount;
65 int poll_suppress_count;
66 };
67
68struct catchtag *catchlist;
69
70Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun;
ad236261 71Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag;
db9f0278
JB
72Lisp_Object Qmocklisp_arguments, Vmocklisp_arguments, Qmocklisp;
73Lisp_Object Qand_rest, Qand_optional;
74Lisp_Object Qdebug_on_error;
75
76Lisp_Object Vrun_hooks;
77
78/* Non-nil means record all fset's and provide's, to be undone
79 if the file being autoloaded is not fully loaded.
80 They are recorded by being consed onto the front of Vautoload_queue:
81 (FUN . ODEF) for a defun, (OFEATURES . nil) for a provide. */
82
83Lisp_Object Vautoload_queue;
84
85/* Current number of specbindings allocated in specpdl. */
86int specpdl_size;
87
88/* Pointer to beginning of specpdl. */
89struct specbinding *specpdl;
90
91/* Pointer to first unused element in specpdl. */
92struct specbinding *specpdl_ptr;
93
94/* Maximum size allowed for specpdl allocation */
95int max_specpdl_size;
96
97/* Depth in Lisp evaluations and function calls. */
98int lisp_eval_depth;
99
100/* Maximum allowed depth in Lisp evaluations and function calls. */
101int max_lisp_eval_depth;
102
103/* Nonzero means enter debugger before next function call */
104int debug_on_next_call;
105
128c0f66 106/* List of conditions (non-nil atom means all) which cause a backtrace
4de86b16 107 if an error is handled by the command loop's error handler. */
128c0f66 108Lisp_Object Vstack_trace_on_error;
db9f0278 109
128c0f66 110/* List of conditions (non-nil atom means all) which enter the debugger
4de86b16 111 if an error is handled by the command loop's error handler. */
128c0f66 112Lisp_Object Vdebug_on_error;
db9f0278
JB
113
114/* Nonzero means enter debugger if a quit signal
128c0f66 115 is handled by the command loop's error handler. */
db9f0278
JB
116int debug_on_quit;
117
118/* Nonzero means we are trying to enter the debugger.
119 This is to prevent recursive attempts. */
120int entering_debugger;
121
122Lisp_Object Vdebugger;
123
124void specbind (), record_unwind_protect ();
125
126Lisp_Object funcall_lambda ();
127extern Lisp_Object ml_apply (); /* Apply a mocklisp function to unevaluated argument list */
128
129init_eval_once ()
130{
131 specpdl_size = 50;
132 specpdl = (struct specbinding *) malloc (specpdl_size * sizeof (struct specbinding));
133 max_specpdl_size = 600;
134 max_lisp_eval_depth = 200;
135}
136
137init_eval ()
138{
139 specpdl_ptr = specpdl;
140 catchlist = 0;
141 handlerlist = 0;
142 backtrace_list = 0;
143 Vquit_flag = Qnil;
144 debug_on_next_call = 0;
145 lisp_eval_depth = 0;
146 entering_debugger = 0;
147}
148
149Lisp_Object
150call_debugger (arg)
151 Lisp_Object arg;
152{
153 if (lisp_eval_depth + 20 > max_lisp_eval_depth)
154 max_lisp_eval_depth = lisp_eval_depth + 20;
155 if (specpdl_size + 40 > max_specpdl_size)
156 max_specpdl_size = specpdl_size + 40;
157 debug_on_next_call = 0;
158 entering_debugger = 1;
159 return apply1 (Vdebugger, arg);
160}
161
162do_debug_on_call (code)
163 Lisp_Object code;
164{
165 debug_on_next_call = 0;
166 backtrace_list->debug_on_exit = 1;
167 call_debugger (Fcons (code, Qnil));
168}
169\f
170/* NOTE!!! Every function that can call EVAL must protect its args
171 and temporaries from garbage collection while it needs them.
172 The definition of `For' shows what you have to do. */
173
174DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
175 "Eval args until one of them yields non-nil, then return that value.\n\
176The remaining args are not evalled at all.\n\
177If all args return nil, return nil.")
178 (args)
179 Lisp_Object args;
180{
181 register Lisp_Object val;
182 Lisp_Object args_left;
183 struct gcpro gcpro1;
184
265a9e55 185 if (NILP(args))
db9f0278
JB
186 return Qnil;
187
188 args_left = args;
189 GCPRO1 (args_left);
190
191 do
192 {
193 val = Feval (Fcar (args_left));
265a9e55 194 if (!NILP (val))
db9f0278
JB
195 break;
196 args_left = Fcdr (args_left);
197 }
265a9e55 198 while (!NILP(args_left));
db9f0278
JB
199
200 UNGCPRO;
201 return val;
202}
203
204DEFUN ("and", Fand, Sand, 0, UNEVALLED, 0,
205 "Eval args until one of them yields nil, then return nil.\n\
206The remaining args are not evalled at all.\n\
207If no arg yields nil, return the last arg's value.")
208 (args)
209 Lisp_Object args;
210{
211 register Lisp_Object val;
212 Lisp_Object args_left;
213 struct gcpro gcpro1;
214
265a9e55 215 if (NILP(args))
db9f0278
JB
216 return Qt;
217
218 args_left = args;
219 GCPRO1 (args_left);
220
221 do
222 {
223 val = Feval (Fcar (args_left));
265a9e55 224 if (NILP (val))
db9f0278
JB
225 break;
226 args_left = Fcdr (args_left);
227 }
265a9e55 228 while (!NILP(args_left));
db9f0278
JB
229
230 UNGCPRO;
231 return val;
232}
233
234DEFUN ("if", Fif, Sif, 2, UNEVALLED, 0,
235 "(if COND THEN ELSE...): if COND yields non-nil, do THEN, else do ELSE...\n\
236Returns the value of THEN or the value of the last of the ELSE's.\n\
237THEN must be one expression, but ELSE... can be zero or more expressions.\n\
238If COND yields nil, and there are no ELSE's, the value is nil.")
239 (args)
240 Lisp_Object args;
241{
242 register Lisp_Object cond;
243 struct gcpro gcpro1;
244
245 GCPRO1 (args);
246 cond = Feval (Fcar (args));
247 UNGCPRO;
248
265a9e55 249 if (!NILP (cond))
db9f0278
JB
250 return Feval (Fcar (Fcdr (args)));
251 return Fprogn (Fcdr (Fcdr (args)));
252}
253
254DEFUN ("cond", Fcond, Scond, 0, UNEVALLED, 0,
255 "(cond CLAUSES...): try each clause until one succeeds.\n\
256Each clause looks like (CONDITION BODY...). CONDITION is evaluated\n\
257and, if the value is non-nil, this clause succeeds:\n\
258then the expressions in BODY are evaluated and the last one's\n\
259value is the value of the cond-form.\n\
260If no clause succeeds, cond returns nil.\n\
261If a clause has one element, as in (CONDITION),\n\
262CONDITION's value if non-nil is returned from the cond-form.")
263 (args)
264 Lisp_Object args;
265{
266 register Lisp_Object clause, val;
267 struct gcpro gcpro1;
268
269 val = Qnil;
270 GCPRO1 (args);
265a9e55 271 while (!NILP (args))
db9f0278
JB
272 {
273 clause = Fcar (args);
274 val = Feval (Fcar (clause));
265a9e55 275 if (!NILP (val))
db9f0278
JB
276 {
277 if (!EQ (XCONS (clause)->cdr, Qnil))
278 val = Fprogn (XCONS (clause)->cdr);
279 break;
280 }
281 args = XCONS (args)->cdr;
282 }
283 UNGCPRO;
284
285 return val;
286}
287
288DEFUN ("progn", Fprogn, Sprogn, 0, UNEVALLED, 0,
289 "(progn BODY...): eval BODY forms sequentially and return value of last one.")
290 (args)
291 Lisp_Object args;
292{
293 register Lisp_Object val, tem;
294 Lisp_Object args_left;
295 struct gcpro gcpro1;
296
297 /* In Mocklisp code, symbols at the front of the progn arglist
298 are to be bound to zero. */
299 if (!EQ (Vmocklisp_arguments, Qt))
300 {
301 val = make_number (0);
265a9e55 302 while (!NILP (args) && (tem = Fcar (args), XTYPE (tem) == Lisp_Symbol))
db9f0278
JB
303 {
304 QUIT;
305 specbind (tem, val), args = Fcdr (args);
306 }
307 }
308
265a9e55 309 if (NILP(args))
db9f0278
JB
310 return Qnil;
311
312 args_left = args;
313 GCPRO1 (args_left);
314
315 do
316 {
317 val = Feval (Fcar (args_left));
318 args_left = Fcdr (args_left);
319 }
265a9e55 320 while (!NILP(args_left));
db9f0278
JB
321
322 UNGCPRO;
323 return val;
324}
325
326DEFUN ("prog1", Fprog1, Sprog1, 1, UNEVALLED, 0,
327 "(prog1 FIRST BODY...): eval FIRST and BODY sequentially; value from FIRST.\n\
328The value of FIRST is saved during the evaluation of the remaining args,\n\
329whose values are discarded.")
330 (args)
331 Lisp_Object args;
332{
333 Lisp_Object val;
334 register Lisp_Object args_left;
335 struct gcpro gcpro1, gcpro2;
336 register int argnum = 0;
337
265a9e55 338 if (NILP(args))
db9f0278
JB
339 return Qnil;
340
341 args_left = args;
342 val = Qnil;
343 GCPRO2 (args, val);
344
345 do
346 {
347 if (!(argnum++))
348 val = Feval (Fcar (args_left));
349 else
350 Feval (Fcar (args_left));
351 args_left = Fcdr (args_left);
352 }
265a9e55 353 while (!NILP(args_left));
db9f0278
JB
354
355 UNGCPRO;
356 return val;
357}
358
359DEFUN ("prog2", Fprog2, Sprog2, 2, UNEVALLED, 0,
360 "(prog1 X Y BODY...): eval X, Y and BODY sequentially; value from Y.\n\
361The value of Y is saved during the evaluation of the remaining args,\n\
362whose values are discarded.")
363 (args)
364 Lisp_Object args;
365{
366 Lisp_Object val;
367 register Lisp_Object args_left;
368 struct gcpro gcpro1, gcpro2;
369 register int argnum = -1;
370
371 val = Qnil;
372
265a9e55 373 if (NILP(args))
db9f0278
JB
374 return Qnil;
375
376 args_left = args;
377 val = Qnil;
378 GCPRO2 (args, val);
379
380 do
381 {
382 if (!(argnum++))
383 val = Feval (Fcar (args_left));
384 else
385 Feval (Fcar (args_left));
386 args_left = Fcdr (args_left);
387 }
265a9e55 388 while (!NILP(args_left));
db9f0278
JB
389
390 UNGCPRO;
391 return val;
392}
393
394DEFUN ("setq", Fsetq, Ssetq, 0, UNEVALLED, 0,
395 "(setq SYM VAL SYM VAL ...): set each SYM to the value of its VAL.\n\
396The SYMs are not evaluated. Thus (setq x y) sets x to the value of y.\n\
397Each SYM is set before the next VAL is computed.")
398 (args)
399 Lisp_Object args;
400{
401 register Lisp_Object args_left;
402 register Lisp_Object val, sym;
403 struct gcpro gcpro1;
404
265a9e55 405 if (NILP(args))
db9f0278
JB
406 return Qnil;
407
408 args_left = args;
409 GCPRO1 (args);
410
411 do
412 {
413 val = Feval (Fcar (Fcdr (args_left)));
414 sym = Fcar (args_left);
415 Fset (sym, val);
416 args_left = Fcdr (Fcdr (args_left));
417 }
265a9e55 418 while (!NILP(args_left));
db9f0278
JB
419
420 UNGCPRO;
421 return val;
422}
423
424DEFUN ("quote", Fquote, Squote, 1, UNEVALLED, 0,
425 "Return the argument, without evaluating it. `(quote x)' yields `x'.")
426 (args)
427 Lisp_Object args;
428{
429 return Fcar (args);
430}
431
432DEFUN ("function", Ffunction, Sfunction, 1, UNEVALLED, 0,
433 "Like `quote', but preferred for objects which are functions.\n\
434In byte compilation, `function' causes its argument to be compiled.\n\
435`quote' cannot do that.")
436 (args)
437 Lisp_Object args;
438{
439 return Fcar (args);
440}
441
442DEFUN ("interactive-p", Finteractive_p, Sinteractive_p, 0, 0, 0,
443 "Return t if function in which this appears was called interactively.\n\
444This means that the function was called with call-interactively (which\n\
445includes being called as the binding of a key)\n\
446and input is currently coming from the keyboard (not in keyboard macro).")
447 ()
448{
449 register struct backtrace *btp;
450 register Lisp_Object fun;
451
452 if (!INTERACTIVE)
453 return Qnil;
454
db9f0278 455 btp = backtrace_list;
daa37602
JB
456
457 /* If this isn't a byte-compiled function, there may be a frame at
458 the top for Finteractive_p itself. If so, skip it. */
459 fun = Findirect_function (*btp->function);
460 if (XTYPE (fun) == Lisp_Subr
461 && (struct Lisp_Subr *) XPNTR (fun) == &Sinteractive_p)
db9f0278 462 btp = btp->next;
daa37602
JB
463
464 /* If we're running an Emacs 18-style byte-compiled function, there
465 may be a frame for Fbytecode. Now, given the strictest
466 definition, this function isn't really being called
467 interactively, but because that's the way Emacs 18 always builds
468 byte-compiled functions, we'll accept it for now. */
469 if (EQ (*btp->function, Qbytecode))
470 btp = btp->next;
471
472 /* If this isn't a byte-compiled function, then we may now be
473 looking at several frames for special forms. Skip past them. */
474 while (btp &&
475 btp->nargs == UNEVALLED)
a6e3fa71
JB
476 btp = btp->next;
477
daa37602
JB
478 /* btp now points at the frame of the innermost function that isn't
479 a special form, ignoring frames for Finteractive_p and/or
480 Fbytecode at the top. If this frame is for a built-in function
481 (such as load or eval-region) return nil. */
ffd56f97 482 fun = Findirect_function (*btp->function);
db9f0278
JB
483 if (XTYPE (fun) == Lisp_Subr)
484 return Qnil;
485 /* btp points to the frame of a Lisp function that called interactive-p.
486 Return t if that function was called interactively. */
487 if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively))
488 return Qt;
489 return Qnil;
490}
491
492DEFUN ("defun", Fdefun, Sdefun, 2, UNEVALLED, 0,
493 "(defun NAME ARGLIST [DOCSTRING] BODY...): define NAME as a function.\n\
494The definition is (lambda ARGLIST [DOCSTRING] BODY...).\n\
495See also the function `interactive'.")
496 (args)
497 Lisp_Object args;
498{
499 register Lisp_Object fn_name;
500 register Lisp_Object defn;
501
502 fn_name = Fcar (args);
503 defn = Fcons (Qlambda, Fcdr (args));
265a9e55 504 if (!NILP (Vpurify_flag))
db9f0278
JB
505 defn = Fpurecopy (defn);
506 Ffset (fn_name, defn);
507 return fn_name;
508}
509
510DEFUN ("defmacro", Fdefmacro, Sdefmacro, 2, UNEVALLED, 0,
511 "(defmacro NAME ARGLIST [DOCSTRING] BODY...): define NAME as a macro.\n\
512The definition is (macro lambda ARGLIST [DOCSTRING] BODY...).\n\
513When the macro is called, as in (NAME ARGS...),\n\
514the function (lambda ARGLIST BODY...) is applied to\n\
515the list ARGS... as it appears in the expression,\n\
516and the result should be a form to be evaluated instead of the original.")
517 (args)
518 Lisp_Object args;
519{
520 register Lisp_Object fn_name;
521 register Lisp_Object defn;
522
523 fn_name = Fcar (args);
524 defn = Fcons (Qmacro, Fcons (Qlambda, Fcdr (args)));
265a9e55 525 if (!NILP (Vpurify_flag))
db9f0278
JB
526 defn = Fpurecopy (defn);
527 Ffset (fn_name, defn);
528 return fn_name;
529}
530
531DEFUN ("defvar", Fdefvar, Sdefvar, 1, UNEVALLED, 0,
532 "(defvar SYMBOL INITVALUE DOCSTRING): define SYMBOL as a variable.\n\
533You are not required to define a variable in order to use it,\n\
534but the definition can supply documentation and an initial value\n\
535in a way that tags can recognize.\n\n\
536INITVALUE is evaluated, and used to set SYMBOL, only if SYMBOL's value is void.\n\
06ef7355
RS
537If SYMBOL is buffer-local, its default value is what is set;\n\
538 buffer-local values are not affected.\n\
db9f0278
JB
539INITVALUE and DOCSTRING are optional.\n\
540If DOCSTRING starts with *, this variable is identified as a user option.\n\
541 This means that M-x set-variable and M-x edit-options recognize it.\n\
542If INITVALUE is missing, SYMBOL's value is not set.")
543 (args)
544 Lisp_Object args;
545{
546 register Lisp_Object sym, tem;
547
548 sym = Fcar (args);
549 tem = Fcdr (args);
265a9e55 550 if (!NILP (tem))
db9f0278
JB
551 {
552 tem = Fdefault_boundp (sym);
265a9e55 553 if (NILP (tem))
db9f0278
JB
554 Fset_default (sym, Feval (Fcar (Fcdr (args))));
555 }
556 tem = Fcar (Fcdr (Fcdr (args)));
265a9e55 557 if (!NILP (tem))
db9f0278 558 {
265a9e55 559 if (!NILP (Vpurify_flag))
db9f0278
JB
560 tem = Fpurecopy (tem);
561 Fput (sym, Qvariable_documentation, tem);
562 }
563 return sym;
564}
565
566DEFUN ("defconst", Fdefconst, Sdefconst, 2, UNEVALLED, 0,
567 "(defconst SYMBOL INITVALUE DOCSTRING): define SYMBOL as a constant variable.\n\
568The intent is that programs do not change this value, but users may.\n\
569Always sets the value of SYMBOL to the result of evalling INITVALUE.\n\
06ef7355
RS
570If SYMBOL is buffer-local, its default value is what is set;\n\
571 buffer-local values are not affected.\n\
db9f0278
JB
572DOCSTRING is optional.\n\
573If DOCSTRING starts with *, this variable is identified as a user option.\n\
574 This means that M-x set-variable and M-x edit-options recognize it.\n\n\
575Note: do not use `defconst' for user options in libraries that are not\n\
576normally loaded, since it is useful for users to be able to specify\n\
577their own values for such variables before loading the library.\n\
578Since `defconst' unconditionally assigns the variable,\n\
579it would override the user's choice.")
580 (args)
581 Lisp_Object args;
582{
583 register Lisp_Object sym, tem;
584
585 sym = Fcar (args);
586 Fset_default (sym, Feval (Fcar (Fcdr (args))));
587 tem = Fcar (Fcdr (Fcdr (args)));
265a9e55 588 if (!NILP (tem))
db9f0278 589 {
265a9e55 590 if (!NILP (Vpurify_flag))
db9f0278
JB
591 tem = Fpurecopy (tem);
592 Fput (sym, Qvariable_documentation, tem);
593 }
594 return sym;
595}
596
597DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
598 "Returns t if VARIABLE is intended to be set and modified by users.\n\
599\(The alternative is a variable used internally in a Lisp program.)\n\
600Determined by whether the first character of the documentation\n\
601for the variable is \"*\"")
602 (variable)
603 Lisp_Object variable;
604{
605 Lisp_Object documentation;
606
607 documentation = Fget (variable, Qvariable_documentation);
608 if (XTYPE (documentation) == Lisp_Int && XINT (documentation) < 0)
609 return Qt;
610 if ((XTYPE (documentation) == Lisp_String) &&
611 ((unsigned char) XSTRING (documentation)->data[0] == '*'))
612 return Qt;
613 return Qnil;
614}
615\f
616DEFUN ("let*", FletX, SletX, 1, UNEVALLED, 0,
617 "(let* VARLIST BODY...): bind variables according to VARLIST then eval BODY.\n\
618The value of the last form in BODY is returned.\n\
619Each element of VARLIST is a symbol (which is bound to nil)\n\
620or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\
621Each VALUEFORM can refer to the symbols already bound by this VARLIST.")
622 (args)
623 Lisp_Object args;
624{
625 Lisp_Object varlist, val, elt;
626 int count = specpdl_ptr - specpdl;
627 struct gcpro gcpro1, gcpro2, gcpro3;
628
629 GCPRO3 (args, elt, varlist);
630
631 varlist = Fcar (args);
265a9e55 632 while (!NILP (varlist))
db9f0278
JB
633 {
634 QUIT;
635 elt = Fcar (varlist);
636 if (XTYPE (elt) == Lisp_Symbol)
637 specbind (elt, Qnil);
08564963
JB
638 else if (! NILP (Fcdr (Fcdr (elt))))
639 Fsignal (Qerror,
640 Fcons (build_string ("`let' bindings can have only one value-form"),
641 elt));
db9f0278
JB
642 else
643 {
644 val = Feval (Fcar (Fcdr (elt)));
645 specbind (Fcar (elt), val);
646 }
647 varlist = Fcdr (varlist);
648 }
649 UNGCPRO;
650 val = Fprogn (Fcdr (args));
651 return unbind_to (count, val);
652}
653
654DEFUN ("let", Flet, Slet, 1, UNEVALLED, 0,
655 "(let VARLIST BODY...): bind variables according to VARLIST then eval BODY.\n\
656The value of the last form in BODY is returned.\n\
657Each element of VARLIST is a symbol (which is bound to nil)\n\
658or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\
659All the VALUEFORMs are evalled before any symbols are bound.")
660 (args)
661 Lisp_Object args;
662{
663 Lisp_Object *temps, tem;
664 register Lisp_Object elt, varlist;
665 int count = specpdl_ptr - specpdl;
666 register int argnum;
667 struct gcpro gcpro1, gcpro2;
668
669 varlist = Fcar (args);
670
671 /* Make space to hold the values to give the bound variables */
672 elt = Flength (varlist);
673 temps = (Lisp_Object *) alloca (XFASTINT (elt) * sizeof (Lisp_Object));
674
675 /* Compute the values and store them in `temps' */
676
677 GCPRO2 (args, *temps);
678 gcpro2.nvars = 0;
679
265a9e55 680 for (argnum = 0; !NILP (varlist); varlist = Fcdr (varlist))
db9f0278
JB
681 {
682 QUIT;
683 elt = Fcar (varlist);
684 if (XTYPE (elt) == Lisp_Symbol)
685 temps [argnum++] = Qnil;
08564963
JB
686 else if (! NILP (Fcdr (Fcdr (elt))))
687 Fsignal (Qerror,
688 Fcons (build_string ("`let' bindings can have only one value-form"),
689 elt));
db9f0278
JB
690 else
691 temps [argnum++] = Feval (Fcar (Fcdr (elt)));
692 gcpro2.nvars = argnum;
693 }
694 UNGCPRO;
695
696 varlist = Fcar (args);
265a9e55 697 for (argnum = 0; !NILP (varlist); varlist = Fcdr (varlist))
db9f0278
JB
698 {
699 elt = Fcar (varlist);
700 tem = temps[argnum++];
701 if (XTYPE (elt) == Lisp_Symbol)
702 specbind (elt, tem);
703 else
704 specbind (Fcar (elt), tem);
705 }
706
707 elt = Fprogn (Fcdr (args));
708 return unbind_to (count, elt);
709}
710
711DEFUN ("while", Fwhile, Swhile, 1, UNEVALLED, 0,
712 "(while TEST BODY...): if TEST yields non-nil, eval BODY... and repeat.\n\
713The order of execution is thus TEST, BODY, TEST, BODY and so on\n\
714until TEST returns nil.")
715 (args)
716 Lisp_Object args;
717{
718 Lisp_Object test, body, tem;
719 struct gcpro gcpro1, gcpro2;
720
721 GCPRO2 (test, body);
722
723 test = Fcar (args);
724 body = Fcdr (args);
265a9e55 725 while (tem = Feval (test), !NILP (tem))
db9f0278
JB
726 {
727 QUIT;
728 Fprogn (body);
729 }
730
731 UNGCPRO;
732 return Qnil;
733}
734
735DEFUN ("macroexpand", Fmacroexpand, Smacroexpand, 1, 2, 0,
736 "Return result of expanding macros at top level of FORM.\n\
737If FORM is not a macro call, it is returned unchanged.\n\
738Otherwise, the macro is expanded and the expansion is considered\n\
739in place of FORM. When a non-macro-call results, it is returned.\n\n\
740The second optional arg ENVIRONMENT species an environment of macro\n\
741definitions to shadow the loaded ones for use in file byte-compilation.")
742 (form, env)
743 register Lisp_Object form;
744 Lisp_Object env;
745{
746 register Lisp_Object expander, sym, def, tem;
747
748 while (1)
749 {
750 /* Come back here each time we expand a macro call,
751 in case it expands into another macro call. */
752 if (XTYPE (form) != Lisp_Cons)
753 break;
754 sym = XCONS (form)->car;
755 /* Detect ((macro lambda ...) ...) */
756 if (XTYPE (sym) == Lisp_Cons
757 && EQ (XCONS (sym)->car, Qmacro))
758 {
759 expander = XCONS (sym)->cdr;
760 goto explicit;
761 }
762 if (XTYPE (sym) != Lisp_Symbol)
763 break;
764 /* Trace symbols aliases to other symbols
765 until we get a symbol that is not an alias. */
766 while (1)
767 {
768 QUIT;
769 tem = Fassq (sym, env);
265a9e55 770 if (NILP (tem))
db9f0278
JB
771 {
772 def = XSYMBOL (sym)->function;
773 if (XTYPE (def) == Lisp_Symbol && !EQ (def, Qunbound))
774 sym = def;
775 else
776 break;
777 }
778 else
779 {
780#if 0 /* This is turned off because it caused an element (foo . bar)
781 to have the effect of defining foo as an alias for the macro bar.
782 That is inconsistent; bar should be a function to expand foo. */
783 if (XTYPE (tem) == Lisp_Cons
784 && XTYPE (XCONS (tem)->cdr) == Lisp_Symbol)
785 sym = XCONS (tem)->cdr;
786 else
787#endif
788 break;
789 }
790 }
791 /* Right now TEM is the result from SYM in ENV,
792 and if TEM is nil then DEF is SYM's function definition. */
265a9e55 793 if (NILP (tem))
db9f0278
JB
794 {
795 /* SYM is not mentioned in ENV.
796 Look at its function definition. */
797 if (EQ (def, Qunbound)
798 || XTYPE (def) != Lisp_Cons)
799 /* Not defined or definition not suitable */
800 break;
801 if (EQ (XCONS (def)->car, Qautoload))
802 {
803 /* Autoloading function: will it be a macro when loaded? */
804 tem = Fcar (Fnthcdr (make_number (4), def));
265a9e55 805 if (NILP (tem))
db9f0278
JB
806 break;
807 /* Yes, load it and try again. */
808 do_autoload (def, sym);
809 continue;
810 }
811 else if (!EQ (XCONS (def)->car, Qmacro))
812 break;
813 else expander = XCONS (def)->cdr;
814 }
815 else
816 {
817 expander = XCONS (tem)->cdr;
265a9e55 818 if (NILP (expander))
db9f0278
JB
819 break;
820 }
821 explicit:
822 form = apply1 (expander, XCONS (form)->cdr);
823 }
824 return form;
825}
826\f
827DEFUN ("catch", Fcatch, Scatch, 1, UNEVALLED, 0,
828 "(catch TAG BODY...): eval BODY allowing nonlocal exits using `throw'.\n\
829TAG is evalled to get the tag to use. Then the BODY is executed.\n\
830Within BODY, (throw TAG) with same tag exits BODY and exits this `catch'.\n\
831If no throw happens, `catch' returns the value of the last BODY form.\n\
832If a throw happens, it specifies the value to return from `catch'.")
833 (args)
834 Lisp_Object args;
835{
836 register Lisp_Object tag;
837 struct gcpro gcpro1;
838
839 GCPRO1 (args);
840 tag = Feval (Fcar (args));
841 UNGCPRO;
842 return internal_catch (tag, Fprogn, Fcdr (args));
843}
844
845/* Set up a catch, then call C function FUNC on argument ARG.
846 FUNC should return a Lisp_Object.
847 This is how catches are done from within C code. */
848
849Lisp_Object
850internal_catch (tag, func, arg)
851 Lisp_Object tag;
852 Lisp_Object (*func) ();
853 Lisp_Object arg;
854{
855 /* This structure is made part of the chain `catchlist'. */
856 struct catchtag c;
857
858 /* Fill in the components of c, and put it on the list. */
859 c.next = catchlist;
860 c.tag = tag;
861 c.val = Qnil;
862 c.backlist = backtrace_list;
863 c.handlerlist = handlerlist;
864 c.lisp_eval_depth = lisp_eval_depth;
865 c.pdlcount = specpdl_ptr - specpdl;
866 c.poll_suppress_count = poll_suppress_count;
867 c.gcpro = gcprolist;
868 catchlist = &c;
869
870 /* Call FUNC. */
871 if (! _setjmp (c.jmp))
872 c.val = (*func) (arg);
873
874 /* Throw works by a longjmp that comes right here. */
875 catchlist = c.next;
876 return c.val;
877}
878
879/* Discard from the catchlist all catch tags back through CATCH.
880 Before each catch is discarded, unbind all special bindings
881 made within that catch. Also, when discarding a catch that
882 corresponds to a condition handler, discard that handler.
883
884 At the end, restore some static info saved in CATCH.
885
886 This is used for correct unwinding in Fthrow and Fsignal,
887 before doing the longjmp that actually destroys the stack frames
888 in which these handlers and catches reside. */
889
890static void
891unbind_catch (catch)
892 struct catchtag *catch;
893{
894 register int last_time;
895
896 do
897 {
898 last_time = catchlist == catch;
899 unbind_to (catchlist->pdlcount, Qnil);
900 handlerlist = catchlist->handlerlist;
901 catchlist = catchlist->next;
902 }
903 while (! last_time);
904
905 gcprolist = catch->gcpro;
906 backtrace_list = catch->backlist;
907 lisp_eval_depth = catch->lisp_eval_depth;
908}
909
910DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0,
911 "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\
912Both TAG and VALUE are evalled.")
913 (tag, val)
914 register Lisp_Object tag, val;
915{
916 register struct catchtag *c;
917
918 while (1)
919 {
265a9e55 920 if (!NILP (tag))
db9f0278
JB
921 for (c = catchlist; c; c = c->next)
922 {
923 if (EQ (c->tag, tag))
924 {
925 /* Restore the polling-suppression count. */
926 if (c->poll_suppress_count > poll_suppress_count)
927 abort ();
928 while (c->poll_suppress_count < poll_suppress_count)
929 start_polling ();
930 c->val = val;
931 unbind_catch (c);
932 _longjmp (c->jmp, 1);
933 }
934 }
935 tag = Fsignal (Qno_catch, Fcons (tag, Fcons (val, Qnil)));
936 }
937}
938
939
940DEFUN ("unwind-protect", Funwind_protect, Sunwind_protect, 1, UNEVALLED, 0,
941 "Do BODYFORM, protecting with UNWINDFORMS.\n\
942Usage looks like (unwind-protect BODYFORM UNWINDFORMS...).\n\
943If BODYFORM completes normally, its value is returned\n\
944after executing the UNWINDFORMS.\n\
945If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.")
946 (args)
947 Lisp_Object args;
948{
949 Lisp_Object val;
950 int count = specpdl_ptr - specpdl;
951
952 record_unwind_protect (0, Fcdr (args));
953 val = Feval (Fcar (args));
954 return unbind_to (count, val);
955}
956\f
957/* Chain of condition handlers currently in effect.
958 The elements of this chain are contained in the stack frames
959 of Fcondition_case and internal_condition_case.
960 When an error is signaled (by calling Fsignal, below),
961 this chain is searched for an element that applies. */
962
963struct handler *handlerlist;
964
965DEFUN ("condition-case", Fcondition_case, Scondition_case, 2, UNEVALLED, 0,
966 "Regain control when an error is signaled.\n\
967Usage looks like (condition-case VAR BODYFORM HANDLERS...).\n\
968executes BODYFORM and returns its value if no error happens.\n\
969Each element of HANDLERS looks like (CONDITION-NAME BODY...)\n\
970where the BODY is made of Lisp expressions.\n\n\
971A handler is applicable to an error\n\
972if CONDITION-NAME is one of the error's condition names.\n\
973If an error happens, the first applicable handler is run.\n\
974\n\
975When a handler handles an error,\n\
976control returns to the condition-case and the handler BODY... is executed\n\
977with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).\n\
978VAR may be nil; then you do not get access to the signal information.\n\
979\n\
980The value of the last BODY form is returned from the condition-case.\n\
981See also the function `signal' for more info.")
982 (args)
983 Lisp_Object args;
984{
985 Lisp_Object val;
986 struct catchtag c;
987 struct handler h;
988 register Lisp_Object tem;
989
990 tem = Fcar (args);
991 CHECK_SYMBOL (tem, 0);
992
993 c.tag = Qnil;
994 c.val = Qnil;
995 c.backlist = backtrace_list;
996 c.handlerlist = handlerlist;
997 c.lisp_eval_depth = lisp_eval_depth;
998 c.pdlcount = specpdl_ptr - specpdl;
999 c.poll_suppress_count = poll_suppress_count;
1000 c.gcpro = gcprolist;
1001 if (_setjmp (c.jmp))
1002 {
265a9e55 1003 if (!NILP (h.var))
db9f0278
JB
1004 specbind (h.var, Fcdr (c.val));
1005 val = Fprogn (Fcdr (Fcar (c.val)));
1006 unbind_to (c.pdlcount, Qnil);
1007 return val;
1008 }
1009 c.next = catchlist;
1010 catchlist = &c;
1011 h.var = Fcar (args);
1012 h.handler = Fcdr (Fcdr (args));
1013
265a9e55 1014 for (val = h.handler; ! NILP (val); val = Fcdr (val))
db9f0278
JB
1015 {
1016 tem = Fcar (val);
265a9e55 1017 if ((!NILP (tem)) &&
db9f0278
JB
1018 (!CONSP (tem) || (XTYPE (XCONS (tem)->car) != Lisp_Symbol)))
1019 error ("Invalid condition handler", tem);
1020 }
1021
1022 h.next = handlerlist;
1023 h.poll_suppress_count = poll_suppress_count;
1024 h.tag = &c;
1025 handlerlist = &h;
1026
1027 val = Feval (Fcar (Fcdr (args)));
1028 catchlist = c.next;
1029 handlerlist = h.next;
1030 return val;
1031}
1032
1033Lisp_Object
1034internal_condition_case (bfun, handlers, hfun)
1035 Lisp_Object (*bfun) ();
1036 Lisp_Object handlers;
1037 Lisp_Object (*hfun) ();
1038{
1039 Lisp_Object val;
1040 struct catchtag c;
1041 struct handler h;
1042
1043 c.tag = Qnil;
1044 c.val = Qnil;
1045 c.backlist = backtrace_list;
1046 c.handlerlist = handlerlist;
1047 c.lisp_eval_depth = lisp_eval_depth;
1048 c.pdlcount = specpdl_ptr - specpdl;
1049 c.poll_suppress_count = poll_suppress_count;
1050 c.gcpro = gcprolist;
1051 if (_setjmp (c.jmp))
1052 {
1053 return (*hfun) (Fcdr (c.val));
1054 }
1055 c.next = catchlist;
1056 catchlist = &c;
1057 h.handler = handlers;
1058 h.var = Qnil;
1059 h.poll_suppress_count = poll_suppress_count;
1060 h.next = handlerlist;
1061 h.tag = &c;
1062 handlerlist = &h;
1063
1064 val = (*bfun) ();
1065 catchlist = c.next;
1066 handlerlist = h.next;
1067 return val;
1068}
1069
1070static Lisp_Object find_handler_clause ();
1071
1072DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0,
1073 "Signal an error. Args are SIGNAL-NAME, and associated DATA.\n\
1074This function does not return.\n\n\
1075A signal name is a symbol with an `error-conditions' property\n\
1076that is a list of condition names.\n\
1077A handler for any of those names will get to handle this signal.\n\
1078The symbol `error' should normally be one of them.\n\
1079\n\
1080DATA should be a list. Its elements are printed as part of the error message.\n\
1081If the signal is handled, DATA is made available to the handler.\n\
1082See also the function `condition-case'.")
1083 (sig, data)
1084 Lisp_Object sig, data;
1085{
1086 register struct handler *allhandlers = handlerlist;
1087 Lisp_Object conditions;
1088 extern int gc_in_progress;
1089 extern int waiting_for_input;
1090 Lisp_Object debugger_value;
1091
1092 quit_error_check ();
1093 immediate_quit = 0;
1094 if (gc_in_progress || waiting_for_input)
1095 abort ();
1096
1097 TOTALLY_UNBLOCK_INPUT;
1098
1099 conditions = Fget (sig, Qerror_conditions);
1100
1101 for (; handlerlist; handlerlist = handlerlist->next)
1102 {
1103 register Lisp_Object clause;
1104 clause = find_handler_clause (handlerlist->handler, conditions,
1105 sig, data, &debugger_value);
1106
1107#if 0 /* Most callers are not prepared to handle gc if this returns.
1108 So, since this feature is not very useful, take it out. */
1109 /* If have called debugger and user wants to continue,
1110 just return nil. */
1111 if (EQ (clause, Qlambda))
1112 return debugger_value;
1113#else
1114 if (EQ (clause, Qlambda))
1115 error ("Returning a value from an error is no longer supported");
1116#endif
1117
265a9e55 1118 if (!NILP (clause))
db9f0278
JB
1119 {
1120 struct handler *h = handlerlist;
1121 /* Restore the polling-suppression count. */
1122 if (h->poll_suppress_count > poll_suppress_count)
1123 abort ();
1124 while (h->poll_suppress_count < poll_suppress_count)
1125 start_polling ();
1126 handlerlist = allhandlers;
1127 unbind_catch (h->tag);
1128 h->tag->val = Fcons (clause, Fcons (sig, data));
1129 _longjmp (h->tag->jmp, 1);
1130 }
1131 }
1132
1133 handlerlist = allhandlers;
1134 /* If no handler is present now, try to run the debugger,
1135 and if that fails, throw to top level. */
1136 find_handler_clause (Qerror, conditions, sig, data, &debugger_value);
1137 Fthrow (Qtop_level, Qt);
1138}
1139
128c0f66
RM
1140/* Return nonzero iff LIST is a non-nil atom or
1141 a list containing one of CONDITIONS. */
1142
1143static int
1144wants_debugger (list, conditions)
1145 Lisp_Object list, conditions;
1146{
1147 static int looking = 0;
1148
1149 if (looking)
1150 {
1151 /* We got an error while looking in LIST. */
1152 looking = 0;
1153 return 1;
1154 }
1155
4de86b16 1156 if (NILP (list))
128c0f66
RM
1157 return 0;
1158 if (! CONSP (list))
1159 return 1;
1160
1161 looking = 1;
4de86b16 1162 while (!NILP (conditions))
128c0f66
RM
1163 {
1164 Lisp_Object tem;
1165 tem = Fmemq (XCONS (conditions)->car, list);
4de86b16 1166 if (! NILP (tem))
128c0f66
RM
1167 {
1168 looking = 0;
1169 return 1;
1170 }
1171 conditions = XCONS (conditions)->cdr;
1172 }
1173}
1174
1175/* Value of Qlambda means we have called debugger and user has continued.
1176 Store value returned from debugger into *DEBUGGER_VALUE_PTR. */
db9f0278
JB
1177
1178static Lisp_Object
1179find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr)
1180 Lisp_Object handlers, conditions, sig, data;
1181 Lisp_Object *debugger_value_ptr;
1182{
1183 register Lisp_Object h;
1184 register Lisp_Object tem;
1185 register Lisp_Object tem1;
1186
1187 if (EQ (handlers, Qt)) /* t is used by handlers for all conditions, set up by C code. */
1188 return Qt;
1189 if (EQ (handlers, Qerror)) /* error is used similarly, but means display a backtrace too */
1190 {
128c0f66 1191 if (wants_debugger (Vstack_trace_on_error, conditions))
db9f0278
JB
1192 internal_with_output_to_temp_buffer ("*Backtrace*", Fbacktrace, Qnil);
1193 if (!entering_debugger
128c0f66
RM
1194 && ((EQ (sig, Qquit) && debug_on_quit)
1195 || wants_debugger (Vdebug_on_error, conditions)))
db9f0278
JB
1196 {
1197 int count = specpdl_ptr - specpdl;
1198 specbind (Qdebug_on_error, Qnil);
1199 *debugger_value_ptr =
1200 call_debugger (Fcons (Qerror,
1201 Fcons (Fcons (sig, data),
1202 Qnil)));
1203 return unbind_to (count, Qlambda);
1204 }
1205 return Qt;
1206 }
1207 for (h = handlers; CONSP (h); h = Fcdr (h))
1208 {
1209 tem1 = Fcar (h);
1210 if (!CONSP (tem1))
1211 continue;
1212 tem = Fmemq (Fcar (tem1), conditions);
265a9e55 1213 if (!NILP (tem))
db9f0278
JB
1214 return tem1;
1215 }
1216 return Qnil;
1217}
1218
1219/* dump an error message; called like printf */
1220
1221/* VARARGS 1 */
1222void
1223error (m, a1, a2, a3)
1224 char *m;
1225{
1226 char buf[200];
1227 sprintf (buf, m, a1, a2, a3);
1228
1229 while (1)
1230 Fsignal (Qerror, Fcons (build_string (buf), Qnil));
1231}
1232\f
1233DEFUN ("commandp", Fcommandp, Scommandp, 1, 1, 0,
1234 "T if FUNCTION makes provisions for interactive calling.\n\
1235This means it contains a description for how to read arguments to give it.\n\
1236The value is nil for an invalid function or a symbol with no function\n\
1237definition.\n\
1238\n\
1239Interactively callable functions include strings and vectors (treated\n\
1240as keyboard macros), lambda-expressions that contain a top-level call\n\
1241to `interactive', autoload definitions made by `autoload' with non-nil\n\
1242fourth argument, and some of the built-in functions of Lisp.\n\
1243\n\
1244Also, a symbol satisfies `commandp' if its function definition does so.")
1245 (function)
1246 Lisp_Object function;
1247{
1248 register Lisp_Object fun;
1249 register Lisp_Object funcar;
1250 register Lisp_Object tem;
1251 register int i = 0;
1252
1253 fun = function;
1254
ffd56f97
JB
1255 fun = indirect_function (fun);
1256 if (EQ (fun, Qunbound))
1257 return Qnil;
db9f0278
JB
1258
1259 /* Emacs primitives are interactive if their DEFUN specifies an
1260 interactive spec. */
1261 if (XTYPE (fun) == Lisp_Subr)
1262 {
1263 if (XSUBR (fun)->prompt)
1264 return Qt;
1265 else
1266 return Qnil;
1267 }
1268
1269 /* Bytecode objects are interactive if they are long enough to
1270 have an element whose index is COMPILED_INTERACTIVE, which is
1271 where the interactive spec is stored. */
1272 else if (XTYPE (fun) == Lisp_Compiled)
1273 return (XVECTOR (fun)->size > COMPILED_INTERACTIVE
1274 ? Qt : Qnil);
1275
1276 /* Strings and vectors are keyboard macros. */
1277 if (XTYPE (fun) == Lisp_String
1278 || XTYPE (fun) == Lisp_Vector)
1279 return Qt;
1280
1281 /* Lists may represent commands. */
1282 if (!CONSP (fun))
1283 return Qnil;
1284 funcar = Fcar (fun);
1285 if (XTYPE (funcar) != Lisp_Symbol)
1286 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1287 if (EQ (funcar, Qlambda))
1288 return Fassq (Qinteractive, Fcdr (Fcdr (fun)));
1289 if (EQ (funcar, Qmocklisp))
1290 return Qt; /* All mocklisp functions can be called interactively */
1291 if (EQ (funcar, Qautoload))
1292 return Fcar (Fcdr (Fcdr (Fcdr (fun))));
1293 else
1294 return Qnil;
1295}
1296
1297/* ARGSUSED */
1298DEFUN ("autoload", Fautoload, Sautoload, 2, 5, 0,
1299 "Define FUNCTION to autoload from FILE.\n\
1300FUNCTION is a symbol; FILE is a file name string to pass to `load'.\n\
1301Third arg DOCSTRING is documentation for the function.\n\
1302Fourth arg INTERACTIVE if non-nil says function can be called interactively.\n\
1303Fifth arg MACRO if non-nil says the function is really a macro.\n\
1304Third through fifth args give info about the real definition.\n\
1305They default to nil.\n\
1306If FUNCTION is already defined other than as an autoload,\n\
1307this does nothing and returns nil.")
1308 (function, file, docstring, interactive, macro)
1309 Lisp_Object function, file, docstring, interactive, macro;
1310{
1311#ifdef NO_ARG_ARRAY
1312 Lisp_Object args[4];
1313#endif
1314
1315 CHECK_SYMBOL (function, 0);
1316 CHECK_STRING (file, 1);
1317
1318 /* If function is defined and not as an autoload, don't override */
1319 if (!EQ (XSYMBOL (function)->function, Qunbound)
1320 && !(XTYPE (XSYMBOL (function)->function) == Lisp_Cons
1321 && EQ (XCONS (XSYMBOL (function)->function)->car, Qautoload)))
1322 return Qnil;
1323
1324#ifdef NO_ARG_ARRAY
1325 args[0] = file;
1326 args[1] = docstring;
1327 args[2] = interactive;
1328 args[3] = macro;
1329
1330 return Ffset (function, Fcons (Qautoload, Flist (4, &args[0])));
1331#else /* NO_ARG_ARRAY */
1332 return Ffset (function, Fcons (Qautoload, Flist (4, &file)));
1333#endif /* not NO_ARG_ARRAY */
1334}
1335
1336Lisp_Object
1337un_autoload (oldqueue)
1338 Lisp_Object oldqueue;
1339{
1340 register Lisp_Object queue, first, second;
1341
1342 /* Queue to unwind is current value of Vautoload_queue.
1343 oldqueue is the shadowed value to leave in Vautoload_queue. */
1344 queue = Vautoload_queue;
1345 Vautoload_queue = oldqueue;
1346 while (CONSP (queue))
1347 {
1348 first = Fcar (queue);
1349 second = Fcdr (first);
1350 first = Fcar (first);
1351 if (EQ (second, Qnil))
1352 Vfeatures = first;
1353 else
1354 Ffset (first, second);
1355 queue = Fcdr (queue);
1356 }
1357 return Qnil;
1358}
1359
1360do_autoload (fundef, funname)
1361 Lisp_Object fundef, funname;
1362{
1363 int count = specpdl_ptr - specpdl;
1364 Lisp_Object fun, val;
1365
1366 fun = funname;
1367 CHECK_SYMBOL (funname, 0);
1368
1369 /* Value saved here is to be restored into Vautoload_queue */
1370 record_unwind_protect (un_autoload, Vautoload_queue);
1371 Vautoload_queue = Qt;
1372 Fload (Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil);
1373 /* Once loading finishes, don't undo it. */
1374 Vautoload_queue = Qt;
1375 unbind_to (count, Qnil);
1376
ffd56f97
JB
1377 fun = Findirect_function (fun);
1378
db9f0278
JB
1379 if (XTYPE (fun) == Lisp_Cons
1380 && EQ (XCONS (fun)->car, Qautoload))
1381 error ("Autoloading failed to define function %s",
1382 XSYMBOL (funname)->name->data);
1383}
1384\f
1385DEFUN ("eval", Feval, Seval, 1, 1, 0,
1386 "Evaluate FORM and return its value.")
1387 (form)
1388 Lisp_Object form;
1389{
1390 Lisp_Object fun, val, original_fun, original_args;
1391 Lisp_Object funcar;
1392 struct backtrace backtrace;
1393 struct gcpro gcpro1, gcpro2, gcpro3;
1394
1395 if (XTYPE (form) == Lisp_Symbol)
1396 {
1397 if (EQ (Vmocklisp_arguments, Qt))
1398 return Fsymbol_value (form);
1399 val = Fsymbol_value (form);
265a9e55 1400 if (NILP (val))
db9f0278
JB
1401 XFASTINT (val) = 0;
1402 else if (EQ (val, Qt))
1403 XFASTINT (val) = 1;
1404 return val;
1405 }
1406 if (!CONSP (form))
1407 return form;
1408
1409 QUIT;
1410 if (consing_since_gc > gc_cons_threshold)
1411 {
1412 GCPRO1 (form);
1413 Fgarbage_collect ();
1414 UNGCPRO;
1415 }
1416
1417 if (++lisp_eval_depth > max_lisp_eval_depth)
1418 {
1419 if (max_lisp_eval_depth < 100)
1420 max_lisp_eval_depth = 100;
1421 if (lisp_eval_depth > max_lisp_eval_depth)
1422 error ("Lisp nesting exceeds max-lisp-eval-depth");
1423 }
1424
1425 original_fun = Fcar (form);
1426 original_args = Fcdr (form);
1427
1428 backtrace.next = backtrace_list;
1429 backtrace_list = &backtrace;
1430 backtrace.function = &original_fun; /* This also protects them from gc */
1431 backtrace.args = &original_args;
1432 backtrace.nargs = UNEVALLED;
1433 backtrace.evalargs = 1;
1434 backtrace.debug_on_exit = 0;
1435
1436 if (debug_on_next_call)
1437 do_debug_on_call (Qt);
1438
1439 /* At this point, only original_fun and original_args
1440 have values that will be used below */
1441 retry:
ffd56f97 1442 fun = Findirect_function (original_fun);
db9f0278
JB
1443
1444 if (XTYPE (fun) == Lisp_Subr)
1445 {
1446 Lisp_Object numargs;
1447 Lisp_Object argvals[7];
1448 Lisp_Object args_left;
1449 register int i, maxargs;
1450
1451 args_left = original_args;
1452 numargs = Flength (args_left);
1453
1454 if (XINT (numargs) < XSUBR (fun)->min_args ||
1455 (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs)))
1456 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1457
1458 if (XSUBR (fun)->max_args == UNEVALLED)
1459 {
1460 backtrace.evalargs = 0;
1461 val = (*XSUBR (fun)->function) (args_left);
1462 goto done;
1463 }
1464
1465 if (XSUBR (fun)->max_args == MANY)
1466 {
1467 /* Pass a vector of evaluated arguments */
1468 Lisp_Object *vals;
1469 register int argnum = 0;
1470
1471 vals = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1472
1473 GCPRO3 (args_left, fun, fun);
1474 gcpro3.var = vals;
1475 gcpro3.nvars = 0;
1476
265a9e55 1477 while (!NILP (args_left))
db9f0278
JB
1478 {
1479 vals[argnum++] = Feval (Fcar (args_left));
1480 args_left = Fcdr (args_left);
1481 gcpro3.nvars = argnum;
1482 }
db9f0278
JB
1483
1484 backtrace.args = vals;
1485 backtrace.nargs = XINT (numargs);
1486
1487 val = (*XSUBR (fun)->function) (XINT (numargs), vals);
a6e3fa71 1488 UNGCPRO;
db9f0278
JB
1489 goto done;
1490 }
1491
1492 GCPRO3 (args_left, fun, fun);
1493 gcpro3.var = argvals;
1494 gcpro3.nvars = 0;
1495
1496 maxargs = XSUBR (fun)->max_args;
1497 for (i = 0; i < maxargs; args_left = Fcdr (args_left))
1498 {
1499 argvals[i] = Feval (Fcar (args_left));
1500 gcpro3.nvars = ++i;
1501 }
1502
1503 UNGCPRO;
1504
1505 backtrace.args = argvals;
1506 backtrace.nargs = XINT (numargs);
1507
1508 switch (i)
1509 {
1510 case 0:
1511 val = (*XSUBR (fun)->function) ();
1512 goto done;
1513 case 1:
1514 val = (*XSUBR (fun)->function) (argvals[0]);
1515 goto done;
1516 case 2:
1517 val = (*XSUBR (fun)->function) (argvals[0], argvals[1]);
1518 goto done;
1519 case 3:
1520 val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1521 argvals[2]);
1522 goto done;
1523 case 4:
1524 val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1525 argvals[2], argvals[3]);
1526 goto done;
1527 case 5:
1528 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1529 argvals[3], argvals[4]);
1530 goto done;
1531 case 6:
1532 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1533 argvals[3], argvals[4], argvals[5]);
1534 goto done;
1535
1536 default:
08564963
JB
1537 /* Someone has created a subr that takes more arguments than
1538 is supported by this code. We need to either rewrite the
1539 subr to use a different argument protocol, or add more
1540 cases to this switch. */
1541 abort ();
db9f0278
JB
1542 }
1543 }
1544 if (XTYPE (fun) == Lisp_Compiled)
1545 val = apply_lambda (fun, original_args, 1);
1546 else
1547 {
1548 if (!CONSP (fun))
1549 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1550 funcar = Fcar (fun);
1551 if (XTYPE (funcar) != Lisp_Symbol)
1552 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1553 if (EQ (funcar, Qautoload))
1554 {
1555 do_autoload (fun, original_fun);
1556 goto retry;
1557 }
1558 if (EQ (funcar, Qmacro))
1559 val = Feval (apply1 (Fcdr (fun), original_args));
1560 else if (EQ (funcar, Qlambda))
1561 val = apply_lambda (fun, original_args, 1);
1562 else if (EQ (funcar, Qmocklisp))
1563 val = ml_apply (fun, original_args);
1564 else
1565 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1566 }
1567 done:
1568 if (!EQ (Vmocklisp_arguments, Qt))
1569 {
265a9e55 1570 if (NILP (val))
db9f0278
JB
1571 XFASTINT (val) = 0;
1572 else if (EQ (val, Qt))
1573 XFASTINT (val) = 1;
1574 }
1575 lisp_eval_depth--;
1576 if (backtrace.debug_on_exit)
1577 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1578 backtrace_list = backtrace.next;
1579 return val;
1580}
1581\f
1582DEFUN ("apply", Fapply, Sapply, 2, MANY, 0,
1583 "Call FUNCTION with our remaining args, using our last arg as list of args.\n\
1584Thus, (apply '+ 1 2 '(3 4)) returns 10.")
1585 (nargs, args)
1586 int nargs;
1587 Lisp_Object *args;
1588{
1589 register int i, numargs;
1590 register Lisp_Object spread_arg;
1591 register Lisp_Object *funcall_args;
db9f0278 1592 Lisp_Object fun;
a6e3fa71 1593 struct gcpro gcpro1;
db9f0278
JB
1594
1595 fun = args [0];
1596 funcall_args = 0;
1597 spread_arg = args [nargs - 1];
1598 CHECK_LIST (spread_arg, nargs);
1599
1600 numargs = XINT (Flength (spread_arg));
1601
1602 if (numargs == 0)
1603 return Ffuncall (nargs - 1, args);
1604 else if (numargs == 1)
1605 {
1606 args [nargs - 1] = XCONS (spread_arg)->car;
1607 return Ffuncall (nargs, args);
1608 }
1609
a6e3fa71 1610 numargs += nargs - 2;
db9f0278 1611
ffd56f97
JB
1612 fun = indirect_function (fun);
1613 if (EQ (fun, Qunbound))
db9f0278 1614 {
ffd56f97
JB
1615 /* Let funcall get the error */
1616 fun = args[0];
1617 goto funcall;
db9f0278
JB
1618 }
1619
1620 if (XTYPE (fun) == Lisp_Subr)
1621 {
1622 if (numargs < XSUBR (fun)->min_args
1623 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
1624 goto funcall; /* Let funcall get the error */
1625 else if (XSUBR (fun)->max_args > numargs)
1626 {
1627 /* Avoid making funcall cons up a yet another new vector of arguments
1628 by explicitly supplying nil's for optional values */
1629 funcall_args = (Lisp_Object *) alloca ((1 + XSUBR (fun)->max_args)
1630 * sizeof (Lisp_Object));
1631 for (i = numargs; i < XSUBR (fun)->max_args;)
1632 funcall_args[++i] = Qnil;
a6e3fa71
JB
1633 GCPRO1 (*funcall_args);
1634 gcpro1.nvars = 1 + XSUBR (fun)->max_args;
db9f0278
JB
1635 }
1636 }
1637 funcall:
1638 /* We add 1 to numargs because funcall_args includes the
1639 function itself as well as its arguments. */
1640 if (!funcall_args)
a6e3fa71
JB
1641 {
1642 funcall_args = (Lisp_Object *) alloca ((1 + numargs)
1643 * sizeof (Lisp_Object));
1644 GCPRO1 (*funcall_args);
1645 gcpro1.nvars = 1 + numargs;
1646 }
1647
db9f0278
JB
1648 bcopy (args, funcall_args, nargs * sizeof (Lisp_Object));
1649 /* Spread the last arg we got. Its first element goes in
1650 the slot that it used to occupy, hence this value of I. */
1651 i = nargs - 1;
265a9e55 1652 while (!NILP (spread_arg))
db9f0278
JB
1653 {
1654 funcall_args [i++] = XCONS (spread_arg)->car;
1655 spread_arg = XCONS (spread_arg)->cdr;
1656 }
a6e3fa71
JB
1657
1658 RETURN_UNGCPRO (Ffuncall (gcpro1.nvars, funcall_args));
db9f0278
JB
1659}
1660\f
1661/* Apply fn to arg */
1662Lisp_Object
1663apply1 (fn, arg)
1664 Lisp_Object fn, arg;
1665{
a6e3fa71
JB
1666 struct gcpro gcpro1;
1667
1668 GCPRO1 (fn);
265a9e55 1669 if (NILP (arg))
a6e3fa71
JB
1670 RETURN_UNGCPRO (Ffuncall (1, &fn));
1671 gcpro1.nvars = 2;
db9f0278
JB
1672#ifdef NO_ARG_ARRAY
1673 {
1674 Lisp_Object args[2];
1675 args[0] = fn;
1676 args[1] = arg;
a6e3fa71
JB
1677 gcpro1.var = args;
1678 RETURN_UNGCPRO (Fapply (2, args));
db9f0278
JB
1679 }
1680#else /* not NO_ARG_ARRAY */
a6e3fa71 1681 RETURN_UNGCPRO (Fapply (2, &fn));
db9f0278
JB
1682#endif /* not NO_ARG_ARRAY */
1683}
1684
1685/* Call function fn on no arguments */
1686Lisp_Object
1687call0 (fn)
1688 Lisp_Object fn;
1689{
a6e3fa71
JB
1690 struct gcpro gcpro1;
1691
1692 GCPRO1 (fn);
1693 RETURN_UNGCPRO (Ffuncall (1, &fn));
db9f0278
JB
1694}
1695
1696/* Call function fn with argument arg */
1697/* ARGSUSED */
1698Lisp_Object
1699call1 (fn, arg)
1700 Lisp_Object fn, arg;
1701{
a6e3fa71 1702 struct gcpro gcpro1;
db9f0278 1703#ifdef NO_ARG_ARRAY
a6e3fa71
JB
1704 Lisp_Object args[2];
1705
db9f0278
JB
1706 args[0] = fn;
1707 args[1] = arg;
a6e3fa71
JB
1708 GCPRO1 (args[0]);
1709 gcpro1.nvars = 2;
1710 RETURN_UNGCPRO (Ffuncall (2, args));
db9f0278 1711#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1712 GCPRO1 (fn);
1713 gcpro1.nvars = 2;
1714 RETURN_UNGCPRO (Ffuncall (2, &fn));
db9f0278
JB
1715#endif /* not NO_ARG_ARRAY */
1716}
1717
1718/* Call function fn with arguments arg, arg1 */
1719/* ARGSUSED */
1720Lisp_Object
1721call2 (fn, arg, arg1)
1722 Lisp_Object fn, arg, arg1;
1723{
a6e3fa71 1724 struct gcpro gcpro1;
db9f0278
JB
1725#ifdef NO_ARG_ARRAY
1726 Lisp_Object args[3];
1727 args[0] = fn;
1728 args[1] = arg;
1729 args[2] = arg1;
a6e3fa71
JB
1730 GCPRO1 (args[0]);
1731 gcpro1.nvars = 3;
1732 RETURN_UNGCPRO (Ffuncall (3, args));
db9f0278 1733#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1734 GCPRO1 (fn);
1735 gcpro1.nvars = 3;
1736 RETURN_UNGCPRO (Ffuncall (3, &fn));
db9f0278
JB
1737#endif /* not NO_ARG_ARRAY */
1738}
1739
1740/* Call function fn with arguments arg, arg1, arg2 */
1741/* ARGSUSED */
1742Lisp_Object
1743call3 (fn, arg, arg1, arg2)
1744 Lisp_Object fn, arg, arg1, arg2;
1745{
a6e3fa71 1746 struct gcpro gcpro1;
db9f0278
JB
1747#ifdef NO_ARG_ARRAY
1748 Lisp_Object args[4];
1749 args[0] = fn;
1750 args[1] = arg;
1751 args[2] = arg1;
1752 args[3] = arg2;
a6e3fa71
JB
1753 GCPRO1 (args[0]);
1754 gcpro1.nvars = 4;
1755 RETURN_UNGCPRO (Ffuncall (4, args));
db9f0278 1756#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1757 GCPRO1 (fn);
1758 gcpro1.nvars = 4;
1759 RETURN_UNGCPRO (Ffuncall (4, &fn));
db9f0278
JB
1760#endif /* not NO_ARG_ARRAY */
1761}
1762
1763DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0,
1764 "Call first argument as a function, passing remaining arguments to it.\n\
1765Thus, (funcall 'cons 'x 'y) returns (x . y).")
1766 (nargs, args)
1767 int nargs;
1768 Lisp_Object *args;
1769{
1770 Lisp_Object fun;
1771 Lisp_Object funcar;
1772 int numargs = nargs - 1;
1773 Lisp_Object lisp_numargs;
1774 Lisp_Object val;
1775 struct backtrace backtrace;
1776 register Lisp_Object *internal_args;
1777 register int i;
1778
1779 QUIT;
1780 if (consing_since_gc > gc_cons_threshold)
a6e3fa71 1781 Fgarbage_collect ();
db9f0278
JB
1782
1783 if (++lisp_eval_depth > max_lisp_eval_depth)
1784 {
1785 if (max_lisp_eval_depth < 100)
1786 max_lisp_eval_depth = 100;
1787 if (lisp_eval_depth > max_lisp_eval_depth)
1788 error ("Lisp nesting exceeds max-lisp-eval-depth");
1789 }
1790
1791 backtrace.next = backtrace_list;
1792 backtrace_list = &backtrace;
1793 backtrace.function = &args[0];
1794 backtrace.args = &args[1];
1795 backtrace.nargs = nargs - 1;
1796 backtrace.evalargs = 0;
1797 backtrace.debug_on_exit = 0;
1798
1799 if (debug_on_next_call)
1800 do_debug_on_call (Qlambda);
1801
1802 retry:
1803
1804 fun = args[0];
ffd56f97
JB
1805
1806 fun = Findirect_function (fun);
db9f0278
JB
1807
1808 if (XTYPE (fun) == Lisp_Subr)
1809 {
1810 if (numargs < XSUBR (fun)->min_args
1811 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
1812 {
1813 XFASTINT (lisp_numargs) = numargs;
1814 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (lisp_numargs, Qnil)));
1815 }
1816
1817 if (XSUBR (fun)->max_args == UNEVALLED)
1818 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1819
1820 if (XSUBR (fun)->max_args == MANY)
1821 {
1822 val = (*XSUBR (fun)->function) (numargs, args + 1);
1823 goto done;
1824 }
1825
1826 if (XSUBR (fun)->max_args > numargs)
1827 {
1828 internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object));
1829 bcopy (args + 1, internal_args, numargs * sizeof (Lisp_Object));
1830 for (i = numargs; i < XSUBR (fun)->max_args; i++)
1831 internal_args[i] = Qnil;
1832 }
1833 else
1834 internal_args = args + 1;
1835 switch (XSUBR (fun)->max_args)
1836 {
1837 case 0:
1838 val = (*XSUBR (fun)->function) ();
1839 goto done;
1840 case 1:
1841 val = (*XSUBR (fun)->function) (internal_args[0]);
1842 goto done;
1843 case 2:
1844 val = (*XSUBR (fun)->function) (internal_args[0],
1845 internal_args[1]);
1846 goto done;
1847 case 3:
1848 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1849 internal_args[2]);
1850 goto done;
1851 case 4:
1852 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1853 internal_args[2],
1854 internal_args[3]);
1855 goto done;
1856 case 5:
1857 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1858 internal_args[2], internal_args[3],
1859 internal_args[4]);
1860 goto done;
1861 case 6:
1862 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1863 internal_args[2], internal_args[3],
1864 internal_args[4], internal_args[5]);
1865 goto done;
1866
1867 default:
70ee42f7
JB
1868
1869 /* If a subr takes more than 6 arguments without using MANY
1870 or UNEVALLED, we need to extend this function to support it.
1871 Until this is done, there is no way to call the function. */
1872 abort ();
db9f0278
JB
1873 }
1874 }
1875 if (XTYPE (fun) == Lisp_Compiled)
1876 val = funcall_lambda (fun, numargs, args + 1);
1877 else
1878 {
1879 if (!CONSP (fun))
1880 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1881 funcar = Fcar (fun);
1882 if (XTYPE (funcar) != Lisp_Symbol)
1883 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1884 if (EQ (funcar, Qlambda))
1885 val = funcall_lambda (fun, numargs, args + 1);
1886 else if (EQ (funcar, Qmocklisp))
1887 val = ml_apply (fun, Flist (numargs, args + 1));
1888 else if (EQ (funcar, Qautoload))
1889 {
1890 do_autoload (fun, args[0]);
1891 goto retry;
1892 }
1893 else
1894 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1895 }
1896 done:
1897 lisp_eval_depth--;
1898 if (backtrace.debug_on_exit)
1899 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1900 backtrace_list = backtrace.next;
1901 return val;
1902}
1903\f
1904Lisp_Object
1905apply_lambda (fun, args, eval_flag)
1906 Lisp_Object fun, args;
1907 int eval_flag;
1908{
1909 Lisp_Object args_left;
1910 Lisp_Object numargs;
1911 register Lisp_Object *arg_vector;
1912 struct gcpro gcpro1, gcpro2, gcpro3;
1913 register int i;
1914 register Lisp_Object tem;
1915
1916 numargs = Flength (args);
1917 arg_vector = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1918 args_left = args;
1919
1920 GCPRO3 (*arg_vector, args_left, fun);
1921 gcpro1.nvars = 0;
1922
1923 for (i = 0; i < XINT (numargs);)
1924 {
1925 tem = Fcar (args_left), args_left = Fcdr (args_left);
1926 if (eval_flag) tem = Feval (tem);
1927 arg_vector[i++] = tem;
1928 gcpro1.nvars = i;
1929 }
1930
1931 UNGCPRO;
1932
1933 if (eval_flag)
1934 {
1935 backtrace_list->args = arg_vector;
1936 backtrace_list->nargs = i;
1937 }
1938 backtrace_list->evalargs = 0;
1939 tem = funcall_lambda (fun, XINT (numargs), arg_vector);
1940
1941 /* Do the debug-on-exit now, while arg_vector still exists. */
1942 if (backtrace_list->debug_on_exit)
1943 tem = call_debugger (Fcons (Qexit, Fcons (tem, Qnil)));
1944 /* Don't do it again when we return to eval. */
1945 backtrace_list->debug_on_exit = 0;
1946 return tem;
1947}
1948
1949/* Apply a Lisp function FUN to the NARGS evaluated arguments in ARG_VECTOR
1950 and return the result of evaluation.
1951 FUN must be either a lambda-expression or a compiled-code object. */
1952
1953Lisp_Object
1954funcall_lambda (fun, nargs, arg_vector)
1955 Lisp_Object fun;
1956 int nargs;
1957 register Lisp_Object *arg_vector;
1958{
1959 Lisp_Object val, tem;
1960 register Lisp_Object syms_left;
1961 Lisp_Object numargs;
1962 register Lisp_Object next;
1963 int count = specpdl_ptr - specpdl;
1964 register int i;
1965 int optional = 0, rest = 0;
1966
1967 specbind (Qmocklisp_arguments, Qt); /* t means NOT mocklisp! */
1968
1969 XFASTINT (numargs) = nargs;
1970
1971 if (XTYPE (fun) == Lisp_Cons)
1972 syms_left = Fcar (Fcdr (fun));
1973 else if (XTYPE (fun) == Lisp_Compiled)
1974 syms_left = XVECTOR (fun)->contents[COMPILED_ARGLIST];
1975 else abort ();
1976
1977 i = 0;
265a9e55 1978 for (; !NILP (syms_left); syms_left = Fcdr (syms_left))
db9f0278
JB
1979 {
1980 QUIT;
1981 next = Fcar (syms_left);
9ffa21d4
JB
1982 while (XTYPE (next) != Lisp_Symbol)
1983 next = Fsignal (Qinvalid_function, Fcons (fun, Qnil));
db9f0278
JB
1984 if (EQ (next, Qand_rest))
1985 rest = 1;
1986 else if (EQ (next, Qand_optional))
1987 optional = 1;
1988 else if (rest)
1989 {
9ffa21d4 1990 specbind (next, Flist (nargs - i, &arg_vector[i]));
db9f0278
JB
1991 i = nargs;
1992 }
1993 else if (i < nargs)
1994 {
1995 tem = arg_vector[i++];
1996 specbind (next, tem);
1997 }
1998 else if (!optional)
1999 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
2000 else
2001 specbind (next, Qnil);
2002 }
2003
2004 if (i < nargs)
2005 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
2006
2007 if (XTYPE (fun) == Lisp_Cons)
2008 val = Fprogn (Fcdr (Fcdr (fun)));
2009 else
2010 val = Fbyte_code (XVECTOR (fun)->contents[COMPILED_BYTECODE],
2011 XVECTOR (fun)->contents[COMPILED_CONSTANTS],
2012 XVECTOR (fun)->contents[COMPILED_STACK_DEPTH]);
2013 return unbind_to (count, val);
2014}
2015\f
2016void
2017grow_specpdl ()
2018{
2019 register int count = specpdl_ptr - specpdl;
2020 if (specpdl_size >= max_specpdl_size)
2021 {
2022 if (max_specpdl_size < 400)
2023 max_specpdl_size = 400;
2024 if (specpdl_size >= max_specpdl_size)
2025 {
2026 Fsignal (Qerror,
2027 Fcons (build_string ("Variable binding depth exceeds max-specpdl-size"), Qnil));
2028 max_specpdl_size *= 2;
2029 }
2030 }
2031 specpdl_size *= 2;
2032 if (specpdl_size > max_specpdl_size)
2033 specpdl_size = max_specpdl_size;
2034 specpdl = (struct specbinding *) xrealloc (specpdl, specpdl_size * sizeof (struct specbinding));
2035 specpdl_ptr = specpdl + count;
2036}
2037
2038void
2039specbind (symbol, value)
2040 Lisp_Object symbol, value;
2041{
2042 extern void store_symval_forwarding (); /* in eval.c */
2043 Lisp_Object ovalue;
2044
9ffa21d4
JB
2045 CHECK_SYMBOL (symbol, 0);
2046
db9f0278
JB
2047 if (specpdl_ptr == specpdl + specpdl_size)
2048 grow_specpdl ();
2049 specpdl_ptr->symbol = symbol;
2050 specpdl_ptr->func = 0;
2051 ovalue = XSYMBOL (symbol)->value;
2052 specpdl_ptr->old_value = EQ (ovalue, Qunbound) ? Qunbound : Fsymbol_value (symbol);
2053 specpdl_ptr++;
2054 if (XTYPE (ovalue) == Lisp_Buffer_Objfwd)
2055 store_symval_forwarding (symbol, ovalue, value);
2056 else
2057 Fset (symbol, value);
2058}
2059
2060void
2061record_unwind_protect (function, arg)
2062 Lisp_Object (*function)();
2063 Lisp_Object arg;
2064{
2065 if (specpdl_ptr == specpdl + specpdl_size)
2066 grow_specpdl ();
2067 specpdl_ptr->func = function;
2068 specpdl_ptr->symbol = Qnil;
2069 specpdl_ptr->old_value = arg;
2070 specpdl_ptr++;
2071}
2072
2073Lisp_Object
2074unbind_to (count, value)
2075 int count;
2076 Lisp_Object value;
2077{
265a9e55 2078 int quitf = !NILP (Vquit_flag);
db9f0278
JB
2079 struct gcpro gcpro1;
2080
2081 GCPRO1 (value);
2082
2083 Vquit_flag = Qnil;
2084
2085 while (specpdl_ptr != specpdl + count)
2086 {
2087 --specpdl_ptr;
2088 if (specpdl_ptr->func != 0)
2089 (*specpdl_ptr->func) (specpdl_ptr->old_value);
2090 /* Note that a "binding" of nil is really an unwind protect,
2091 so in that case the "old value" is a list of forms to evaluate. */
265a9e55 2092 else if (NILP (specpdl_ptr->symbol))
db9f0278
JB
2093 Fprogn (specpdl_ptr->old_value);
2094 else
2095 Fset (specpdl_ptr->symbol, specpdl_ptr->old_value);
2096 }
265a9e55 2097 if (NILP (Vquit_flag) && quitf) Vquit_flag = Qt;
db9f0278
JB
2098
2099 UNGCPRO;
2100
2101 return value;
2102}
2103\f
2104#if 0
2105
2106/* Get the value of symbol's global binding, even if that binding
2107 is not now dynamically visible. */
2108
2109Lisp_Object
2110top_level_value (symbol)
2111 Lisp_Object symbol;
2112{
2113 register struct specbinding *ptr = specpdl;
2114
2115 CHECK_SYMBOL (symbol, 0);
2116 for (; ptr != specpdl_ptr; ptr++)
2117 {
2118 if (EQ (ptr->symbol, symbol))
2119 return ptr->old_value;
2120 }
2121 return Fsymbol_value (symbol);
2122}
2123
2124Lisp_Object
2125top_level_set (symbol, newval)
2126 Lisp_Object symbol, newval;
2127{
2128 register struct specbinding *ptr = specpdl;
2129
2130 CHECK_SYMBOL (symbol, 0);
2131 for (; ptr != specpdl_ptr; ptr++)
2132 {
2133 if (EQ (ptr->symbol, symbol))
2134 {
2135 ptr->old_value = newval;
2136 return newval;
2137 }
2138 }
2139 return Fset (symbol, newval);
2140}
2141
2142#endif /* 0 */
2143\f
2144DEFUN ("backtrace-debug", Fbacktrace_debug, Sbacktrace_debug, 2, 2, 0,
2145 "Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.\n\
2146The debugger is entered when that frame exits, if the flag is non-nil.")
2147 (level, flag)
2148 Lisp_Object level, flag;
2149{
2150 register struct backtrace *backlist = backtrace_list;
2151 register int i;
2152
2153 CHECK_NUMBER (level, 0);
2154
2155 for (i = 0; backlist && i < XINT (level); i++)
2156 {
2157 backlist = backlist->next;
2158 }
2159
2160 if (backlist)
265a9e55 2161 backlist->debug_on_exit = !NILP (flag);
db9f0278
JB
2162
2163 return flag;
2164}
2165
2166DEFUN ("backtrace", Fbacktrace, Sbacktrace, 0, 0, "",
2167 "Print a trace of Lisp function calls currently active.\n\
2168Output stream used is value of `standard-output'.")
2169 ()
2170{
2171 register struct backtrace *backlist = backtrace_list;
2172 register int i;
2173 Lisp_Object tail;
2174 Lisp_Object tem;
2175 extern Lisp_Object Vprint_level;
2176 struct gcpro gcpro1;
2177
2178 entering_debugger = 0;
2179
2180 XFASTINT (Vprint_level) = 3;
2181
2182 tail = Qnil;
2183 GCPRO1 (tail);
2184
2185 while (backlist)
2186 {
2187 write_string (backlist->debug_on_exit ? "* " : " ", 2);
2188 if (backlist->nargs == UNEVALLED)
2189 {
2190 Fprin1 (Fcons (*backlist->function, *backlist->args), Qnil);
2191 }
2192 else
2193 {
2194 tem = *backlist->function;
2195 Fprin1 (tem, Qnil); /* This can QUIT */
2196 write_string ("(", -1);
2197 if (backlist->nargs == MANY)
2198 {
2199 for (tail = *backlist->args, i = 0;
265a9e55 2200 !NILP (tail);
db9f0278
JB
2201 tail = Fcdr (tail), i++)
2202 {
2203 if (i) write_string (" ", -1);
2204 Fprin1 (Fcar (tail), Qnil);
2205 }
2206 }
2207 else
2208 {
2209 for (i = 0; i < backlist->nargs; i++)
2210 {
2211 if (i) write_string (" ", -1);
2212 Fprin1 (backlist->args[i], Qnil);
2213 }
2214 }
2215 }
2216 write_string (")\n", -1);
2217 backlist = backlist->next;
2218 }
2219
2220 Vprint_level = Qnil;
2221 UNGCPRO;
2222 return Qnil;
2223}
2224
2225DEFUN ("backtrace-frame", Fbacktrace_frame, Sbacktrace_frame, 1, 1, "",
2226 "Return the function and arguments N frames up from current execution point.\n\
2227If that frame has not evaluated the arguments yet (or is a special form),\n\
2228the value is (nil FUNCTION ARG-FORMS...).\n\
2229If that frame has evaluated its arguments and called its function already,\n\
2230the value is (t FUNCTION ARG-VALUES...).\n\
2231A &rest arg is represented as the tail of the list ARG-VALUES.\n\
2232FUNCTION is whatever was supplied as car of evaluated list,\n\
2233or a lambda expression for macro calls.\n\
2234If N is more than the number of frames, the value is nil.")
2235 (nframes)
2236 Lisp_Object nframes;
2237{
2238 register struct backtrace *backlist = backtrace_list;
2239 register int i;
2240 Lisp_Object tem;
2241
2242 CHECK_NATNUM (nframes, 0);
2243
2244 /* Find the frame requested. */
2245 for (i = 0; i < XFASTINT (nframes); i++)
2246 backlist = backlist->next;
2247
2248 if (!backlist)
2249 return Qnil;
2250 if (backlist->nargs == UNEVALLED)
2251 return Fcons (Qnil, Fcons (*backlist->function, *backlist->args));
2252 else
2253 {
2254 if (backlist->nargs == MANY)
2255 tem = *backlist->args;
2256 else
2257 tem = Flist (backlist->nargs, backlist->args);
2258
2259 return Fcons (Qt, Fcons (*backlist->function, tem));
2260 }
2261}
2262\f
2263syms_of_eval ()
2264{
2265 DEFVAR_INT ("max-specpdl-size", &max_specpdl_size,
2266 "Limit on number of Lisp variable bindings & unwind-protects before error.");
2267
2268 DEFVAR_INT ("max-lisp-eval-depth", &max_lisp_eval_depth,
2269 "Limit on depth in `eval', `apply' and `funcall' before error.\n\
2270This limit is to catch infinite recursions for you before they cause\n\
2271actual stack overflow in C, which would be fatal for Emacs.\n\
2272You can safely make it considerably larger than its default value,\n\
2273if that proves inconveniently small.");
2274
2275 DEFVAR_LISP ("quit-flag", &Vquit_flag,
2276 "Non-nil causes `eval' to abort, unless `inhibit-quit' is non-nil.\n\
2277Typing C-G sets `quit-flag' non-nil, regardless of `inhibit-quit'.");
2278 Vquit_flag = Qnil;
2279
2280 DEFVAR_LISP ("inhibit-quit", &Vinhibit_quit,
2281 "Non-nil inhibits C-g quitting from happening immediately.\n\
2282Note that `quit-flag' will still be set by typing C-g,\n\
2283so a quit will be signalled as soon as `inhibit-quit' is nil.\n\
2284To prevent this happening, set `quit-flag' to nil\n\
2285before making `inhibit-quit' nil.");
2286 Vinhibit_quit = Qnil;
2287
ad236261
JB
2288 Qinhibit_quit = intern ("inhibit-quit");
2289 staticpro (&Qinhibit_quit);
2290
db9f0278
JB
2291 Qautoload = intern ("autoload");
2292 staticpro (&Qautoload);
2293
2294 Qdebug_on_error = intern ("debug-on-error");
2295 staticpro (&Qdebug_on_error);
2296
2297 Qmacro = intern ("macro");
2298 staticpro (&Qmacro);
2299
2300 /* Note that the process handling also uses Qexit, but we don't want
2301 to staticpro it twice, so we just do it here. */
2302 Qexit = intern ("exit");
2303 staticpro (&Qexit);
2304
2305 Qinteractive = intern ("interactive");
2306 staticpro (&Qinteractive);
2307
2308 Qcommandp = intern ("commandp");
2309 staticpro (&Qcommandp);
2310
2311 Qdefun = intern ("defun");
2312 staticpro (&Qdefun);
2313
2314 Qand_rest = intern ("&rest");
2315 staticpro (&Qand_rest);
2316
2317 Qand_optional = intern ("&optional");
2318 staticpro (&Qand_optional);
2319
128c0f66 2320 DEFVAR_LISP ("stack-trace-on-error", &Vstack_trace_on_error,
db9f0278 2321 "*Non-nil means automatically display a backtrace buffer\n\
128c0f66
RM
2322after any error that is handled by the editor command loop.\n\
2323If the value is a list, an error only means to display a backtrace\n\
2324if one of its condition symbols appears in the list.");
2325 Vstack_trace_on_error = Qnil;
db9f0278 2326
128c0f66 2327 DEFVAR_LISP ("debug-on-error", &Vdebug_on_error,
db9f0278
JB
2328 "*Non-nil means enter debugger if an error is signaled.\n\
2329Does not apply to errors handled by `condition-case'.\n\
128c0f66
RM
2330If the value is a list, an error only means to enter the debugger\n\
2331if one of its condition symbols appears in the list.\n\
db9f0278 2332See also variable `debug-on-quit'.");
128c0f66 2333 Vdebug_on_error = Qnil;
db9f0278
JB
2334
2335 DEFVAR_BOOL ("debug-on-quit", &debug_on_quit,
2336 "*Non-nil means enter debugger if quit is signaled (C-G, for example).\n\
daa37602
JB
2337Does not apply if quit is handled by a `condition-case'.\n\
2338A non-nil value is equivalent to a `debug-on-error' value containing `quit'.");
db9f0278
JB
2339 debug_on_quit = 0;
2340
2341 DEFVAR_BOOL ("debug-on-next-call", &debug_on_next_call,
2342 "Non-nil means enter debugger before next `eval', `apply' or `funcall'.");
2343
2344 DEFVAR_LISP ("debugger", &Vdebugger,
2345 "Function to call to invoke debugger.\n\
2346If due to frame exit, args are `exit' and the value being returned;\n\
2347 this function's value will be returned instead of that.\n\
2348If due to error, args are `error' and a list of the args to `signal'.\n\
2349If due to `apply' or `funcall' entry, one arg, `lambda'.\n\
2350If due to `eval' entry, one arg, t.");
2351 Vdebugger = Qnil;
2352
2353 Qmocklisp_arguments = intern ("mocklisp-arguments");
2354 staticpro (&Qmocklisp_arguments);
2355 DEFVAR_LISP ("mocklisp-arguments", &Vmocklisp_arguments,
2356 "While in a mocklisp function, the list of its unevaluated args.");
2357 Vmocklisp_arguments = Qt;
2358
2359 DEFVAR_LISP ("run-hooks", &Vrun_hooks,
2360 "Set to the function `run-hooks', if that function has been defined.\n\
2361Otherwise, nil (in a bare Emacs without preloaded Lisp code).");
2362 Vrun_hooks = Qnil;
2363
2364 staticpro (&Vautoload_queue);
2365 Vautoload_queue = Qnil;
2366
2367 defsubr (&Sor);
2368 defsubr (&Sand);
2369 defsubr (&Sif);
2370 defsubr (&Scond);
2371 defsubr (&Sprogn);
2372 defsubr (&Sprog1);
2373 defsubr (&Sprog2);
2374 defsubr (&Ssetq);
2375 defsubr (&Squote);
2376 defsubr (&Sfunction);
2377 defsubr (&Sdefun);
2378 defsubr (&Sdefmacro);
2379 defsubr (&Sdefvar);
2380 defsubr (&Sdefconst);
2381 defsubr (&Suser_variable_p);
2382 defsubr (&Slet);
2383 defsubr (&SletX);
2384 defsubr (&Swhile);
2385 defsubr (&Smacroexpand);
2386 defsubr (&Scatch);
2387 defsubr (&Sthrow);
2388 defsubr (&Sunwind_protect);
2389 defsubr (&Scondition_case);
2390 defsubr (&Ssignal);
2391 defsubr (&Sinteractive_p);
2392 defsubr (&Scommandp);
2393 defsubr (&Sautoload);
2394 defsubr (&Seval);
2395 defsubr (&Sapply);
2396 defsubr (&Sfuncall);
2397 defsubr (&Sbacktrace_debug);
2398 defsubr (&Sbacktrace);
2399 defsubr (&Sbacktrace_frame);
2400}