annotate src/eval.c @ 4413:5a00cec8e9b0

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