annotate src/eval.c @ 23323:0800a4f84757

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