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