*** empty log message ***
[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{
23d6b5a6 746 /* With cleanups from Hallvard Furuseth. */
db9f0278
JB
747 register Lisp_Object expander, sym, def, tem;
748
749 while (1)
750 {
751 /* Come back here each time we expand a macro call,
752 in case it expands into another macro call. */
753 if (XTYPE (form) != Lisp_Cons)
754 break;
23d6b5a6
JB
755 /* Set SYM, give DEF and TEM right values in case SYM is not a symbol. */
756 def = sym = XCONS (form)->car;
757 tem = Qnil;
db9f0278
JB
758 /* Trace symbols aliases to other symbols
759 until we get a symbol that is not an alias. */
23d6b5a6 760 while (XTYPE (def) == Lisp_Symbol)
db9f0278
JB
761 {
762 QUIT;
23d6b5a6 763 sym = def;
db9f0278 764 tem = Fassq (sym, env);
265a9e55 765 if (NILP (tem))
db9f0278
JB
766 {
767 def = XSYMBOL (sym)->function;
23d6b5a6
JB
768 if (!EQ (def, Qunbound))
769 continue;
db9f0278 770 }
23d6b5a6 771 break;
db9f0278
JB
772 }
773 /* Right now TEM is the result from SYM in ENV,
774 and if TEM is nil then DEF is SYM's function definition. */
265a9e55 775 if (NILP (tem))
db9f0278
JB
776 {
777 /* SYM is not mentioned in ENV.
778 Look at its function definition. */
779 if (EQ (def, Qunbound)
780 || XTYPE (def) != Lisp_Cons)
781 /* Not defined or definition not suitable */
782 break;
783 if (EQ (XCONS (def)->car, Qautoload))
784 {
785 /* Autoloading function: will it be a macro when loaded? */
786 tem = Fcar (Fnthcdr (make_number (4), def));
265a9e55 787 if (NILP (tem))
db9f0278
JB
788 break;
789 /* Yes, load it and try again. */
790 do_autoload (def, sym);
791 continue;
792 }
793 else if (!EQ (XCONS (def)->car, Qmacro))
794 break;
795 else expander = XCONS (def)->cdr;
796 }
797 else
798 {
799 expander = XCONS (tem)->cdr;
265a9e55 800 if (NILP (expander))
db9f0278
JB
801 break;
802 }
db9f0278
JB
803 form = apply1 (expander, XCONS (form)->cdr);
804 }
805 return form;
806}
807\f
808DEFUN ("catch", Fcatch, Scatch, 1, UNEVALLED, 0,
809 "(catch TAG BODY...): eval BODY allowing nonlocal exits using `throw'.\n\
810TAG is evalled to get the tag to use. Then the BODY is executed.\n\
811Within BODY, (throw TAG) with same tag exits BODY and exits this `catch'.\n\
812If no throw happens, `catch' returns the value of the last BODY form.\n\
813If a throw happens, it specifies the value to return from `catch'.")
814 (args)
815 Lisp_Object args;
816{
817 register Lisp_Object tag;
818 struct gcpro gcpro1;
819
820 GCPRO1 (args);
821 tag = Feval (Fcar (args));
822 UNGCPRO;
823 return internal_catch (tag, Fprogn, Fcdr (args));
824}
825
826/* Set up a catch, then call C function FUNC on argument ARG.
827 FUNC should return a Lisp_Object.
828 This is how catches are done from within C code. */
829
830Lisp_Object
831internal_catch (tag, func, arg)
832 Lisp_Object tag;
833 Lisp_Object (*func) ();
834 Lisp_Object arg;
835{
836 /* This structure is made part of the chain `catchlist'. */
837 struct catchtag c;
838
839 /* Fill in the components of c, and put it on the list. */
840 c.next = catchlist;
841 c.tag = tag;
842 c.val = Qnil;
843 c.backlist = backtrace_list;
844 c.handlerlist = handlerlist;
845 c.lisp_eval_depth = lisp_eval_depth;
846 c.pdlcount = specpdl_ptr - specpdl;
847 c.poll_suppress_count = poll_suppress_count;
848 c.gcpro = gcprolist;
849 catchlist = &c;
850
851 /* Call FUNC. */
852 if (! _setjmp (c.jmp))
853 c.val = (*func) (arg);
854
855 /* Throw works by a longjmp that comes right here. */
856 catchlist = c.next;
857 return c.val;
858}
859
860/* Discard from the catchlist all catch tags back through CATCH.
861 Before each catch is discarded, unbind all special bindings
862 made within that catch. Also, when discarding a catch that
863 corresponds to a condition handler, discard that handler.
864
865 At the end, restore some static info saved in CATCH.
866
867 This is used for correct unwinding in Fthrow and Fsignal,
868 before doing the longjmp that actually destroys the stack frames
869 in which these handlers and catches reside. */
870
871static void
872unbind_catch (catch)
873 struct catchtag *catch;
874{
875 register int last_time;
876
877 do
878 {
879 last_time = catchlist == catch;
880 unbind_to (catchlist->pdlcount, Qnil);
881 handlerlist = catchlist->handlerlist;
882 catchlist = catchlist->next;
883 }
884 while (! last_time);
885
886 gcprolist = catch->gcpro;
887 backtrace_list = catch->backlist;
888 lisp_eval_depth = catch->lisp_eval_depth;
889}
890
891DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0,
892 "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\
893Both TAG and VALUE are evalled.")
894 (tag, val)
895 register Lisp_Object tag, val;
896{
897 register struct catchtag *c;
898
899 while (1)
900 {
265a9e55 901 if (!NILP (tag))
db9f0278
JB
902 for (c = catchlist; c; c = c->next)
903 {
904 if (EQ (c->tag, tag))
905 {
906 /* Restore the polling-suppression count. */
907 if (c->poll_suppress_count > poll_suppress_count)
908 abort ();
909 while (c->poll_suppress_count < poll_suppress_count)
910 start_polling ();
911 c->val = val;
912 unbind_catch (c);
913 _longjmp (c->jmp, 1);
914 }
915 }
916 tag = Fsignal (Qno_catch, Fcons (tag, Fcons (val, Qnil)));
917 }
918}
919
920
921DEFUN ("unwind-protect", Funwind_protect, Sunwind_protect, 1, UNEVALLED, 0,
922 "Do BODYFORM, protecting with UNWINDFORMS.\n\
923Usage looks like (unwind-protect BODYFORM UNWINDFORMS...).\n\
924If BODYFORM completes normally, its value is returned\n\
925after executing the UNWINDFORMS.\n\
926If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.")
927 (args)
928 Lisp_Object args;
929{
930 Lisp_Object val;
931 int count = specpdl_ptr - specpdl;
932
933 record_unwind_protect (0, Fcdr (args));
934 val = Feval (Fcar (args));
935 return unbind_to (count, val);
936}
937\f
938/* Chain of condition handlers currently in effect.
939 The elements of this chain are contained in the stack frames
940 of Fcondition_case and internal_condition_case.
941 When an error is signaled (by calling Fsignal, below),
942 this chain is searched for an element that applies. */
943
944struct handler *handlerlist;
945
946DEFUN ("condition-case", Fcondition_case, Scondition_case, 2, UNEVALLED, 0,
947 "Regain control when an error is signaled.\n\
948Usage looks like (condition-case VAR BODYFORM HANDLERS...).\n\
949executes BODYFORM and returns its value if no error happens.\n\
950Each element of HANDLERS looks like (CONDITION-NAME BODY...)\n\
951where the BODY is made of Lisp expressions.\n\n\
952A handler is applicable to an error\n\
953if CONDITION-NAME is one of the error's condition names.\n\
954If an error happens, the first applicable handler is run.\n\
955\n\
956When a handler handles an error,\n\
957control returns to the condition-case and the handler BODY... is executed\n\
958with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).\n\
959VAR may be nil; then you do not get access to the signal information.\n\
960\n\
961The value of the last BODY form is returned from the condition-case.\n\
962See also the function `signal' for more info.")
963 (args)
964 Lisp_Object args;
965{
966 Lisp_Object val;
967 struct catchtag c;
968 struct handler h;
969 register Lisp_Object tem;
970
971 tem = Fcar (args);
972 CHECK_SYMBOL (tem, 0);
973
974 c.tag = Qnil;
975 c.val = Qnil;
976 c.backlist = backtrace_list;
977 c.handlerlist = handlerlist;
978 c.lisp_eval_depth = lisp_eval_depth;
979 c.pdlcount = specpdl_ptr - specpdl;
980 c.poll_suppress_count = poll_suppress_count;
981 c.gcpro = gcprolist;
982 if (_setjmp (c.jmp))
983 {
265a9e55 984 if (!NILP (h.var))
db9f0278
JB
985 specbind (h.var, Fcdr (c.val));
986 val = Fprogn (Fcdr (Fcar (c.val)));
987 unbind_to (c.pdlcount, Qnil);
988 return val;
989 }
990 c.next = catchlist;
991 catchlist = &c;
992 h.var = Fcar (args);
993 h.handler = Fcdr (Fcdr (args));
994
265a9e55 995 for (val = h.handler; ! NILP (val); val = Fcdr (val))
db9f0278
JB
996 {
997 tem = Fcar (val);
265a9e55 998 if ((!NILP (tem)) &&
db9f0278
JB
999 (!CONSP (tem) || (XTYPE (XCONS (tem)->car) != Lisp_Symbol)))
1000 error ("Invalid condition handler", tem);
1001 }
1002
1003 h.next = handlerlist;
1004 h.poll_suppress_count = poll_suppress_count;
1005 h.tag = &c;
1006 handlerlist = &h;
1007
1008 val = Feval (Fcar (Fcdr (args)));
1009 catchlist = c.next;
1010 handlerlist = h.next;
1011 return val;
1012}
1013
1014Lisp_Object
1015internal_condition_case (bfun, handlers, hfun)
1016 Lisp_Object (*bfun) ();
1017 Lisp_Object handlers;
1018 Lisp_Object (*hfun) ();
1019{
1020 Lisp_Object val;
1021 struct catchtag c;
1022 struct handler h;
1023
1024 c.tag = Qnil;
1025 c.val = Qnil;
1026 c.backlist = backtrace_list;
1027 c.handlerlist = handlerlist;
1028 c.lisp_eval_depth = lisp_eval_depth;
1029 c.pdlcount = specpdl_ptr - specpdl;
1030 c.poll_suppress_count = poll_suppress_count;
1031 c.gcpro = gcprolist;
1032 if (_setjmp (c.jmp))
1033 {
1034 return (*hfun) (Fcdr (c.val));
1035 }
1036 c.next = catchlist;
1037 catchlist = &c;
1038 h.handler = handlers;
1039 h.var = Qnil;
1040 h.poll_suppress_count = poll_suppress_count;
1041 h.next = handlerlist;
1042 h.tag = &c;
1043 handlerlist = &h;
1044
1045 val = (*bfun) ();
1046 catchlist = c.next;
1047 handlerlist = h.next;
1048 return val;
1049}
1050
1051static Lisp_Object find_handler_clause ();
1052
1053DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0,
1054 "Signal an error. Args are SIGNAL-NAME, and associated DATA.\n\
1055This function does not return.\n\n\
1056A signal name is a symbol with an `error-conditions' property\n\
1057that is a list of condition names.\n\
1058A handler for any of those names will get to handle this signal.\n\
1059The symbol `error' should normally be one of them.\n\
1060\n\
1061DATA should be a list. Its elements are printed as part of the error message.\n\
1062If the signal is handled, DATA is made available to the handler.\n\
1063See also the function `condition-case'.")
1064 (sig, data)
1065 Lisp_Object sig, data;
1066{
1067 register struct handler *allhandlers = handlerlist;
1068 Lisp_Object conditions;
1069 extern int gc_in_progress;
1070 extern int waiting_for_input;
1071 Lisp_Object debugger_value;
1072
1073 quit_error_check ();
1074 immediate_quit = 0;
1075 if (gc_in_progress || waiting_for_input)
1076 abort ();
1077
e5d77022 1078#ifdef HAVE_X_WINDOWS
db9f0278 1079 TOTALLY_UNBLOCK_INPUT;
e5d77022 1080#endif
db9f0278
JB
1081
1082 conditions = Fget (sig, Qerror_conditions);
1083
1084 for (; handlerlist; handlerlist = handlerlist->next)
1085 {
1086 register Lisp_Object clause;
1087 clause = find_handler_clause (handlerlist->handler, conditions,
1088 sig, data, &debugger_value);
1089
1090#if 0 /* Most callers are not prepared to handle gc if this returns.
1091 So, since this feature is not very useful, take it out. */
1092 /* If have called debugger and user wants to continue,
1093 just return nil. */
1094 if (EQ (clause, Qlambda))
1095 return debugger_value;
1096#else
1097 if (EQ (clause, Qlambda))
1098 error ("Returning a value from an error is no longer supported");
1099#endif
1100
265a9e55 1101 if (!NILP (clause))
db9f0278
JB
1102 {
1103 struct handler *h = handlerlist;
1104 /* Restore the polling-suppression count. */
1105 if (h->poll_suppress_count > poll_suppress_count)
1106 abort ();
1107 while (h->poll_suppress_count < poll_suppress_count)
1108 start_polling ();
1109 handlerlist = allhandlers;
1110 unbind_catch (h->tag);
1111 h->tag->val = Fcons (clause, Fcons (sig, data));
1112 _longjmp (h->tag->jmp, 1);
1113 }
1114 }
1115
1116 handlerlist = allhandlers;
1117 /* If no handler is present now, try to run the debugger,
1118 and if that fails, throw to top level. */
1119 find_handler_clause (Qerror, conditions, sig, data, &debugger_value);
1120 Fthrow (Qtop_level, Qt);
1121}
1122
128c0f66
RM
1123/* Return nonzero iff LIST is a non-nil atom or
1124 a list containing one of CONDITIONS. */
1125
1126static int
1127wants_debugger (list, conditions)
1128 Lisp_Object list, conditions;
1129{
1130 static int looking = 0;
1131
1132 if (looking)
1133 {
1134 /* We got an error while looking in LIST. */
1135 looking = 0;
1136 return 1;
1137 }
1138
4de86b16 1139 if (NILP (list))
128c0f66
RM
1140 return 0;
1141 if (! CONSP (list))
1142 return 1;
1143
1144 looking = 1;
4de86b16 1145 while (!NILP (conditions))
128c0f66
RM
1146 {
1147 Lisp_Object tem;
1148 tem = Fmemq (XCONS (conditions)->car, list);
4de86b16 1149 if (! NILP (tem))
128c0f66
RM
1150 {
1151 looking = 0;
1152 return 1;
1153 }
1154 conditions = XCONS (conditions)->cdr;
1155 }
1156}
1157
1158/* Value of Qlambda means we have called debugger and user has continued.
1159 Store value returned from debugger into *DEBUGGER_VALUE_PTR. */
db9f0278
JB
1160
1161static Lisp_Object
1162find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr)
1163 Lisp_Object handlers, conditions, sig, data;
1164 Lisp_Object *debugger_value_ptr;
1165{
1166 register Lisp_Object h;
1167 register Lisp_Object tem;
1168 register Lisp_Object tem1;
1169
1170 if (EQ (handlers, Qt)) /* t is used by handlers for all conditions, set up by C code. */
1171 return Qt;
1172 if (EQ (handlers, Qerror)) /* error is used similarly, but means display a backtrace too */
1173 {
128c0f66 1174 if (wants_debugger (Vstack_trace_on_error, conditions))
db9f0278
JB
1175 internal_with_output_to_temp_buffer ("*Backtrace*", Fbacktrace, Qnil);
1176 if (!entering_debugger
128c0f66
RM
1177 && ((EQ (sig, Qquit) && debug_on_quit)
1178 || wants_debugger (Vdebug_on_error, conditions)))
db9f0278
JB
1179 {
1180 int count = specpdl_ptr - specpdl;
1181 specbind (Qdebug_on_error, Qnil);
1182 *debugger_value_ptr =
1183 call_debugger (Fcons (Qerror,
1184 Fcons (Fcons (sig, data),
1185 Qnil)));
1186 return unbind_to (count, Qlambda);
1187 }
1188 return Qt;
1189 }
1190 for (h = handlers; CONSP (h); h = Fcdr (h))
1191 {
1192 tem1 = Fcar (h);
1193 if (!CONSP (tem1))
1194 continue;
1195 tem = Fmemq (Fcar (tem1), conditions);
265a9e55 1196 if (!NILP (tem))
db9f0278
JB
1197 return tem1;
1198 }
1199 return Qnil;
1200}
1201
1202/* dump an error message; called like printf */
1203
1204/* VARARGS 1 */
1205void
1206error (m, a1, a2, a3)
1207 char *m;
1208{
1209 char buf[200];
1210 sprintf (buf, m, a1, a2, a3);
1211
1212 while (1)
1213 Fsignal (Qerror, Fcons (build_string (buf), Qnil));
1214}
1215\f
1216DEFUN ("commandp", Fcommandp, Scommandp, 1, 1, 0,
1217 "T if FUNCTION makes provisions for interactive calling.\n\
1218This means it contains a description for how to read arguments to give it.\n\
1219The value is nil for an invalid function or a symbol with no function\n\
1220definition.\n\
1221\n\
1222Interactively callable functions include strings and vectors (treated\n\
1223as keyboard macros), lambda-expressions that contain a top-level call\n\
1224to `interactive', autoload definitions made by `autoload' with non-nil\n\
1225fourth argument, and some of the built-in functions of Lisp.\n\
1226\n\
1227Also, a symbol satisfies `commandp' if its function definition does so.")
1228 (function)
1229 Lisp_Object function;
1230{
1231 register Lisp_Object fun;
1232 register Lisp_Object funcar;
1233 register Lisp_Object tem;
1234 register int i = 0;
1235
1236 fun = function;
1237
ffd56f97
JB
1238 fun = indirect_function (fun);
1239 if (EQ (fun, Qunbound))
1240 return Qnil;
db9f0278
JB
1241
1242 /* Emacs primitives are interactive if their DEFUN specifies an
1243 interactive spec. */
1244 if (XTYPE (fun) == Lisp_Subr)
1245 {
1246 if (XSUBR (fun)->prompt)
1247 return Qt;
1248 else
1249 return Qnil;
1250 }
1251
1252 /* Bytecode objects are interactive if they are long enough to
1253 have an element whose index is COMPILED_INTERACTIVE, which is
1254 where the interactive spec is stored. */
1255 else if (XTYPE (fun) == Lisp_Compiled)
1256 return (XVECTOR (fun)->size > COMPILED_INTERACTIVE
1257 ? Qt : Qnil);
1258
1259 /* Strings and vectors are keyboard macros. */
1260 if (XTYPE (fun) == Lisp_String
1261 || XTYPE (fun) == Lisp_Vector)
1262 return Qt;
1263
1264 /* Lists may represent commands. */
1265 if (!CONSP (fun))
1266 return Qnil;
1267 funcar = Fcar (fun);
1268 if (XTYPE (funcar) != Lisp_Symbol)
1269 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1270 if (EQ (funcar, Qlambda))
1271 return Fassq (Qinteractive, Fcdr (Fcdr (fun)));
1272 if (EQ (funcar, Qmocklisp))
1273 return Qt; /* All mocklisp functions can be called interactively */
1274 if (EQ (funcar, Qautoload))
1275 return Fcar (Fcdr (Fcdr (Fcdr (fun))));
1276 else
1277 return Qnil;
1278}
1279
1280/* ARGSUSED */
1281DEFUN ("autoload", Fautoload, Sautoload, 2, 5, 0,
1282 "Define FUNCTION to autoload from FILE.\n\
1283FUNCTION is a symbol; FILE is a file name string to pass to `load'.\n\
1284Third arg DOCSTRING is documentation for the function.\n\
1285Fourth arg INTERACTIVE if non-nil says function can be called interactively.\n\
1286Fifth arg MACRO if non-nil says the function is really a macro.\n\
1287Third through fifth args give info about the real definition.\n\
1288They default to nil.\n\
1289If FUNCTION is already defined other than as an autoload,\n\
1290this does nothing and returns nil.")
1291 (function, file, docstring, interactive, macro)
1292 Lisp_Object function, file, docstring, interactive, macro;
1293{
1294#ifdef NO_ARG_ARRAY
1295 Lisp_Object args[4];
1296#endif
1297
1298 CHECK_SYMBOL (function, 0);
1299 CHECK_STRING (file, 1);
1300
1301 /* If function is defined and not as an autoload, don't override */
1302 if (!EQ (XSYMBOL (function)->function, Qunbound)
1303 && !(XTYPE (XSYMBOL (function)->function) == Lisp_Cons
1304 && EQ (XCONS (XSYMBOL (function)->function)->car, Qautoload)))
1305 return Qnil;
1306
1307#ifdef NO_ARG_ARRAY
1308 args[0] = file;
1309 args[1] = docstring;
1310 args[2] = interactive;
1311 args[3] = macro;
1312
1313 return Ffset (function, Fcons (Qautoload, Flist (4, &args[0])));
1314#else /* NO_ARG_ARRAY */
1315 return Ffset (function, Fcons (Qautoload, Flist (4, &file)));
1316#endif /* not NO_ARG_ARRAY */
1317}
1318
1319Lisp_Object
1320un_autoload (oldqueue)
1321 Lisp_Object oldqueue;
1322{
1323 register Lisp_Object queue, first, second;
1324
1325 /* Queue to unwind is current value of Vautoload_queue.
1326 oldqueue is the shadowed value to leave in Vautoload_queue. */
1327 queue = Vautoload_queue;
1328 Vautoload_queue = oldqueue;
1329 while (CONSP (queue))
1330 {
1331 first = Fcar (queue);
1332 second = Fcdr (first);
1333 first = Fcar (first);
1334 if (EQ (second, Qnil))
1335 Vfeatures = first;
1336 else
1337 Ffset (first, second);
1338 queue = Fcdr (queue);
1339 }
1340 return Qnil;
1341}
1342
1343do_autoload (fundef, funname)
1344 Lisp_Object fundef, funname;
1345{
1346 int count = specpdl_ptr - specpdl;
1347 Lisp_Object fun, val;
1348
1349 fun = funname;
1350 CHECK_SYMBOL (funname, 0);
1351
1352 /* Value saved here is to be restored into Vautoload_queue */
1353 record_unwind_protect (un_autoload, Vautoload_queue);
1354 Vautoload_queue = Qt;
1355 Fload (Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil);
1356 /* Once loading finishes, don't undo it. */
1357 Vautoload_queue = Qt;
1358 unbind_to (count, Qnil);
1359
ffd56f97
JB
1360 fun = Findirect_function (fun);
1361
db9f0278
JB
1362 if (XTYPE (fun) == Lisp_Cons
1363 && EQ (XCONS (fun)->car, Qautoload))
1364 error ("Autoloading failed to define function %s",
1365 XSYMBOL (funname)->name->data);
1366}
1367\f
1368DEFUN ("eval", Feval, Seval, 1, 1, 0,
1369 "Evaluate FORM and return its value.")
1370 (form)
1371 Lisp_Object form;
1372{
1373 Lisp_Object fun, val, original_fun, original_args;
1374 Lisp_Object funcar;
1375 struct backtrace backtrace;
1376 struct gcpro gcpro1, gcpro2, gcpro3;
1377
1378 if (XTYPE (form) == Lisp_Symbol)
1379 {
1380 if (EQ (Vmocklisp_arguments, Qt))
1381 return Fsymbol_value (form);
1382 val = Fsymbol_value (form);
265a9e55 1383 if (NILP (val))
db9f0278
JB
1384 XFASTINT (val) = 0;
1385 else if (EQ (val, Qt))
1386 XFASTINT (val) = 1;
1387 return val;
1388 }
1389 if (!CONSP (form))
1390 return form;
1391
1392 QUIT;
1393 if (consing_since_gc > gc_cons_threshold)
1394 {
1395 GCPRO1 (form);
1396 Fgarbage_collect ();
1397 UNGCPRO;
1398 }
1399
1400 if (++lisp_eval_depth > max_lisp_eval_depth)
1401 {
1402 if (max_lisp_eval_depth < 100)
1403 max_lisp_eval_depth = 100;
1404 if (lisp_eval_depth > max_lisp_eval_depth)
1405 error ("Lisp nesting exceeds max-lisp-eval-depth");
1406 }
1407
1408 original_fun = Fcar (form);
1409 original_args = Fcdr (form);
1410
1411 backtrace.next = backtrace_list;
1412 backtrace_list = &backtrace;
1413 backtrace.function = &original_fun; /* This also protects them from gc */
1414 backtrace.args = &original_args;
1415 backtrace.nargs = UNEVALLED;
1416 backtrace.evalargs = 1;
1417 backtrace.debug_on_exit = 0;
1418
1419 if (debug_on_next_call)
1420 do_debug_on_call (Qt);
1421
1422 /* At this point, only original_fun and original_args
1423 have values that will be used below */
1424 retry:
ffd56f97 1425 fun = Findirect_function (original_fun);
db9f0278
JB
1426
1427 if (XTYPE (fun) == Lisp_Subr)
1428 {
1429 Lisp_Object numargs;
1430 Lisp_Object argvals[7];
1431 Lisp_Object args_left;
1432 register int i, maxargs;
1433
1434 args_left = original_args;
1435 numargs = Flength (args_left);
1436
1437 if (XINT (numargs) < XSUBR (fun)->min_args ||
1438 (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs)))
1439 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1440
1441 if (XSUBR (fun)->max_args == UNEVALLED)
1442 {
1443 backtrace.evalargs = 0;
1444 val = (*XSUBR (fun)->function) (args_left);
1445 goto done;
1446 }
1447
1448 if (XSUBR (fun)->max_args == MANY)
1449 {
1450 /* Pass a vector of evaluated arguments */
1451 Lisp_Object *vals;
1452 register int argnum = 0;
1453
1454 vals = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1455
1456 GCPRO3 (args_left, fun, fun);
1457 gcpro3.var = vals;
1458 gcpro3.nvars = 0;
1459
265a9e55 1460 while (!NILP (args_left))
db9f0278
JB
1461 {
1462 vals[argnum++] = Feval (Fcar (args_left));
1463 args_left = Fcdr (args_left);
1464 gcpro3.nvars = argnum;
1465 }
db9f0278
JB
1466
1467 backtrace.args = vals;
1468 backtrace.nargs = XINT (numargs);
1469
1470 val = (*XSUBR (fun)->function) (XINT (numargs), vals);
a6e3fa71 1471 UNGCPRO;
db9f0278
JB
1472 goto done;
1473 }
1474
1475 GCPRO3 (args_left, fun, fun);
1476 gcpro3.var = argvals;
1477 gcpro3.nvars = 0;
1478
1479 maxargs = XSUBR (fun)->max_args;
1480 for (i = 0; i < maxargs; args_left = Fcdr (args_left))
1481 {
1482 argvals[i] = Feval (Fcar (args_left));
1483 gcpro3.nvars = ++i;
1484 }
1485
1486 UNGCPRO;
1487
1488 backtrace.args = argvals;
1489 backtrace.nargs = XINT (numargs);
1490
1491 switch (i)
1492 {
1493 case 0:
1494 val = (*XSUBR (fun)->function) ();
1495 goto done;
1496 case 1:
1497 val = (*XSUBR (fun)->function) (argvals[0]);
1498 goto done;
1499 case 2:
1500 val = (*XSUBR (fun)->function) (argvals[0], argvals[1]);
1501 goto done;
1502 case 3:
1503 val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1504 argvals[2]);
1505 goto done;
1506 case 4:
1507 val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1508 argvals[2], argvals[3]);
1509 goto done;
1510 case 5:
1511 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1512 argvals[3], argvals[4]);
1513 goto done;
1514 case 6:
1515 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1516 argvals[3], argvals[4], argvals[5]);
1517 goto done;
15c65264
RS
1518 case 7:
1519 val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1520 argvals[3], argvals[4], argvals[5],
1521 argvals[6]);
1522 goto done;
db9f0278
JB
1523
1524 default:
08564963
JB
1525 /* Someone has created a subr that takes more arguments than
1526 is supported by this code. We need to either rewrite the
1527 subr to use a different argument protocol, or add more
1528 cases to this switch. */
1529 abort ();
db9f0278
JB
1530 }
1531 }
1532 if (XTYPE (fun) == Lisp_Compiled)
1533 val = apply_lambda (fun, original_args, 1);
1534 else
1535 {
1536 if (!CONSP (fun))
1537 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1538 funcar = Fcar (fun);
1539 if (XTYPE (funcar) != Lisp_Symbol)
1540 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1541 if (EQ (funcar, Qautoload))
1542 {
1543 do_autoload (fun, original_fun);
1544 goto retry;
1545 }
1546 if (EQ (funcar, Qmacro))
1547 val = Feval (apply1 (Fcdr (fun), original_args));
1548 else if (EQ (funcar, Qlambda))
1549 val = apply_lambda (fun, original_args, 1);
1550 else if (EQ (funcar, Qmocklisp))
1551 val = ml_apply (fun, original_args);
1552 else
1553 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1554 }
1555 done:
1556 if (!EQ (Vmocklisp_arguments, Qt))
1557 {
265a9e55 1558 if (NILP (val))
db9f0278
JB
1559 XFASTINT (val) = 0;
1560 else if (EQ (val, Qt))
1561 XFASTINT (val) = 1;
1562 }
1563 lisp_eval_depth--;
1564 if (backtrace.debug_on_exit)
1565 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1566 backtrace_list = backtrace.next;
1567 return val;
1568}
1569\f
1570DEFUN ("apply", Fapply, Sapply, 2, MANY, 0,
1571 "Call FUNCTION with our remaining args, using our last arg as list of args.\n\
1572Thus, (apply '+ 1 2 '(3 4)) returns 10.")
1573 (nargs, args)
1574 int nargs;
1575 Lisp_Object *args;
1576{
1577 register int i, numargs;
1578 register Lisp_Object spread_arg;
1579 register Lisp_Object *funcall_args;
db9f0278 1580 Lisp_Object fun;
a6e3fa71 1581 struct gcpro gcpro1;
db9f0278
JB
1582
1583 fun = args [0];
1584 funcall_args = 0;
1585 spread_arg = args [nargs - 1];
1586 CHECK_LIST (spread_arg, nargs);
1587
1588 numargs = XINT (Flength (spread_arg));
1589
1590 if (numargs == 0)
1591 return Ffuncall (nargs - 1, args);
1592 else if (numargs == 1)
1593 {
1594 args [nargs - 1] = XCONS (spread_arg)->car;
1595 return Ffuncall (nargs, args);
1596 }
1597
a6e3fa71 1598 numargs += nargs - 2;
db9f0278 1599
ffd56f97
JB
1600 fun = indirect_function (fun);
1601 if (EQ (fun, Qunbound))
db9f0278 1602 {
ffd56f97
JB
1603 /* Let funcall get the error */
1604 fun = args[0];
1605 goto funcall;
db9f0278
JB
1606 }
1607
1608 if (XTYPE (fun) == Lisp_Subr)
1609 {
1610 if (numargs < XSUBR (fun)->min_args
1611 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
1612 goto funcall; /* Let funcall get the error */
1613 else if (XSUBR (fun)->max_args > numargs)
1614 {
1615 /* Avoid making funcall cons up a yet another new vector of arguments
1616 by explicitly supplying nil's for optional values */
1617 funcall_args = (Lisp_Object *) alloca ((1 + XSUBR (fun)->max_args)
1618 * sizeof (Lisp_Object));
1619 for (i = numargs; i < XSUBR (fun)->max_args;)
1620 funcall_args[++i] = Qnil;
a6e3fa71
JB
1621 GCPRO1 (*funcall_args);
1622 gcpro1.nvars = 1 + XSUBR (fun)->max_args;
db9f0278
JB
1623 }
1624 }
1625 funcall:
1626 /* We add 1 to numargs because funcall_args includes the
1627 function itself as well as its arguments. */
1628 if (!funcall_args)
a6e3fa71
JB
1629 {
1630 funcall_args = (Lisp_Object *) alloca ((1 + numargs)
1631 * sizeof (Lisp_Object));
1632 GCPRO1 (*funcall_args);
1633 gcpro1.nvars = 1 + numargs;
1634 }
1635
db9f0278
JB
1636 bcopy (args, funcall_args, nargs * sizeof (Lisp_Object));
1637 /* Spread the last arg we got. Its first element goes in
1638 the slot that it used to occupy, hence this value of I. */
1639 i = nargs - 1;
265a9e55 1640 while (!NILP (spread_arg))
db9f0278
JB
1641 {
1642 funcall_args [i++] = XCONS (spread_arg)->car;
1643 spread_arg = XCONS (spread_arg)->cdr;
1644 }
a6e3fa71
JB
1645
1646 RETURN_UNGCPRO (Ffuncall (gcpro1.nvars, funcall_args));
db9f0278
JB
1647}
1648\f
1649/* Apply fn to arg */
1650Lisp_Object
1651apply1 (fn, arg)
1652 Lisp_Object fn, arg;
1653{
a6e3fa71
JB
1654 struct gcpro gcpro1;
1655
1656 GCPRO1 (fn);
265a9e55 1657 if (NILP (arg))
a6e3fa71
JB
1658 RETURN_UNGCPRO (Ffuncall (1, &fn));
1659 gcpro1.nvars = 2;
db9f0278
JB
1660#ifdef NO_ARG_ARRAY
1661 {
1662 Lisp_Object args[2];
1663 args[0] = fn;
1664 args[1] = arg;
a6e3fa71
JB
1665 gcpro1.var = args;
1666 RETURN_UNGCPRO (Fapply (2, args));
db9f0278
JB
1667 }
1668#else /* not NO_ARG_ARRAY */
a6e3fa71 1669 RETURN_UNGCPRO (Fapply (2, &fn));
db9f0278
JB
1670#endif /* not NO_ARG_ARRAY */
1671}
1672
1673/* Call function fn on no arguments */
1674Lisp_Object
1675call0 (fn)
1676 Lisp_Object fn;
1677{
a6e3fa71
JB
1678 struct gcpro gcpro1;
1679
1680 GCPRO1 (fn);
1681 RETURN_UNGCPRO (Ffuncall (1, &fn));
db9f0278
JB
1682}
1683
1684/* Call function fn with argument arg */
1685/* ARGSUSED */
1686Lisp_Object
1687call1 (fn, arg)
1688 Lisp_Object fn, arg;
1689{
a6e3fa71 1690 struct gcpro gcpro1;
db9f0278 1691#ifdef NO_ARG_ARRAY
a6e3fa71
JB
1692 Lisp_Object args[2];
1693
db9f0278
JB
1694 args[0] = fn;
1695 args[1] = arg;
a6e3fa71
JB
1696 GCPRO1 (args[0]);
1697 gcpro1.nvars = 2;
1698 RETURN_UNGCPRO (Ffuncall (2, args));
db9f0278 1699#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1700 GCPRO1 (fn);
1701 gcpro1.nvars = 2;
1702 RETURN_UNGCPRO (Ffuncall (2, &fn));
db9f0278
JB
1703#endif /* not NO_ARG_ARRAY */
1704}
1705
1706/* Call function fn with arguments arg, arg1 */
1707/* ARGSUSED */
1708Lisp_Object
1709call2 (fn, arg, arg1)
1710 Lisp_Object fn, arg, arg1;
1711{
a6e3fa71 1712 struct gcpro gcpro1;
db9f0278
JB
1713#ifdef NO_ARG_ARRAY
1714 Lisp_Object args[3];
1715 args[0] = fn;
1716 args[1] = arg;
1717 args[2] = arg1;
a6e3fa71
JB
1718 GCPRO1 (args[0]);
1719 gcpro1.nvars = 3;
1720 RETURN_UNGCPRO (Ffuncall (3, args));
db9f0278 1721#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1722 GCPRO1 (fn);
1723 gcpro1.nvars = 3;
1724 RETURN_UNGCPRO (Ffuncall (3, &fn));
db9f0278
JB
1725#endif /* not NO_ARG_ARRAY */
1726}
1727
1728/* Call function fn with arguments arg, arg1, arg2 */
1729/* ARGSUSED */
1730Lisp_Object
1731call3 (fn, arg, arg1, arg2)
1732 Lisp_Object fn, arg, arg1, arg2;
1733{
a6e3fa71 1734 struct gcpro gcpro1;
db9f0278
JB
1735#ifdef NO_ARG_ARRAY
1736 Lisp_Object args[4];
1737 args[0] = fn;
1738 args[1] = arg;
1739 args[2] = arg1;
1740 args[3] = arg2;
a6e3fa71
JB
1741 GCPRO1 (args[0]);
1742 gcpro1.nvars = 4;
1743 RETURN_UNGCPRO (Ffuncall (4, args));
db9f0278 1744#else /* not NO_ARG_ARRAY */
a6e3fa71
JB
1745 GCPRO1 (fn);
1746 gcpro1.nvars = 4;
1747 RETURN_UNGCPRO (Ffuncall (4, &fn));
db9f0278
JB
1748#endif /* not NO_ARG_ARRAY */
1749}
1750
1751DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0,
1752 "Call first argument as a function, passing remaining arguments to it.\n\
1753Thus, (funcall 'cons 'x 'y) returns (x . y).")
1754 (nargs, args)
1755 int nargs;
1756 Lisp_Object *args;
1757{
1758 Lisp_Object fun;
1759 Lisp_Object funcar;
1760 int numargs = nargs - 1;
1761 Lisp_Object lisp_numargs;
1762 Lisp_Object val;
1763 struct backtrace backtrace;
1764 register Lisp_Object *internal_args;
1765 register int i;
1766
1767 QUIT;
1768 if (consing_since_gc > gc_cons_threshold)
a6e3fa71 1769 Fgarbage_collect ();
db9f0278
JB
1770
1771 if (++lisp_eval_depth > max_lisp_eval_depth)
1772 {
1773 if (max_lisp_eval_depth < 100)
1774 max_lisp_eval_depth = 100;
1775 if (lisp_eval_depth > max_lisp_eval_depth)
1776 error ("Lisp nesting exceeds max-lisp-eval-depth");
1777 }
1778
1779 backtrace.next = backtrace_list;
1780 backtrace_list = &backtrace;
1781 backtrace.function = &args[0];
1782 backtrace.args = &args[1];
1783 backtrace.nargs = nargs - 1;
1784 backtrace.evalargs = 0;
1785 backtrace.debug_on_exit = 0;
1786
1787 if (debug_on_next_call)
1788 do_debug_on_call (Qlambda);
1789
1790 retry:
1791
1792 fun = args[0];
ffd56f97
JB
1793
1794 fun = Findirect_function (fun);
db9f0278
JB
1795
1796 if (XTYPE (fun) == Lisp_Subr)
1797 {
1798 if (numargs < XSUBR (fun)->min_args
1799 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
1800 {
1801 XFASTINT (lisp_numargs) = numargs;
1802 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (lisp_numargs, Qnil)));
1803 }
1804
1805 if (XSUBR (fun)->max_args == UNEVALLED)
1806 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1807
1808 if (XSUBR (fun)->max_args == MANY)
1809 {
1810 val = (*XSUBR (fun)->function) (numargs, args + 1);
1811 goto done;
1812 }
1813
1814 if (XSUBR (fun)->max_args > numargs)
1815 {
1816 internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object));
1817 bcopy (args + 1, internal_args, numargs * sizeof (Lisp_Object));
1818 for (i = numargs; i < XSUBR (fun)->max_args; i++)
1819 internal_args[i] = Qnil;
1820 }
1821 else
1822 internal_args = args + 1;
1823 switch (XSUBR (fun)->max_args)
1824 {
1825 case 0:
1826 val = (*XSUBR (fun)->function) ();
1827 goto done;
1828 case 1:
1829 val = (*XSUBR (fun)->function) (internal_args[0]);
1830 goto done;
1831 case 2:
1832 val = (*XSUBR (fun)->function) (internal_args[0],
1833 internal_args[1]);
1834 goto done;
1835 case 3:
1836 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1837 internal_args[2]);
1838 goto done;
1839 case 4:
1840 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1841 internal_args[2],
1842 internal_args[3]);
1843 goto done;
1844 case 5:
1845 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1846 internal_args[2], internal_args[3],
1847 internal_args[4]);
1848 goto done;
1849 case 6:
1850 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1851 internal_args[2], internal_args[3],
1852 internal_args[4], internal_args[5]);
1853 goto done;
15c65264
RS
1854 case 7:
1855 val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1856 internal_args[2], internal_args[3],
1857 internal_args[4], internal_args[5],
1858 internal_args[6]);
1859 goto done;
db9f0278
JB
1860
1861 default:
70ee42f7
JB
1862
1863 /* If a subr takes more than 6 arguments without using MANY
1864 or UNEVALLED, we need to extend this function to support it.
1865 Until this is done, there is no way to call the function. */
1866 abort ();
db9f0278
JB
1867 }
1868 }
1869 if (XTYPE (fun) == Lisp_Compiled)
1870 val = funcall_lambda (fun, numargs, args + 1);
1871 else
1872 {
1873 if (!CONSP (fun))
1874 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1875 funcar = Fcar (fun);
1876 if (XTYPE (funcar) != Lisp_Symbol)
1877 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1878 if (EQ (funcar, Qlambda))
1879 val = funcall_lambda (fun, numargs, args + 1);
1880 else if (EQ (funcar, Qmocklisp))
1881 val = ml_apply (fun, Flist (numargs, args + 1));
1882 else if (EQ (funcar, Qautoload))
1883 {
1884 do_autoload (fun, args[0]);
1885 goto retry;
1886 }
1887 else
1888 return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1889 }
1890 done:
1891 lisp_eval_depth--;
1892 if (backtrace.debug_on_exit)
1893 val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1894 backtrace_list = backtrace.next;
1895 return val;
1896}
1897\f
1898Lisp_Object
1899apply_lambda (fun, args, eval_flag)
1900 Lisp_Object fun, args;
1901 int eval_flag;
1902{
1903 Lisp_Object args_left;
1904 Lisp_Object numargs;
1905 register Lisp_Object *arg_vector;
1906 struct gcpro gcpro1, gcpro2, gcpro3;
1907 register int i;
1908 register Lisp_Object tem;
1909
1910 numargs = Flength (args);
1911 arg_vector = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1912 args_left = args;
1913
1914 GCPRO3 (*arg_vector, args_left, fun);
1915 gcpro1.nvars = 0;
1916
1917 for (i = 0; i < XINT (numargs);)
1918 {
1919 tem = Fcar (args_left), args_left = Fcdr (args_left);
1920 if (eval_flag) tem = Feval (tem);
1921 arg_vector[i++] = tem;
1922 gcpro1.nvars = i;
1923 }
1924
1925 UNGCPRO;
1926
1927 if (eval_flag)
1928 {
1929 backtrace_list->args = arg_vector;
1930 backtrace_list->nargs = i;
1931 }
1932 backtrace_list->evalargs = 0;
1933 tem = funcall_lambda (fun, XINT (numargs), arg_vector);
1934
1935 /* Do the debug-on-exit now, while arg_vector still exists. */
1936 if (backtrace_list->debug_on_exit)
1937 tem = call_debugger (Fcons (Qexit, Fcons (tem, Qnil)));
1938 /* Don't do it again when we return to eval. */
1939 backtrace_list->debug_on_exit = 0;
1940 return tem;
1941}
1942
1943/* Apply a Lisp function FUN to the NARGS evaluated arguments in ARG_VECTOR
1944 and return the result of evaluation.
1945 FUN must be either a lambda-expression or a compiled-code object. */
1946
1947Lisp_Object
1948funcall_lambda (fun, nargs, arg_vector)
1949 Lisp_Object fun;
1950 int nargs;
1951 register Lisp_Object *arg_vector;
1952{
1953 Lisp_Object val, tem;
1954 register Lisp_Object syms_left;
1955 Lisp_Object numargs;
1956 register Lisp_Object next;
1957 int count = specpdl_ptr - specpdl;
1958 register int i;
1959 int optional = 0, rest = 0;
1960
1961 specbind (Qmocklisp_arguments, Qt); /* t means NOT mocklisp! */
1962
1963 XFASTINT (numargs) = nargs;
1964
1965 if (XTYPE (fun) == Lisp_Cons)
1966 syms_left = Fcar (Fcdr (fun));
1967 else if (XTYPE (fun) == Lisp_Compiled)
1968 syms_left = XVECTOR (fun)->contents[COMPILED_ARGLIST];
1969 else abort ();
1970
1971 i = 0;
265a9e55 1972 for (; !NILP (syms_left); syms_left = Fcdr (syms_left))
db9f0278
JB
1973 {
1974 QUIT;
1975 next = Fcar (syms_left);
9ffa21d4
JB
1976 while (XTYPE (next) != Lisp_Symbol)
1977 next = Fsignal (Qinvalid_function, Fcons (fun, Qnil));
db9f0278
JB
1978 if (EQ (next, Qand_rest))
1979 rest = 1;
1980 else if (EQ (next, Qand_optional))
1981 optional = 1;
1982 else if (rest)
1983 {
9ffa21d4 1984 specbind (next, Flist (nargs - i, &arg_vector[i]));
db9f0278
JB
1985 i = nargs;
1986 }
1987 else if (i < nargs)
1988 {
1989 tem = arg_vector[i++];
1990 specbind (next, tem);
1991 }
1992 else if (!optional)
1993 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1994 else
1995 specbind (next, Qnil);
1996 }
1997
1998 if (i < nargs)
1999 return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
2000
2001 if (XTYPE (fun) == Lisp_Cons)
2002 val = Fprogn (Fcdr (Fcdr (fun)));
2003 else
2004 val = Fbyte_code (XVECTOR (fun)->contents[COMPILED_BYTECODE],
2005 XVECTOR (fun)->contents[COMPILED_CONSTANTS],
2006 XVECTOR (fun)->contents[COMPILED_STACK_DEPTH]);
2007 return unbind_to (count, val);
2008}
2009\f
2010void
2011grow_specpdl ()
2012{
2013 register int count = specpdl_ptr - specpdl;
2014 if (specpdl_size >= max_specpdl_size)
2015 {
2016 if (max_specpdl_size < 400)
2017 max_specpdl_size = 400;
2018 if (specpdl_size >= max_specpdl_size)
2019 {
2020 Fsignal (Qerror,
2021 Fcons (build_string ("Variable binding depth exceeds max-specpdl-size"), Qnil));
2022 max_specpdl_size *= 2;
2023 }
2024 }
2025 specpdl_size *= 2;
2026 if (specpdl_size > max_specpdl_size)
2027 specpdl_size = max_specpdl_size;
2028 specpdl = (struct specbinding *) xrealloc (specpdl, specpdl_size * sizeof (struct specbinding));
2029 specpdl_ptr = specpdl + count;
2030}
2031
2032void
2033specbind (symbol, value)
2034 Lisp_Object symbol, value;
2035{
2036 extern void store_symval_forwarding (); /* in eval.c */
2037 Lisp_Object ovalue;
2038
9ffa21d4
JB
2039 CHECK_SYMBOL (symbol, 0);
2040
db9f0278
JB
2041 if (specpdl_ptr == specpdl + specpdl_size)
2042 grow_specpdl ();
2043 specpdl_ptr->symbol = symbol;
2044 specpdl_ptr->func = 0;
2045 ovalue = XSYMBOL (symbol)->value;
2046 specpdl_ptr->old_value = EQ (ovalue, Qunbound) ? Qunbound : Fsymbol_value (symbol);
2047 specpdl_ptr++;
2048 if (XTYPE (ovalue) == Lisp_Buffer_Objfwd)
2049 store_symval_forwarding (symbol, ovalue, value);
2050 else
2051 Fset (symbol, value);
2052}
2053
2054void
2055record_unwind_protect (function, arg)
2056 Lisp_Object (*function)();
2057 Lisp_Object arg;
2058{
2059 if (specpdl_ptr == specpdl + specpdl_size)
2060 grow_specpdl ();
2061 specpdl_ptr->func = function;
2062 specpdl_ptr->symbol = Qnil;
2063 specpdl_ptr->old_value = arg;
2064 specpdl_ptr++;
2065}
2066
2067Lisp_Object
2068unbind_to (count, value)
2069 int count;
2070 Lisp_Object value;
2071{
265a9e55 2072 int quitf = !NILP (Vquit_flag);
db9f0278
JB
2073 struct gcpro gcpro1;
2074
2075 GCPRO1 (value);
2076
2077 Vquit_flag = Qnil;
2078
2079 while (specpdl_ptr != specpdl + count)
2080 {
2081 --specpdl_ptr;
2082 if (specpdl_ptr->func != 0)
2083 (*specpdl_ptr->func) (specpdl_ptr->old_value);
2084 /* Note that a "binding" of nil is really an unwind protect,
2085 so in that case the "old value" is a list of forms to evaluate. */
265a9e55 2086 else if (NILP (specpdl_ptr->symbol))
db9f0278
JB
2087 Fprogn (specpdl_ptr->old_value);
2088 else
2089 Fset (specpdl_ptr->symbol, specpdl_ptr->old_value);
2090 }
265a9e55 2091 if (NILP (Vquit_flag) && quitf) Vquit_flag = Qt;
db9f0278
JB
2092
2093 UNGCPRO;
2094
2095 return value;
2096}
2097\f
2098#if 0
2099
2100/* Get the value of symbol's global binding, even if that binding
2101 is not now dynamically visible. */
2102
2103Lisp_Object
2104top_level_value (symbol)
2105 Lisp_Object symbol;
2106{
2107 register struct specbinding *ptr = specpdl;
2108
2109 CHECK_SYMBOL (symbol, 0);
2110 for (; ptr != specpdl_ptr; ptr++)
2111 {
2112 if (EQ (ptr->symbol, symbol))
2113 return ptr->old_value;
2114 }
2115 return Fsymbol_value (symbol);
2116}
2117
2118Lisp_Object
2119top_level_set (symbol, newval)
2120 Lisp_Object symbol, newval;
2121{
2122 register struct specbinding *ptr = specpdl;
2123
2124 CHECK_SYMBOL (symbol, 0);
2125 for (; ptr != specpdl_ptr; ptr++)
2126 {
2127 if (EQ (ptr->symbol, symbol))
2128 {
2129 ptr->old_value = newval;
2130 return newval;
2131 }
2132 }
2133 return Fset (symbol, newval);
2134}
2135
2136#endif /* 0 */
2137\f
2138DEFUN ("backtrace-debug", Fbacktrace_debug, Sbacktrace_debug, 2, 2, 0,
2139 "Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.\n\
2140The debugger is entered when that frame exits, if the flag is non-nil.")
2141 (level, flag)
2142 Lisp_Object level, flag;
2143{
2144 register struct backtrace *backlist = backtrace_list;
2145 register int i;
2146
2147 CHECK_NUMBER (level, 0);
2148
2149 for (i = 0; backlist && i < XINT (level); i++)
2150 {
2151 backlist = backlist->next;
2152 }
2153
2154 if (backlist)
265a9e55 2155 backlist->debug_on_exit = !NILP (flag);
db9f0278
JB
2156
2157 return flag;
2158}
2159
2160DEFUN ("backtrace", Fbacktrace, Sbacktrace, 0, 0, "",
2161 "Print a trace of Lisp function calls currently active.\n\
2162Output stream used is value of `standard-output'.")
2163 ()
2164{
2165 register struct backtrace *backlist = backtrace_list;
2166 register int i;
2167 Lisp_Object tail;
2168 Lisp_Object tem;
2169 extern Lisp_Object Vprint_level;
2170 struct gcpro gcpro1;
2171
2172 entering_debugger = 0;
2173
2174 XFASTINT (Vprint_level) = 3;
2175
2176 tail = Qnil;
2177 GCPRO1 (tail);
2178
2179 while (backlist)
2180 {
2181 write_string (backlist->debug_on_exit ? "* " : " ", 2);
2182 if (backlist->nargs == UNEVALLED)
2183 {
2184 Fprin1 (Fcons (*backlist->function, *backlist->args), Qnil);
2185 }
2186 else
2187 {
2188 tem = *backlist->function;
2189 Fprin1 (tem, Qnil); /* This can QUIT */
2190 write_string ("(", -1);
2191 if (backlist->nargs == MANY)
2192 {
2193 for (tail = *backlist->args, i = 0;
265a9e55 2194 !NILP (tail);
db9f0278
JB
2195 tail = Fcdr (tail), i++)
2196 {
2197 if (i) write_string (" ", -1);
2198 Fprin1 (Fcar (tail), Qnil);
2199 }
2200 }
2201 else
2202 {
2203 for (i = 0; i < backlist->nargs; i++)
2204 {
2205 if (i) write_string (" ", -1);
2206 Fprin1 (backlist->args[i], Qnil);
2207 }
2208 }
2209 }
2210 write_string (")\n", -1);
2211 backlist = backlist->next;
2212 }
2213
2214 Vprint_level = Qnil;
2215 UNGCPRO;
2216 return Qnil;
2217}
2218
2219DEFUN ("backtrace-frame", Fbacktrace_frame, Sbacktrace_frame, 1, 1, "",
2220 "Return the function and arguments N frames up from current execution point.\n\
2221If that frame has not evaluated the arguments yet (or is a special form),\n\
2222the value is (nil FUNCTION ARG-FORMS...).\n\
2223If that frame has evaluated its arguments and called its function already,\n\
2224the value is (t FUNCTION ARG-VALUES...).\n\
2225A &rest arg is represented as the tail of the list ARG-VALUES.\n\
2226FUNCTION is whatever was supplied as car of evaluated list,\n\
2227or a lambda expression for macro calls.\n\
2228If N is more than the number of frames, the value is nil.")
2229 (nframes)
2230 Lisp_Object nframes;
2231{
2232 register struct backtrace *backlist = backtrace_list;
2233 register int i;
2234 Lisp_Object tem;
2235
2236 CHECK_NATNUM (nframes, 0);
2237
2238 /* Find the frame requested. */
2239 for (i = 0; i < XFASTINT (nframes); i++)
2240 backlist = backlist->next;
2241
2242 if (!backlist)
2243 return Qnil;
2244 if (backlist->nargs == UNEVALLED)
2245 return Fcons (Qnil, Fcons (*backlist->function, *backlist->args));
2246 else
2247 {
2248 if (backlist->nargs == MANY)
2249 tem = *backlist->args;
2250 else
2251 tem = Flist (backlist->nargs, backlist->args);
2252
2253 return Fcons (Qt, Fcons (*backlist->function, tem));
2254 }
2255}
2256\f
2257syms_of_eval ()
2258{
2259 DEFVAR_INT ("max-specpdl-size", &max_specpdl_size,
2260 "Limit on number of Lisp variable bindings & unwind-protects before error.");
2261
2262 DEFVAR_INT ("max-lisp-eval-depth", &max_lisp_eval_depth,
2263 "Limit on depth in `eval', `apply' and `funcall' before error.\n\
2264This limit is to catch infinite recursions for you before they cause\n\
2265actual stack overflow in C, which would be fatal for Emacs.\n\
2266You can safely make it considerably larger than its default value,\n\
2267if that proves inconveniently small.");
2268
2269 DEFVAR_LISP ("quit-flag", &Vquit_flag,
2270 "Non-nil causes `eval' to abort, unless `inhibit-quit' is non-nil.\n\
2271Typing C-G sets `quit-flag' non-nil, regardless of `inhibit-quit'.");
2272 Vquit_flag = Qnil;
2273
2274 DEFVAR_LISP ("inhibit-quit", &Vinhibit_quit,
2275 "Non-nil inhibits C-g quitting from happening immediately.\n\
2276Note that `quit-flag' will still be set by typing C-g,\n\
2277so a quit will be signalled as soon as `inhibit-quit' is nil.\n\
2278To prevent this happening, set `quit-flag' to nil\n\
2279before making `inhibit-quit' nil.");
2280 Vinhibit_quit = Qnil;
2281
ad236261
JB
2282 Qinhibit_quit = intern ("inhibit-quit");
2283 staticpro (&Qinhibit_quit);
2284
db9f0278
JB
2285 Qautoload = intern ("autoload");
2286 staticpro (&Qautoload);
2287
2288 Qdebug_on_error = intern ("debug-on-error");
2289 staticpro (&Qdebug_on_error);
2290
2291 Qmacro = intern ("macro");
2292 staticpro (&Qmacro);
2293
2294 /* Note that the process handling also uses Qexit, but we don't want
2295 to staticpro it twice, so we just do it here. */
2296 Qexit = intern ("exit");
2297 staticpro (&Qexit);
2298
2299 Qinteractive = intern ("interactive");
2300 staticpro (&Qinteractive);
2301
2302 Qcommandp = intern ("commandp");
2303 staticpro (&Qcommandp);
2304
2305 Qdefun = intern ("defun");
2306 staticpro (&Qdefun);
2307
2308 Qand_rest = intern ("&rest");
2309 staticpro (&Qand_rest);
2310
2311 Qand_optional = intern ("&optional");
2312 staticpro (&Qand_optional);
2313
128c0f66 2314 DEFVAR_LISP ("stack-trace-on-error", &Vstack_trace_on_error,
db9f0278 2315 "*Non-nil means automatically display a backtrace buffer\n\
128c0f66
RM
2316after any error that is handled by the editor command loop.\n\
2317If the value is a list, an error only means to display a backtrace\n\
2318if one of its condition symbols appears in the list.");
2319 Vstack_trace_on_error = Qnil;
db9f0278 2320
128c0f66 2321 DEFVAR_LISP ("debug-on-error", &Vdebug_on_error,
db9f0278
JB
2322 "*Non-nil means enter debugger if an error is signaled.\n\
2323Does not apply to errors handled by `condition-case'.\n\
128c0f66
RM
2324If the value is a list, an error only means to enter the debugger\n\
2325if one of its condition symbols appears in the list.\n\
db9f0278 2326See also variable `debug-on-quit'.");
128c0f66 2327 Vdebug_on_error = Qnil;
db9f0278
JB
2328
2329 DEFVAR_BOOL ("debug-on-quit", &debug_on_quit,
2330 "*Non-nil means enter debugger if quit is signaled (C-G, for example).\n\
daa37602
JB
2331Does not apply if quit is handled by a `condition-case'.\n\
2332A non-nil value is equivalent to a `debug-on-error' value containing `quit'.");
db9f0278
JB
2333 debug_on_quit = 0;
2334
2335 DEFVAR_BOOL ("debug-on-next-call", &debug_on_next_call,
2336 "Non-nil means enter debugger before next `eval', `apply' or `funcall'.");
2337
2338 DEFVAR_LISP ("debugger", &Vdebugger,
2339 "Function to call to invoke debugger.\n\
2340If due to frame exit, args are `exit' and the value being returned;\n\
2341 this function's value will be returned instead of that.\n\
2342If due to error, args are `error' and a list of the args to `signal'.\n\
2343If due to `apply' or `funcall' entry, one arg, `lambda'.\n\
2344If due to `eval' entry, one arg, t.");
2345 Vdebugger = Qnil;
2346
2347 Qmocklisp_arguments = intern ("mocklisp-arguments");
2348 staticpro (&Qmocklisp_arguments);
2349 DEFVAR_LISP ("mocklisp-arguments", &Vmocklisp_arguments,
2350 "While in a mocklisp function, the list of its unevaluated args.");
2351 Vmocklisp_arguments = Qt;
2352
2353 DEFVAR_LISP ("run-hooks", &Vrun_hooks,
2354 "Set to the function `run-hooks', if that function has been defined.\n\
2355Otherwise, nil (in a bare Emacs without preloaded Lisp code).");
2356 Vrun_hooks = Qnil;
2357
2358 staticpro (&Vautoload_queue);
2359 Vautoload_queue = Qnil;
2360
2361 defsubr (&Sor);
2362 defsubr (&Sand);
2363 defsubr (&Sif);
2364 defsubr (&Scond);
2365 defsubr (&Sprogn);
2366 defsubr (&Sprog1);
2367 defsubr (&Sprog2);
2368 defsubr (&Ssetq);
2369 defsubr (&Squote);
2370 defsubr (&Sfunction);
2371 defsubr (&Sdefun);
2372 defsubr (&Sdefmacro);
2373 defsubr (&Sdefvar);
2374 defsubr (&Sdefconst);
2375 defsubr (&Suser_variable_p);
2376 defsubr (&Slet);
2377 defsubr (&SletX);
2378 defsubr (&Swhile);
2379 defsubr (&Smacroexpand);
2380 defsubr (&Scatch);
2381 defsubr (&Sthrow);
2382 defsubr (&Sunwind_protect);
2383 defsubr (&Scondition_case);
2384 defsubr (&Ssignal);
2385 defsubr (&Sinteractive_p);
2386 defsubr (&Scommandp);
2387 defsubr (&Sautoload);
2388 defsubr (&Seval);
2389 defsubr (&Sapply);
2390 defsubr (&Sfuncall);
2391 defsubr (&Sbacktrace_debug);
2392 defsubr (&Sbacktrace);
2393 defsubr (&Sbacktrace_frame);
2394}