annotate src/eval.c @ 589:37fe04af1590

[xemacs-hg @ 2001-05-31 02:00:29 by wmperry] Regenerated some .c files from their lisp equivalents for GTK bindings. Fix buttons as modifiers code so that text selection works in GTK event loop.
author wmperry
date Thu, 31 May 2001 02:00:31 +0000
parents 190b164ddcac
children 13e3d7ae7155
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Evaluator for XEmacs Lisp interpreter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985-1987, 1992-1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4 Copyright (C) 2000, 2001 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: FSF 19.30 (except for Fsignal), Mule 2.0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include "commands.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "backtrace.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "bytecode.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "console.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #ifdef ERROR_CHECK_GC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 int always_gc; /* Debugging hack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #define always_gc 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 struct backtrace *backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 /* Note: you must always fill in all of the fields in a backtrace structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 before pushing them on the backtrace_list. The profiling code depends
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 on this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #define PUSH_BACKTRACE(bt) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (bt).next = backtrace_list; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 backtrace_list = &(bt); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #define POP_BACKTRACE(bt) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 backtrace_list = (bt).next; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 /* Macros for calling subrs with an argument list whose length is only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 known at runtime. See EXFUN and DEFUN for similar hackery. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #define AV_0(av)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #define AV_1(av) av[0]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #define AV_2(av) AV_1(av), av[1]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #define AV_3(av) AV_2(av), av[2]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 #define AV_4(av) AV_3(av), av[3]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #define AV_5(av) AV_4(av), av[4]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #define AV_6(av) AV_5(av), av[5]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #define AV_7(av) AV_6(av), av[6]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #define AV_8(av) AV_7(av), av[7]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #define PRIMITIVE_FUNCALL_1(fn, av, ac) \
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
70 (((Lisp_Object (*)(EXFUN_##ac)) (fn)) (AV_##ac (av)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 /* If subrs take more than 8 arguments, more cases need to be added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 to this switch. (But wait - don't do it - if you really need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 a SUBR with more than 8 arguments, use max_args == MANY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 See the DEFUN macro in lisp.h) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #define PRIMITIVE_FUNCALL(rv, fn, av, ac) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 void (*PF_fn)(void) = (void (*)(void)) fn; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 Lisp_Object *PF_av = (av); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 switch (ac) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 { \
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
81 default:rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 0); break; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 case 1: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 1); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 case 2: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 2); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 case 3: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 3); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 case 4: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 4); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 case 5: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 5); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 case 6: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 6); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 case 7: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 7); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 case 8: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 8); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #define FUNCALL_SUBR(rv, subr, av, ac) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 PRIMITIVE_FUNCALL (rv, subr_function (subr), av, ac);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 /* This is the list of current catches (and also condition-cases).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 This is a stack: the most recent catch is at the head of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 list. Catches are created by declaring a 'struct catchtag'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 locally, filling the .TAG field in with the tag, and doing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 a setjmp() on .JMP. Fthrow() will store the value passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 to it in .VAL and longjmp() back to .JMP, back to the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 that established the catch. This will always be either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 internal_catch() (catches established internally or through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 `catch') or condition_case_1 (condition-cases established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 internally or through `condition-case').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 The catchtag also records the current position in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 call stack (stored in BACKTRACE_LIST), the current position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 in the specpdl stack (used for variable bindings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 unwind-protects), the value of LISP_EVAL_DEPTH, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 current position in the GCPRO stack. All of these are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 restored by Fthrow().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 struct catchtag *catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 Lisp_Object Qautoload, Qmacro, Qexit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 Lisp_Object Qinteractive, Qcommandp, Qdefun, Qprogn, Qvalues;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 Lisp_Object Vquit_flag, Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 Lisp_Object Qand_rest, Qand_optional;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 Lisp_Object Qdebug_on_error, Qstack_trace_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 Lisp_Object Qdebug_on_signal, Qstack_trace_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 Lisp_Object Qdebugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Lisp_Object Qinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 Lisp_Object Qrun_hooks;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 Lisp_Object Qsetq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 Lisp_Object Qdisplay_warning;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 Lisp_Object Vpending_warnings, Vpending_warnings_tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Lisp_Object Qif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 /* Records whether we want errors to occur. This will be a boolean,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 nil (errors OK) or t (no errors). If t, an error will cause a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 throw to Qunbound_suspended_errors_tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 See call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Lisp_Object Vcurrent_error_state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 /* Current warning class when warnings occur, or nil for no warnings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Only meaningful when Vcurrent_error_state is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 See call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 Lisp_Object Vcurrent_warning_class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 /* Special catch tag used in call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 Lisp_Object Qunbound_suspended_errors_tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 /* Non-nil means record all fset's and provide's, to be undone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 if the file being autoloaded is not fully loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 They are recorded by being consed onto the front of Vautoload_queue:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (FUN . ODEF) for a defun, (OFEATURES . nil) for a provide. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 Lisp_Object Vautoload_queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 /* Current number of specbindings allocated in specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 int specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 /* Pointer to beginning of specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 struct specbinding *specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 /* Pointer to first unused element in specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 struct specbinding *specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* specpdl_ptr - specpdl */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 int specpdl_depth_counter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* Maximum size allowed for specpdl allocation */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
166 Fixnum max_specpdl_size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 /* Depth in Lisp evaluations and function calls. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 static int lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 /* Maximum allowed depth in Lisp evaluations and function calls. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
172 Fixnum max_lisp_eval_depth;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 /* Nonzero means enter debugger before next function call */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 static int debug_on_next_call;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 /* List of conditions (non-nil atom means all) which cause a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 if an error is handled by the command loop's error handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 Lisp_Object Vstack_trace_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 /* List of conditions (non-nil atom means all) which enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 if an error is handled by the command loop's error handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 Lisp_Object Vdebug_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 /* List of conditions and regexps specifying error messages which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 do not enter the debugger even if Vdebug_on_error says they should. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 Lisp_Object Vdebug_ignored_errors;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 /* List of conditions (non-nil atom means all) which cause a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 if any error is signalled. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 Lisp_Object Vstack_trace_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 /* List of conditions (non-nil atom means all) which enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 if any error is signalled. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 Lisp_Object Vdebug_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 /* Nonzero means enter debugger if a quit signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 is handled by the command loop's error handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 From lisp, this is a boolean variable and may have the values 0 and 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 But, eval.c temporarily uses the second bit of this variable to indicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 that a critical_quit is in progress. The second bit is reset immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 after it is processed in signal_call_debugger(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 int debug_on_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* entering_debugger is basically equivalent */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 /* The value of num_nonmacro_input_chars as of the last time we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 started to enter the debugger. If we decide to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 again when this is still equal to num_nonmacro_input_chars, then we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 know that the debugger itself has an error, and we should just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 signal the error instead of entering an infinite loop of debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 invocations. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 int when_entered_debugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* Nonzero means we are trying to enter the debugger.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 This is to prevent recursive attempts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 Cleared by the debugger calling Fbacktrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 static int entering_debugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 /* Function to call to invoke the debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 Lisp_Object Vdebugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 /* Chain of condition handlers currently in effect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 The elements of this chain are contained in the stack frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 of Fcondition_case and internal_condition_case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 When an error is signaled (by calling Fsignal, below),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 this chain is searched for an element that applies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 Each element of this list is one of the following:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 A list of a handler function and possibly args to pass to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 the function. This is a handler established with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 `call-with-condition-handler' (q.v.).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 A list whose car is Qunbound and whose cdr is Qt.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 This is a special condition-case handler established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 by C code with condition_case_1(). All errors are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 trapped; the debugger is not invoked even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 A list whose car is Qunbound and whose cdr is Qerror.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 This is a special condition-case handler established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 by C code with condition_case_1(). It is like Qt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 except that the debugger is invoked normally if it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 called for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 A list whose car is Qunbound and whose cdr is a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 of lists (CONDITION-NAME BODY ...) exactly as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 `condition-case'. This is a normal `condition-case'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 Note that in all cases *except* the first, there is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 corresponding catch, whose TAG is the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 Vcondition_handlers just after the handler data just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 described is pushed onto it. The reason is that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 `condition-case' handlers need to throw back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 place where the handler was installed before invoking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 it, while `call-with-condition-handler' handlers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 invoked in the environment that `signal' was invoked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 static Lisp_Object Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267 #define DEFEND_AGAINST_THROW_RECURSION
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
268
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
269 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 /* Used for error catching purposes by throw_or_bomb_out */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 static int throw_level;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
274 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 void check_error_state_sanity (void);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 /* The subr object type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 print_subr (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 Lisp_Subr *subr = XSUBR (obj);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
287 const char *header =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (subr->max_args == UNEVALLED) ? "#<special-form " : "#<subr ";
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289 const char *name = subr_name (subr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 const char *trailer = subr->prompt ? " (interactive)>" : ">";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
293 printing_unreadable_object ("%s%s%s", header, name, trailer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 write_c_string (header, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 write_c_string (name, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 write_c_string (trailer, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 static const struct lrecord_description subr_description[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
301 { XD_DOC_STRING, offsetof (Lisp_Subr, doc) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("subr", subr,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
306 0, print_subr, 0, 0, 0,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 subr_description,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 Lisp_Subr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 /* Entering the debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 /* unwind-protect used by call_debugger() to restore the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 entering_debugger. (We cannot use specbind() because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 variable is not Lisp-accessible.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 restore_entering_debugger (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 entering_debugger = ! NILP (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 return arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* Actually call the debugger. ARG is a list of args that will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 passed to the debugger function, as follows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 If due to frame exit, args are `exit' and the value being returned;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 this function's value will be returned instead of that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 If due to error, args are `error' and a list of the args to `signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 If due to `apply' or `funcall' entry, one arg, `lambda'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 If due to `eval' entry, one arg, t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 call_debugger_259 (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 return apply1 (Vdebugger, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 /* Call the debugger, doing some encapsulation. We make sure we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 some room on the eval and specpdl stacks, and bind entering_debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 to 1 during this call. This is used to trap errors that may occur
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 when entering the debugger (e.g. the value of `debugger' is invalid),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 so that the debugger will not be recursively entered if debug-on-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 is set. (Otherwise, XEmacs would infinitely recurse, attempting to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 enter the debugger.) entering_debugger gets reset to 0 as soon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 as a backtrace is displayed, so that further errors can indeed be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 handled normally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 We also establish a catch for 'debugger. If the debugger function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 throws to this instead of returning a value, it means that the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 pressed 'c' (pretend like the debugger was never entered). The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 function then returns Qunbound. (If the user pressed 'r', for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 return a value, then the debugger function returns normally with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 this value.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 The difference between 'c' and 'r' is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 debug-on-call:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 No difference. The call proceeds as normal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 debug-on-exit:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 With 'r', the specified value is returned as the function's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 return value. With 'c', the value that would normally be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 returned is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 signal:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 With 'r', the specified value is returned as the return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 value of `signal'. (This is the only time that `signal'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 can return, instead of making a non-local exit.) With `c',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 `signal' will continue looking for handlers as if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 debugger was never entered, and will probably end up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 throwing to a handler or to top-level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 call_debugger (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 int threw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 if (lisp_eval_depth + 20 > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 max_lisp_eval_depth = lisp_eval_depth + 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 if (specpdl_size + 40 > max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 max_specpdl_size = specpdl_size + 40;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 record_unwind_protect (restore_entering_debugger,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (entering_debugger ? Qt : Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 entering_debugger = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 val = internal_catch (Qdebugger, call_debugger_259, arg, &threw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 return unbind_to (speccount, ((threw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 ? Qunbound /* Not returning a value */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 : val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 /* Called when debug-on-exit behavior is called for. Enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 with the appropriate args for this. VAL is the exit value that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 about to be returned. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 do_debug_on_exit (Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 /* This is falsified by call_debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 Lisp_Object v = call_debugger (list2 (Qexit, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 return !UNBOUNDP (v) ? v : val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 /* Called when debug-on-call behavior is called for. Enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 with the appropriate args for this. VAL is either t for a call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 through `eval' or 'lambda for a call through `funcall'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 #### The differentiation here between EVAL and FUNCALL is bogus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 FUNCALL can be defined as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (defmacro func (fun &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (cons (eval fun) args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 and should be treated as such.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 do_debug_on_call (Lisp_Object code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 backtrace_list->debug_on_exit = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 call_debugger (list1 (code));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 /* LIST is the value of one of the variables `debug-on-error',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 `debug-on-signal', `stack-trace-on-error', or `stack-trace-on-signal',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 and CONDITIONS is the list of error conditions associated with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 the error being signalled. This returns non-nil if LIST
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 matches CONDITIONS. (A nil value for LIST does not match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 CONDITIONS. A non-list value for LIST does match CONDITIONS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 A list matches CONDITIONS when one of the symbols in LIST is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 same as one of the symbols in CONDITIONS.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 wants_debugger (Lisp_Object list, Lisp_Object conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 if (NILP (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 if (! CONSP (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 while (CONSP (conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 Lisp_Object this, tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 this = XCAR (conditions);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 for (tail = list; CONSP (tail); tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 if (EQ (XCAR (tail), this))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 conditions = XCDR (conditions);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 /* Return 1 if an error with condition-symbols CONDITIONS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 and described by SIGNAL-DATA, should skip the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 according to debugger-ignore-errors. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 skip_debugger (Lisp_Object conditions, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 Lisp_Object tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 int first_string = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 Lisp_Object error_message = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 for (tail = Vdebug_ignored_errors; CONSP (tail); tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 if (STRINGP (XCAR (tail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 if (first_string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 error_message = Ferror_message_string (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 first_string = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 if (fast_lisp_string_match (XCAR (tail), error_message) >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 Lisp_Object contail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 for (contail = conditions; CONSP (contail); contail = XCDR (contail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 if (EQ (XCAR (tail), XCAR (contail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 /* Actually generate a backtrace on STREAM. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 backtrace_259 (Lisp_Object stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 return Fbacktrace (stream, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 /* An error was signaled. Maybe call the debugger, if the `debug-on-error'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 etc. variables call for this. CONDITIONS is the list of conditions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 associated with the error being signalled. SIG is the actual error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 being signalled, and DATA is the associated data (these are exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 the same as the arguments to `signal'). ACTIVE_HANDLERS is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 list of error handlers that are to be put in place while the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 is called. This is generally the remaining handlers that are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 outside of the innermost handler trapping this error. This way,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 if the same error occurs inside of the debugger, you usually don't get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 the debugger entered recursively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 This function returns Qunbound if it didn't call the debugger or if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 the user asked (through 'c') that XEmacs should pretend like the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 debugger was never entered. Otherwise, it returns the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 that the user specified with `r'. (Note that much of the time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 the user will abort with C-], and we will never have a chance to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 return anything at all.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 SIGNAL_VARS_ONLY means we should only look at debug-on-signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 and stack-trace-on-signal to control whether we do anything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 This is so that debug-on-error doesn't make handled errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 cause the debugger to get invoked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 STACK_TRACE_DISPLAYED and DEBUGGER_ENTERED are used so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 those functions aren't done more than once in a single `signal'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 session. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 signal_call_debugger (Lisp_Object conditions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 Lisp_Object sig, Lisp_Object data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 Lisp_Object active_handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 int signal_vars_only,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 int *stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 int *debugger_entered)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 Lisp_Object val = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 Lisp_Object all_handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 Lisp_Object temp_data = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 GCPRO2 (all_handlers, temp_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 Vcondition_handlers = active_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 temp_data = Fcons (sig, data); /* needed for skip_debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 if (!entering_debugger && !*stack_trace_displayed && !signal_vars_only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 && wants_debugger (Vstack_trace_on_error, conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 && !skip_debugger (conditions, temp_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 if (!noninteractive)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 internal_with_output_to_temp_buffer (build_string ("*Backtrace*"),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
567 backtrace_259,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 else /* in batch mode, we want this going to stderr. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571 backtrace_259 (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 *stack_trace_displayed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 if (!entering_debugger && !*debugger_entered && !signal_vars_only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 && (EQ (sig, Qquit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 ? debug_on_quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 : wants_debugger (Vdebug_on_error, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 && !skip_debugger (conditions, temp_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 debug_on_quit &= ~2; /* reset critical bit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 val = call_debugger (list2 (Qerror, (Fcons (sig, data))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 *debugger_entered = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 if (!entering_debugger && !*stack_trace_displayed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 && wants_debugger (Vstack_trace_on_signal, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 if (!noninteractive)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
601 internal_with_output_to_temp_buffer (build_string ("*Backtrace*"),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 backtrace_259,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
604 Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 else /* in batch mode, we want this going to stderr. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
606 backtrace_259 (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 *stack_trace_displayed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 if (!entering_debugger && !*debugger_entered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 && (EQ (sig, Qquit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 ? debug_on_quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 : wants_debugger (Vdebug_on_signal, conditions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 debug_on_quit &= ~2; /* reset critical bit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 val = call_debugger (list2 (Qerror, (Fcons (sig, data))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 *debugger_entered = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 Vcondition_handlers = all_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 return unbind_to (speccount, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 /* The basic special forms */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 /* Except for Fprogn(), the basic special forms below are only called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 from interpreted code. The byte compiler turns them into bytecodes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 DEFUN ("or", For, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 Eval args until one of them yields non-nil, then return that value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 The remaining args are not evalled at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 If all args return nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
647 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 LIST_LOOP_2 (arg, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 if (!NILP (val = Feval (arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 DEFUN ("and", Fand, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 Eval args until one of them yields nil, then return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 The remaining args are not evalled at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 If no arg yields nil, return the last arg's value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
666 REGISTER Lisp_Object val = Qt;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 LIST_LOOP_2 (arg, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 if (NILP (val = Feval (arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 DEFUN ("if", Fif, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 \(if COND THEN ELSE...): if COND yields non-nil, do THEN, else do ELSE...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 Returns the value of THEN or the value of the last of the ELSE's.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 THEN must be one expression, but ELSE... can be zero or more expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 If COND yields nil, and there are no ELSE's, the value is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 Lisp_Object condition = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 Lisp_Object then_form = XCAR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 Lisp_Object else_forms = XCDR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 if (!NILP (Feval (condition)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 return Feval (then_form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 return Fprogn (else_forms);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 /* Macros `when' and `unless' are trivially defined in Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 but it helps for bootstrapping to have them ALWAYS defined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 DEFUN ("when", Fwhen, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 \(when COND BODY...): if COND yields non-nil, do BODY, else return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 BODY can be zero or more expressions. If BODY is nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 Lisp_Object cond = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 Lisp_Object body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 switch (nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 case 1: body = Qnil; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 case 2: body = args[1]; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 default: body = Fcons (Qprogn, Flist (nargs-1, args+1)); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 return list3 (Qif, cond, body);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 DEFUN ("unless", Funless, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 \(unless COND BODY...): if COND yields nil, do BODY, else return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 BODY can be zero or more expressions. If BODY is nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 Lisp_Object cond = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 Lisp_Object body = Flist (nargs-1, args+1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 return Fcons (Qif, Fcons (cond, Fcons (Qnil, body)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 DEFUN ("cond", Fcond, 0, UNEVALLED, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
730 \(cond CLAUSES...): try each clause until one succeeds.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 Each clause looks like (CONDITION BODY...). CONDITION is evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 and, if the value is non-nil, this clause succeeds:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 then the expressions in BODY are evaluated and the last one's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 value is the value of the cond-form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 If no clause succeeds, cond returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 If a clause has one element, as in (CONDITION),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 CONDITION's value if non-nil is returned from the cond-form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
742 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 LIST_LOOP_2 (clause, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 CHECK_CONS (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 if (!NILP (val = Feval (XCAR (clause))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 if (!NILP (clause = XCDR (clause)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 CHECK_TRUE_LIST (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 val = Fprogn (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 DEFUN ("progn", Fprogn, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 \(progn BODY...): eval BODY forms sequentially and return value of last one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 /* Caller must provide a true list in ARGS */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 REGISTER Lisp_Object val = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 GCPRO1 (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 LIST_LOOP_2 (form, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 val = Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 /* Fprog1() is the canonical example of a function that must GCPRO a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 Lisp_Object across calls to Feval(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 DEFUN ("prog1", Fprog1, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 Similar to `progn', but the value of the first form is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 \(prog1 FIRST BODY...): All the arguments are evaluated sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 The value of FIRST is saved during evaluation of the remaining args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 whose values are discarded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
794 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 val = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 LIST_LOOP_2 (form, XCDR (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 DEFUN ("prog2", Fprog2, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 Similar to `progn', but the value of the second form is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 \(prog2 FIRST SECOND BODY...): All the arguments are evaluated sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 The value of SECOND is saved during evaluation of the remaining args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 whose values are discarded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
819 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 args = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 val = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 args = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
829 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
830 LIST_LOOP_2 (form, args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
831 Feval (form);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
832 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 DEFUN ("let*", FletX, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 \(let* VARLIST BODY...): bind variables according to VARLIST then eval BODY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 The value of the last form in BODY is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 Each element of VARLIST is a symbol (which is bound to nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 Each VALUEFORM can refer to the symbols already bound by this VARLIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 Lisp_Object varlist = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 EXTERNAL_LIST_LOOP_3 (var, varlist, tail)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 Lisp_Object symbol, value, tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 if (SYMBOLP (var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 symbol = var, value = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 CHECK_CONS (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 symbol = XCAR (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 tem = XCDR (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 value = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 CHECK_CONS (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 value = Feval (XCAR (tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 if (!NILP (XCDR (tem)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
869 sferror
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 ("`let' bindings can have only one value-form", var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 specbind (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 return unbind_to (speccount, Fprogn (body));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 DEFUN ("let", Flet, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 \(let VARLIST BODY...): bind variables according to VARLIST then eval BODY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 The value of the last form in BODY is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 Each element of VARLIST is a symbol (which is bound to nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 All the VALUEFORMs are evalled before any symbols are bound.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 Lisp_Object varlist = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 Lisp_Object *temps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 int idx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 /* Make space to hold the values to give the bound variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 int varcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 GET_EXTERNAL_LIST_LENGTH (varlist, varcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 temps = alloca_array (Lisp_Object, varcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 /* Compute the values and store them in `temps' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 GCPRO1 (*temps);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 idx = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
907 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
908 LIST_LOOP_2 (var, varlist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
909 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
910 Lisp_Object *value = &temps[idx++];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
911 if (SYMBOLP (var))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
912 *value = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
913 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
914 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
915 Lisp_Object tem;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
916 CHECK_CONS (var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
917 tem = XCDR (var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 if (NILP (tem))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 *value = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
920 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
921 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
922 CHECK_CONS (tem);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
923 *value = Feval (XCAR (tem));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
924 gcpro1.nvars = idx;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
925
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
926 if (!NILP (XCDR (tem)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
927 sferror
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928 ("`let' bindings can have only one value-form", var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
929 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
930 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
932 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 idx = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
935 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
936 LIST_LOOP_2 (var, varlist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
937 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
938 specbind (SYMBOLP (var) ? var : XCAR (var), temps[idx++]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
939 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
940 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 return unbind_to (speccount, Fprogn (body));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 DEFUN ("while", Fwhile, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 \(while TEST BODY...): if TEST yields non-nil, eval BODY... and repeat.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 The order of execution is thus TEST, BODY, TEST, BODY and so on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 until TEST returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 Lisp_Object test = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 while (!NILP (Feval (test)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 Fprogn (body);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 DEFUN ("setq", Fsetq, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 \(setq SYM VAL SYM VAL ...): set each SYM to the value of its VAL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 The symbols SYM are variables; they are literal (not evaluated).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 The values VAL are expressions; they are evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 Thus, (setq x (1+ y)) sets `x' to the value of `(1+ y)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 The second VAL is not computed until after the first SYM is set, and so on;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 each VAL can use the new value of variables set earlier in the `setq'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 The return value of the `setq' form is the value of the last VAL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 Lisp_Object symbol, tail, val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 int nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 GET_LIST_LENGTH (args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 if (nargs & 1) /* Odd number of arguments? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 Fsignal (Qwrong_number_of_arguments, list2 (Qsetq, make_int (nargs)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 PROPERTY_LIST_LOOP (tail, symbol, val, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 val = Feval (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 Fset (symbol, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 DEFUN ("quote", Fquote, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 Return the argument, without evaluating it. `(quote x)' yields `x'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 return XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 DEFUN ("function", Ffunction, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 Like `quote', but preferred for objects which are functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 In byte compilation, `function' causes its argument to be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 `quote' cannot do that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 return XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 /* Defining functions/variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 define_function (Lisp_Object name, Lisp_Object defn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 Ffset (name, defn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 LOADHIST_ATTACH (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 return name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 DEFUN ("defun", Fdefun, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 \(defun NAME ARGLIST [DOCSTRING] BODY...): define NAME as a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 The definition is (lambda ARGLIST [DOCSTRING] BODY...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 See also the function `interactive'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 return define_function (XCAR (args),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 Fcons (Qlambda, XCDR (args)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 DEFUN ("defmacro", Fdefmacro, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 \(defmacro NAME ARGLIST [DOCSTRING] BODY...): define NAME as a macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 The definition is (macro lambda ARGLIST [DOCSTRING] BODY...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 When the macro is called, as in (NAME ARGS...),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 the function (lambda ARGLIST BODY...) is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 the list ARGS... as it appears in the expression,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 and the result should be a form to be evaluated instead of the original.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 return define_function (XCAR (args),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 Fcons (Qmacro, Fcons (Qlambda, XCDR (args))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 DEFUN ("defvar", Fdefvar, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 \(defvar SYMBOL INITVALUE DOCSTRING): define SYMBOL as a variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 You are not required to define a variable in order to use it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 but the definition can supply documentation and an initial value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 in a way that tags can recognize.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 INITVALUE is evaluated, and used to set SYMBOL, only if SYMBOL's value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 void. (However, when you evaluate a defvar interactively, it acts like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 defconst: SYMBOL's value is always set regardless of whether it's currently
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 void.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 If SYMBOL is buffer-local, its default value is what is set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 buffer-local values are not affected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 INITVALUE and DOCSTRING are optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 If DOCSTRING starts with *, this variable is identified as a user option.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1071 This means that M-x set-variable recognizes it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 If INITVALUE is missing, SYMBOL's value is not set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 In lisp-interaction-mode defvar is treated as defconst.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 Lisp_Object sym = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 Lisp_Object val = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 if (NILP (Fdefault_boundp (sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 val = Feval (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 Fset_default (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 Lisp_Object doc = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 Fput (sym, Qvariable_documentation, doc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 if (!NILP (args = XCDR (args)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1099 signal_error (Qwrong_number_of_arguments, "too many arguments", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 #ifdef I18N3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 if (!NILP (Vfile_domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 Fput (sym, Qvariable_domain, Vfile_domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 LOADHIST_ATTACH (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 return sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 DEFUN ("defconst", Fdefconst, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 \(defconst SYMBOL INITVALUE DOCSTRING): define SYMBOL as a constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 The intent is that programs do not change this value, but users may.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 Always sets the value of SYMBOL to the result of evalling INITVALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 If SYMBOL is buffer-local, its default value is what is set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 buffer-local values are not affected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 DOCSTRING is optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 If DOCSTRING starts with *, this variable is identified as a user option.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1121 This means that M-x set-variable recognizes it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 Note: do not use `defconst' for user options in libraries that are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 normally loaded, since it is useful for users to be able to specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 their own values for such variables before loading the library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 Since `defconst' unconditionally assigns the variable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 it would override the user's choice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 Lisp_Object sym = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 Lisp_Object val = Feval (XCAR (args = XCDR (args)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 Fset_default (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 Lisp_Object doc = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 Fput (sym, Qvariable_documentation, doc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 if (!NILP (args = XCDR (args)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1147 signal_error (Qwrong_number_of_arguments, "too many arguments", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 #ifdef I18N3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 if (!NILP (Vfile_domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 Fput (sym, Qvariable_domain, Vfile_domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 LOADHIST_ATTACH (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 return sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 DEFUN ("user-variable-p", Fuser_variable_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 Return t if VARIABLE is intended to be set and modified by users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 \(The alternative is a variable used internally in a Lisp program.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 Determined by whether the first character of the documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 for the variable is `*'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 (variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 Lisp_Object documentation = Fget (variable, Qvariable_documentation, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 ((INTP (documentation) && XINT (documentation) < 0) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 (STRINGP (documentation) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 (string_byte (XSTRING (documentation), 0) == '*')) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 /* If (STRING . INTEGER), a negative integer means a user variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 (CONSP (documentation)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 && STRINGP (XCAR (documentation))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 && INTP (XCDR (documentation))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 && XINT (XCDR (documentation)) < 0)) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 DEFUN ("macroexpand-internal", Fmacroexpand_internal, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 Return result of expanding macros at top level of FORM.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 If FORM is not a macro call, it is returned unchanged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 Otherwise, the macro is expanded and the expansion is considered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 in place of FORM. When a non-macro-call results, it is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1189 The second optional arg ENVIRONMENT specifies an environment of macro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 definitions to shadow the loaded ones for use in file byte-compilation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1192 (form, environment))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 /* With cleanups from Hallvard Furuseth. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 REGISTER Lisp_Object expander, sym, def, tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 /* Come back here each time we expand a macro call,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 in case it expands into another macro call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 if (!CONSP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 /* Set SYM, give DEF and TEM right values in case SYM is not a symbol. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 def = sym = XCAR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 tem = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 /* Trace symbols aliases to other symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 until we get a symbol that is not an alias. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 while (SYMBOLP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 sym = def;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1213 tem = Fassq (sym, environment);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 def = XSYMBOL (sym)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 if (!UNBOUNDP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1222 /* Right now TEM is the result from SYM in ENVIRONMENT,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 and if TEM is nil then DEF is SYM's function definition. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1226 /* SYM is not mentioned in ENVIRONMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 Look at its function definition. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 if (UNBOUNDP (def)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 || !CONSP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 /* Not defined or definition not suitable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 if (EQ (XCAR (def), Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 /* Autoloading function: will it be a macro when loaded? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 tem = Felt (def, make_int (4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 if (EQ (tem, Qt) || EQ (tem, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 /* Yes, load it and try again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 do_autoload (def, sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 else if (!EQ (XCAR (def), Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 else expander = XCDR (def);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 expander = XCDR (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 if (NILP (expander))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 form = apply1 (expander, XCDR (form));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 return form;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 /* Non-local exits */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 DEFUN ("catch", Fcatch, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 \(catch TAG BODY...): eval BODY allowing nonlocal exits using `throw'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 TAG is evalled to get the tag to use. Then the BODY is executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 Within BODY, (throw TAG) with same tag exits BODY and exits this `catch'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 If no throw happens, `catch' returns the value of the last BODY form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 If a throw happens, it specifies the value to return from `catch'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 Lisp_Object tag = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 return internal_catch (tag, Fprogn, body, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 /* Set up a catch, then call C function FUNC on argument ARG.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 FUNC should return a Lisp_Object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 This is how catches are done from within C code. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 internal_catch (Lisp_Object tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 Lisp_Object (*func) (Lisp_Object arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 Lisp_Object arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 int * volatile threw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 /* This structure is made part of the chain `catchlist'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 struct catchtag c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 /* Fill in the components of c, and put it on the list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 c.next = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 c.tag = tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 c.val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 c.backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 c.handlerlist = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 c.lisp_eval_depth = lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 c.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 c.poll_suppress_count = async_timer_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 c.gcpro = gcprolist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 catchlist = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 /* Call FUNC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 if (SETJMP (c.jmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 /* Throw works by a longjmp that comes right here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 if (threw) *threw = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 return c.val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 c.val = (*func) (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 if (threw) *threw = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 catchlist = c.next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1320 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1321 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1322 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 return c.val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 /* Unwind the specbind, catch, and handler stacks back to CATCH, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 jump to that CATCH, returning VALUE as the value of that catch.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 This is the guts Fthrow and Fsignal; they differ only in the way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 they choose the catch tag to throw to. A catch tag for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 condition-case form has a TAG of Qnil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 Before each catch is discarded, unbind all special bindings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 execute all unwind-protect clauses made above that catch. Unwind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 the handler stack as we go, so that the proper handlers are in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 effect for each unwind-protect clause we run. At the end, restore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 some static info saved in CATCH, and longjmp to the location
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 specified in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 This is used for correct unwinding in Fthrow and Fsignal. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 unwind_to_catch (struct catchtag *c, Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 REGISTER int last_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 /* Unwind the specbind, catch, and handler stacks back to CATCH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 Before each catch is discarded, unbind all special bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 and execute all unwind-protect clauses made above that catch.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 At the end, restore some static info saved in CATCH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 and longjmp to the location specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 /* Save the value somewhere it will be GC'ed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 (Can't overwrite tag slot because an unwind-protect may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 want to throw to this same tag, which isn't yet invalid.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 c->val = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 /* Restore the polling-suppression count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 set_poll_suppress_count (catch->poll_suppress_count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 /* #### FSFmacs has the following loop. Is it more correct? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 last_time = catchlist == c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 /* Unwind the specpdl stack, and then restore the proper set of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 handlers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 unbind_to (catchlist->pdlcount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 handlerlist = catchlist->handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 catchlist = catchlist->next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1379 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1380 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1381 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 while (! last_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 #else /* Actual XEmacs code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 /* Unwind the specpdl stack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 unbind_to (c->pdlcount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 catchlist = c->next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1388 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1389 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1390 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 gcprolist = c->gcpro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 backtrace_list = c->backlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 lisp_eval_depth = c->lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1397 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 throw_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 LONGJMP (c->jmp, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 static DOESNT_RETURN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 throw_or_bomb_out (Lisp_Object tag, Lisp_Object val, int bomb_out_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 Lisp_Object sig, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1407 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 /* die if we recurse more than is reasonable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 if (++throw_level > 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 abort();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 /* If bomb_out_p is t, this is being called from Fsignal as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 "last resort" when there is no handler for this error and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 the debugger couldn't be invoked, so we are throwing to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 'top-level. If this tag doesn't exist (happens during the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 initialization stages) we would get in an infinite recursive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 Fsignal/Fthrow loop, so instead we bomb out to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 really-early-error-handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 Note that in fact the only time that the "last resort"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 occurs is when there's no catch for 'top-level -- the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 'top-level catch and the catch-all error handler are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 established at the same time, in initial_command_loop/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 top_level_1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 #### Fix this horrifitude!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 REGISTER struct catchtag *c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 if (!NILP (tag)) /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 for (c = catchlist; c; c = c->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 if (EQ (c->tag, tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 unwind_to_catch (c, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 if (!bomb_out_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 tag = Fsignal (Qno_catch, list2 (tag, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 call1 (Qreally_early_error_handler, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 /* can't happen. who cares? - (Sun's compiler does) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 /* throw_level--; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 /* getting tired of compilation warnings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 /* return Qnil; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 /* See above, where CATCHLIST is defined, for a description of how
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 Fthrow() works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 Fthrow() is also called by Fsignal(), to do a non-local jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 back to the appropriate condition-case handler after (maybe)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 the debugger is entered. In that case, TAG is the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 of Vcondition_handlers that was in place just after the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 condition-case handler was set up. The car of this will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 some data referring to the handler: Its car will be Qunbound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 (thus, this tag can never be generated by Lisp code), and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 its CDR will be the HANDLERS argument to condition_case_1()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 (either Qerror, Qt, or a list of handlers as in `condition-case').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 This works fine because Fthrow() does not care what TAG was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 passed to it: it just looks up the catch list for something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 that is EQ() to TAG. When it finds it, it will longjmp()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 back to the place that established the catch (in this case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 condition_case_1). See below for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 DEFUN ("throw", Fthrow, 2, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1474 Throw to the catch for TAG and return VALUE from it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 Both TAG and VALUE are evalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1477 (tag, value))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1478 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1479 throw_or_bomb_out (tag, value, 0, Qnil, Qnil); /* Doesn't return */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 DEFUN ("unwind-protect", Funwind_protect, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 Do BODYFORM, protecting with UNWINDFORMS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 Usage looks like (unwind-protect BODYFORM UNWINDFORMS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 If BODYFORM completes normally, its value is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 after executing the UNWINDFORMS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 record_unwind_protect (Fprogn, XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 return unbind_to (speccount, Feval (XCAR (args)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 /* Signalling and trapping errors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 condition_bind_unwind (Lisp_Object loser)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1507 Lisp_Cons *victim;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 /* ((handler-fun . handler-args) ... other handlers) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 Lisp_Object tem = XCAR (loser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 while (CONSP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 victim = XCONS (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 tem = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 victim = XCONS (loser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 if (EQ (loser, Vcondition_handlers)) /* may have been rebound to some tail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 Vcondition_handlers = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 condition_case_unwind (Lisp_Object loser)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1529 Lisp_Cons *victim;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 /* ((<unbound> . clauses) ... other handlers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 victim = XCONS (XCAR (loser));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 victim = XCONS (loser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 if (EQ (loser, Vcondition_handlers)) /* may have been rebound to some tail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 Vcondition_handlers = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 /* Split out from condition_case_3 so that primitive C callers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 don't have to cons up a lisp handler form to be evaluated. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 /* Call a function BFUN of one argument BARG, trapping errors as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 specified by HANDLERS. If no error occurs that is indicated by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 HANDLERS as something to be caught, the return value of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 function is the return value from BFUN. If such an error does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 occur, HFUN is called, and its return value becomes the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 return value of condition_case_1(). The second argument passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 to HFUN will always be HARG. The first argument depends on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 HANDLERS:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 If HANDLERS is Qt, all errors (this includes QUIT, but not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 non-local exits with `throw') cause HFUN to be invoked, and VAL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 (the first argument to HFUN) is a cons (SIG . DATA) of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 arguments passed to `signal'. The debugger is not invoked even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 A HANDLERS value of Qerror is the same as Qt except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 debugger is invoked if `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 Otherwise, HANDLERS should be a list of lists (CONDITION-NAME BODY ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 exactly as in `condition-case', and errors will be trapped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 as indicated in HANDLERS. VAL (the first argument to HFUN) will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 be a cons whose car is the cons (SIG . DATA) and whose CDR is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 list (BODY ...) from the appropriate slot in HANDLERS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 This function pushes HANDLERS onto the front of Vcondition_handlers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 (actually with a Qunbound marker as well -- see Fthrow() above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 for why), establishes a catch whose tag is this new value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 Vcondition_handlers, and calls BFUN. When Fsignal() is called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 it calls Fthrow(), setting TAG to this same new value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 Vcondition_handlers and setting VAL to the same thing that will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 be passed to HFUN, as above. Fthrow() longjmp()s back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 jump point we just established, and we in turn just call the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 HFUN and return its value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 For a real condition-case, HFUN will always be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 run_condition_case_handlers() and HARG is the argument VAR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 to condition-case. That function just binds VAR to the cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 (SIG . DATA) that is the CAR of VAL, and calls the handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 (BODY ...) that is the CDR of VAL. Note that before calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 Fthrow(), Fsignal() restored Vcondition_handlers to the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 it had *before* condition_case_1() was called. This maintains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 consistency (so that the state of things at exit of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 condition_case_1() is the same as at entry), and implies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 that the handler can signal the same error again (possibly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 after processing of its own), without getting in an infinite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 condition_case_1 (Lisp_Object handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 Lisp_Object (*bfun) (Lisp_Object barg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 Lisp_Object barg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 Lisp_Object (*hfun) (Lisp_Object val, Lisp_Object harg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 Lisp_Object harg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 struct catchtag c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 c.tag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 /* Do consing now so out-of-memory error happens up front */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 /* (unbound . stuff) is a special condition-case kludge marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 which is known specially by Fsignal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 This is an abomination, but to fix it would require either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 making condition_case cons (a union of the conditions of the clauses)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 or changing the byte-compiler output (no thanks). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 c.tag = noseeum_cons (noseeum_cons (Qunbound, handlers),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 c.val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 c.backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 c.handlerlist = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 c.lisp_eval_depth = lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 c.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 c.poll_suppress_count = async_timer_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 c.gcpro = gcprolist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 /* #### FSFmacs does the following statement *after* the setjmp(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 c.next = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 if (SETJMP (c.jmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 /* throw does ungcpro, etc */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 return (*hfun) (c.val, harg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 record_unwind_protect (condition_case_unwind, c.tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 catchlist = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 h.handler = handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 h.var = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 h.next = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 h.tag = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 handlerlist = &h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 Vcondition_handlers = c.tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 GCPRO1 (harg); /* Somebody has to gc-protect */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 c.val = ((*bfun) (barg));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 /* The following is *not* true: (ben)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 ungcpro, restoring catchlist and condition_handlers are actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 redundant since unbind_to now restores them. But it looks funny not to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 have this code here, and it doesn't cost anything, so I'm leaving it.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 catchlist = c.next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1660 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1661 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1662 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 Vcondition_handlers = XCDR (c.tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 return unbind_to (speccount, c.val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 run_condition_case_handlers (Lisp_Object val, Lisp_Object var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 if (!NILP (h.var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 specbind (h.var, c.val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 val = Fprogn (Fcdr (h.chosen_clause));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 /* Note that this just undoes the binding of h.var; whoever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 longjmp()ed to us unwound the stack to c.pdlcount before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 throwing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 unbind_to (c.pdlcount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 CHECK_TRUE_LIST (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 if (NILP (var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 return Fprogn (Fcdr (val)); /* tail call */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 specbind (var, Fcar (val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 val = Fprogn (Fcdr (val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 return unbind_to (speccount, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 /* Here for bytecode to call non-consfully. This is exactly like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 condition-case except that it takes three arguments rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 than a single list of arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 condition_case_3 (Lisp_Object bodyform, Lisp_Object var, Lisp_Object handlers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 EXTERNAL_LIST_LOOP_2 (handler, handlers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 if (NILP (handler))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 else if (CONSP (handler))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 Lisp_Object conditions = XCAR (handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 /* CONDITIONS must a condition name or a list of condition names */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 if (SYMBOLP (conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 EXTERNAL_LIST_LOOP_2 (condition, conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 if (!SYMBOLP (condition))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 goto invalid_condition_handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 invalid_condition_handler:
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1723 sferror ("Invalid condition handler", handler);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 CHECK_SYMBOL (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 return condition_case_1 (handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 Feval, bodyform,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 run_condition_case_handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 DEFUN ("condition-case", Fcondition_case, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 Regain control when an error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 Usage looks like (condition-case VAR BODYFORM HANDLERS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 Executes BODYFORM and returns its value if no error happens.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 Each element of HANDLERS looks like (CONDITION-NAME BODY...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 where the BODY is made of Lisp expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 A handler is applicable to an error if CONDITION-NAME is one of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 error's condition names. If an error happens, the first applicable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 handler is run. As a special case, a CONDITION-NAME of t matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 all errors, even those without the `error' condition name on them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 \(e.g. `quit').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 The car of a handler may be a list of condition names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 instead of a single condition name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 When a handler handles an error,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 control returns to the condition-case and the handler BODY... is executed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 VAR may be nil; then you do not get access to the signal information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 The value of the last BODY form is returned from the condition-case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 See also the function `signal' for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 Note that at the time the condition handler is invoked, the Lisp stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 and the current catches, condition-cases, and bindings have all been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 popped back to the state they were in just before the call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 `condition-case'. This means that resignalling the error from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 within the handler will not result in an infinite loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 If you want to establish an error handler that is called with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 Lisp stack, bindings, etc. as they were when `signal' was called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 rather than when the handler was set, use `call-with-condition-handler'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 Lisp_Object var = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 Lisp_Object bodyform = XCAR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 Lisp_Object handlers = XCDR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 return condition_case_3 (bodyform, var, handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 DEFUN ("call-with-condition-handler", Fcall_with_condition_handler, 2, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 Regain control when an error is signalled, without popping the stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 Usage looks like (call-with-condition-handler HANDLER FUNCTION &rest ARGS).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 This function is similar to `condition-case', but the handler is invoked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 with the same environment (Lisp stack, bindings, catches, condition-cases)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 that was current when `signal' was called, rather than when the handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 was established.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 HANDLER should be a function of one argument, which is a cons of the args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 \(SIG . DATA) that were passed to `signal'. It is invoked whenever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 `signal' is called (this differs from `condition-case', which allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 you to specify which errors are trapped). If the handler function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 returns, `signal' continues as if the handler were never invoked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 \(It continues to look for handlers established earlier than this one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 and invokes the standard error-handler if none is found.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 (int nargs, Lisp_Object *args)) /* Note! Args side-effected! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 /* #### If there were a way to check that args[0] were a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 which accepted one arg, that should be done here ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 /* (handler-fun . handler-args) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 tem = noseeum_cons (list1 (args[0]), Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 record_unwind_protect (condition_bind_unwind, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 Vcondition_handlers = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 /* Caller should have GC-protected args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 return unbind_to (speccount, Ffuncall (nargs - 1, args + 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 condition_type_p (Lisp_Object type, Lisp_Object conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 if (EQ (type, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 /* (condition-case c # (t c)) catches -all- signals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 * Use with caution! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 if (SYMBOLP (type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 return !NILP (Fmemq (type, conditions));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 for (; CONSP (type); type = XCDR (type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 if (!NILP (Fmemq (XCAR (type), conditions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 return_from_signal (Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 /* Most callers are not prepared to handle gc if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 returns. So, since this feature is not very useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 take it out. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 /* Have called debugger; return value to signaller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 return value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 #else /* But the reality is that that stinks, because: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 /* GACK!!! Really want some way for debug-on-quit errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 to be continuable!! */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1842 signal_error (Qunimplemented,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1843 "Returning a value from an error is no longer supported",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1844 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 extern int in_display;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 /* the workhorse error-signaling function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 /* #### This function has not been synched with FSF. It diverges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 significantly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 signal_1 (Lisp_Object sig, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 Lisp_Object conditions;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 Lisp_Object handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 /* signal_call_debugger() could get called more than once
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 (once when a call-with-condition-handler is about to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 be dealt with, and another when a condition-case handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 is about to be invoked). So make sure the debugger and/or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 stack trace aren't done more than once. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 int stack_trace_displayed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 int debugger_entered = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 GCPRO2 (conditions, handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 if (!initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 /* who knows how much has been initialized? Safest bet is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 just to bomb out immediately. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1878 /* let's not use stderr_out() here, because that does a bunch of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1879 things that might not be safe yet. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 fprintf (stderr, "Error before initialization is complete!\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 if (gc_in_progress || in_display)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 /* This is one of many reasons why you can't run lisp code from redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 There is no sensible way to handle errors there. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 conditions = Fget (sig, Qerror_conditions, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 for (handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 CONSP (handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 handlers = XCDR (handlers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 Lisp_Object handler_fun = XCAR (XCAR (handlers));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 Lisp_Object handler_data = XCDR (XCAR (handlers));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 Lisp_Object outer_handlers = XCDR (handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 if (!UNBOUNDP (handler_fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 /* call-with-condition-handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 Lisp_Object all_handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 struct gcpro ngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 NGCPRO1 (all_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 Vcondition_handlers = outer_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 outer_handlers, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 RETURN_NUNGCPRO (return_from_signal (tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 tem = Fcons (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 if (NILP (handler_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 tem = call1 (handler_fun, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 /* (This code won't be used (for now?).) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 struct gcpro nngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 NNGCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 nngcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 args[0] = handler_fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 args[1] = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 args[2] = handler_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 nngcpro1.var = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 tem = Fapply (3, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 NNUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 if (!EQ (tem, Qsignal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 /* If handler didn't throw, try another handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 Vcondition_handlers = all_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 /* It's a condition-case handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 /* t is used by handlers for all conditions, set up by C code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 * debugger is not called even if debug_on_error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 else if (EQ (handler_data, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 return Fthrow (handlers, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 /* `error' is used similarly to the way `t' is used, but in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 addition it invokes the debugger if debug_on_error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 This is normally used for the outer command-loop error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 else if (EQ (handler_data, Qerror))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 Lisp_Object tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 outer_handlers, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 tem = Fcons (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 return Fthrow (handlers, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 /* handler established by real (Lisp) condition-case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 Lisp_Object h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 for (h = handler_data; CONSP (h); h = Fcdr (h))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 Lisp_Object clause = Fcar (h);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 Lisp_Object tem = Fcar (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 if (condition_type_p (tem, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 outer_handlers, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 /* Doesn't return */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 tem = Fcons (Fcons (sig, data), Fcdr (clause));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 return Fthrow (handlers, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 /* If no handler is present now, try to run the debugger,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 and if that fails, throw to top level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 #### The only time that no handler is present is during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 temacs or perhaps very early in XEmacs. In both cases,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 there is no 'top-level catch. (That's why the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 "bomb-out" hack was added.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 #### Fix this horrifitude!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 signal_call_debugger (conditions, sig, data, Qnil, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 throw_or_bomb_out (Qtop_level, Qt, 1, sig, data); /* Doesn't return */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 /****************** Error functions class 1 ******************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 /* Class 1: General functions that signal an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 These functions take an error type and a list of associated error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 /* The simplest external error function: it would be called
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2022 signal_continuable_error_1() in the terminology below, but it's
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 Lisp-callable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 DEFUN ("signal", Fsignal, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 Signal a continuable error. Args are ERROR-SYMBOL, and associated DATA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 An error symbol is a symbol defined using `define-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 DATA should be a list. Its elements are printed as part of the error message.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 If the signal is handled, DATA is made available to the handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 See also the function `signal-error', and the functions to handle errors:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 `condition-case' and `call-with-condition-handler'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 Note that this function can return, if the debugger is invoked and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 user invokes the "return from signal" option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 (error_symbol, data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 /* Fsignal() is one of these functions that's called all the time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 with newly-created Lisp objects. We allow this; but we must GC-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 protect the objects because all sorts of weird stuff could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 happen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 GCPRO1 (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 if (!NILP (Vcurrent_error_state))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 if (!NILP (Vcurrent_warning_class))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 warn_when_safe_lispobj (Vcurrent_warning_class, Qwarning,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 Fcons (error_symbol, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 Fthrow (Qunbound_suspended_errors_tag, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 abort (); /* Better not get here! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 RETURN_UNGCPRO (signal_1 (error_symbol, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 /* Signal a non-continuable error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 DOESNT_RETURN
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2060 signal_error_1 (Lisp_Object sig, Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2065 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2066 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2067 check_error_state_sanity (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2068 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2069 struct catchtag *c;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2070 int found_error_tag = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2071
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2072 for (c = catchlist; c; c = c->next)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2073 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2074 if (EQ (c->tag, Qunbound_suspended_errors_tag))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2075 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2076 found_error_tag = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2077 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2078 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2079 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2080
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2081 assert (found_error_tag || NILP (Vcurrent_error_state));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2082 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2083 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 restore_current_warning_class (Lisp_Object warning_class)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 Vcurrent_warning_class = warning_class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 restore_current_error_state (Lisp_Object error_state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 Vcurrent_error_state = error_state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2099 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2100 call_with_suspended_errors_1 (Lisp_Object opaque_arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2101 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2102 Lisp_Object val;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2103 Lisp_Object *kludgy_args = (Lisp_Object *) get_opaque_ptr (opaque_arg);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2104 Lisp_Object no_error = kludgy_args[2];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2105 int speccount = specpdl_depth ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2106
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2107 if (!EQ (Vcurrent_error_state, no_error))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2108 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2109 record_unwind_protect (restore_current_error_state,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2110 Vcurrent_error_state);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2111 Vcurrent_error_state = no_error;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2112 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2113 PRIMITIVE_FUNCALL (val, get_opaque_ptr (kludgy_args[0]),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2114 kludgy_args + 3, XINT (kludgy_args[1]));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2115 return unbind_to (speccount, val);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2116 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2117
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 /* Many functions would like to do one of three things if an error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 occurs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 (1) signal the error, as usual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 (2) silently fail and return some error value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 (3) do as (2) but issue a warning in the process.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2125 Currently there's lots of stuff that passes an Error_Behavior
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 value and calls maybe_signal_error() and other such functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 This approach is inherently error-prone and broken. A much
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 more robust and easier approach is to use call_with_suspended_errors().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 Wrap this around any function in which you might want errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 to not be errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 call_with_suspended_errors (lisp_fn_t fun, volatile Lisp_Object retval,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2135 Lisp_Object class, Error_Behavior errb,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 int speccount;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2140 Lisp_Object kludgy_args[23];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2141 Lisp_Object *args = kludgy_args + 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 Lisp_Object no_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 assert (SYMBOLP (class)); /* sanity-check */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 assert (!NILP (class));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 assert (nargs >= 0 && nargs < 20);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 /* ERROR_ME means don't trap errors. (However, if errors are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 already trapped, we leave them trapped.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 Otherwise, we trap errors, and trap warnings if ERROR_ME_WARN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 If ERROR_ME_NOT, it causes no warnings even if warnings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 were previously enabled. However, we never change the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 warning class from one to another. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 if (!ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 if (ERRB_EQ (errb, ERROR_ME_NOT)) /* person wants no warnings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 class = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 errb = ERROR_ME_NOT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 no_error = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 no_error = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 args[i] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 /* If error-checking is not disabled, just call the function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 It's important not to override disabled error-checking with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 enabled error-checking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 PRIMITIVE_FUNCALL (val, fun, args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2183 speccount = specpdl_depth ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 if (NILP (class) || NILP (Vcurrent_warning_class))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 /* If we're currently calling for no warnings, then make it so.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 If we're currently calling for warnings and we weren't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 previously, then set our warning class; otherwise, leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 the existing one alone. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 record_unwind_protect (restore_current_warning_class,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 Vcurrent_warning_class);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 Vcurrent_warning_class = class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 int threw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 Lisp_Object the_retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 Lisp_Object opaque1 = make_opaque_ptr (kludgy_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 Lisp_Object opaque2 = make_opaque_ptr ((void *) fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 GCPRO2 (opaque1, opaque2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 kludgy_args[0] = opaque2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 kludgy_args[1] = make_int (nargs);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2205 kludgy_args[2] = no_error;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 the_retval = internal_catch (Qunbound_suspended_errors_tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 call_with_suspended_errors_1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 opaque1, &threw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 free_opaque_ptr (opaque1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 free_opaque_ptr (opaque2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 /* Use the returned value except in non-local exit, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 RETVAL applies. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 /* Some perverse compilers require the perverse cast below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 return unbind_to (speccount,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 threw ? *((Lisp_Object*) &(retval)) : the_retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 /* Signal a non-continuable error or display a warning or do nothing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 according to ERRB. CLASS is the class of warning and should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 refer to what sort of operation is being done (e.g. Qtoolbar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 Qresource, etc.). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 void
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2226 maybe_signal_error_1 (Lisp_Object sig, Lisp_Object data, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2227 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 else if (ERRB_EQ (errb, ERROR_ME_WARN))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 warn_when_safe_lispobj (class, Qwarning, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 /* Signal a continuable error or display a warning or do nothing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 according to ERRB. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2242 maybe_signal_continuable_error_1 (Lisp_Object sig, Lisp_Object data,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2243 Lisp_Object class, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 else if (ERRB_EQ (errb, ERROR_ME_WARN))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 warn_when_safe_lispobj (class, Qwarning, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 return Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 /****************** Error functions class 2 ******************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2259 /* Class 2: Signal an error with a string and an associated object.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2260 Normally these functions are used to attach one associated object,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2261 but to attach no objects, specify Qunbound for FROB, and for more
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2262 than one object, make a list of the objects with Qunbound as the
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2263 first element. (If you have specifically two objects to attach,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2264 consider using the function in class 3 below.) These functions
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2265 signal an error of a specified type, whose data is one or more
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2266 objects (usually two), a string the related Lisp object(s)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2267 specified as FROB. */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2268
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2269 /* Out of REASON and FROB, return a list of elements suitable for passing
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2270 to signal_error_1(). */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2271
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2272 Lisp_Object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2273 build_error_data (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2274 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2275 if (EQ (frob, Qunbound))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2276 frob = Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2277 else if (CONSP (frob) && EQ (XCAR (frob), Qunbound))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2278 frob = XCDR (frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2279 else
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2280 frob = list1 (frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2281 if (!reason)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2282 return frob;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2283 else
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2284 return Fcons (build_translated_string (reason), frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2285 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2286
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2287 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2288 signal_error (Lisp_Object type, const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2289 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2290 signal_error_1 (type, build_error_data (reason, frob));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2291 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2292
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2293 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2294 maybe_signal_error (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2295 Lisp_Object frob, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2296 Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2297 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2298 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2299 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2300 return;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2301 maybe_signal_error_1 (type, build_error_data (reason, frob), class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2302 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2303
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2304 Lisp_Object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2305 signal_continuable_error (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2306 Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2307 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2308 return Fsignal (type, build_error_data (reason, frob));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2309 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2310
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2311 Lisp_Object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2312 maybe_signal_continuable_error (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2313 Lisp_Object frob, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2314 Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2315 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2316 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2317 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2318 return Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2319 return maybe_signal_continuable_error_1 (type,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2320 build_error_data (reason, frob),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2321 class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2322 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2323
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2324
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2325 /****************** Error functions class 3 ******************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2326
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2327 /* Class 3: Signal an error with a string and two associated objects.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2328 These functions signal an error of a specified type, whose data
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2329 is three objects, a string and two related Lisp objects.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2330 (The equivalent could be accomplished using the class 2 functions,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2331 but these are more convenient in this particular case.) */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2332
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2333 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2334 signal_error_2 (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2335 Lisp_Object frob0, Lisp_Object frob1)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2336 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2337 signal_error_1 (type, list3 (build_translated_string (reason), frob0,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2338 frob1));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2339 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2340
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2341 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2342 maybe_signal_error_2 (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2343 Lisp_Object frob0, Lisp_Object frob1,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2344 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2345 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2346 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2347 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2348 return;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2349 maybe_signal_error_1 (type, list3 (build_translated_string (reason), frob0,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2350 frob1), class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2351 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2352
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2353 Lisp_Object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2354 signal_continuable_error_2 (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2355 Lisp_Object frob0, Lisp_Object frob1)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2356 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2357 return Fsignal (type, list3 (build_translated_string (reason), frob0,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2358 frob1));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2359 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2360
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2361 Lisp_Object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2362 maybe_signal_continuable_error_2 (Lisp_Object type, const char *reason,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2363 Lisp_Object frob0, Lisp_Object frob1,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2364 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2365 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2366 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2367 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2368 return Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2369 return maybe_signal_continuable_error_1
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2370 (type, list3 (build_translated_string (reason), frob0, frob1),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2371 class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2372 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2373
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2374
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2375 /****************** Error functions class 4 ******************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2376
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2377 /* Class 4: Printf-like functions that signal an error.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2378 These functions signal an error of a specified type, whose data
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 is a single string, created using the arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 DOESNT_RETURN
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2382 signal_ferror (Lisp_Object type, const char *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2383 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2384 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2385 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2386
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2387 va_start (args, fmt);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2388 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2389 args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2390 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2391
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2392 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2393 signal_error (type, 0, obj);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2394 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2395
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2396 void
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2397 maybe_signal_ferror (Lisp_Object type, Lisp_Object class, Error_Behavior errb,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2398 const char *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2399 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2400 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2401 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2402
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2403 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2404 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2405 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2406
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2407 va_start (args, fmt);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2408 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2409 args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2410 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2411
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2412 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2413 maybe_signal_error (type, 0, obj, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2414 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2415
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2416 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2417 signal_continuable_ferror (Lisp_Object type, const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 va_start (args, fmt);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2423 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2424 args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2425 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2426
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2427 /* Fsignal GC-protects its args */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2428 return Fsignal (type, list1 (obj));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2429 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2430
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2431 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2432 maybe_signal_continuable_ferror (Lisp_Object type, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2433 Error_Behavior errb, const char *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2434 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2435 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2436 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2437
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2438 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2439 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2440 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2441
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2442 va_start (args, fmt);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2443 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2444 args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2445 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2446
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2447 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2448 return maybe_signal_continuable_error (type, 0, obj, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2449 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2450
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2451
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2452 /****************** Error functions class 5 ******************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2453
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2454 /* Class 5: Printf-like functions that signal an error.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2455 These functions signal an error of a specified type, whose data
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2456 is a one or more objects, a string (created using the arguments)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2457 and additional Lisp objects specified in FROB. (The syntax of FROB
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2458 is the same as for class 2.)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2459
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2460 There is no need for a class 6 because you can always attach 2
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2461 objects using class 5 (for FROB, specify a list with three
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2462 elements, the first of which is Qunbound), and these functions are
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2463 not commonly used.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2464 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2465
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2466 DOESNT_RETURN
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2467 signal_ferror_with_frob (Lisp_Object type, Lisp_Object frob, const char *fmt,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2468 ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2469 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2470 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2471 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2472
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2473 va_start (args, fmt);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2474 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2475 args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2476 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2477
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2478 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2479 signal_error_1 (type, Fcons (obj, build_error_data (0, frob)));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2480 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2481
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2482 void
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2483 maybe_signal_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2484 Lisp_Object class, Error_Behavior errb,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2485 const char *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2486 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2487 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2488 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2489
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2490 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2491 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2492 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2493
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2494 va_start (args, fmt);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2495 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2500 maybe_signal_error_1 (type, Fcons (obj, build_error_data (0, frob)), class,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2501 errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2505 signal_continuable_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2506 const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 va_start (args, fmt);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2512 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2517 return Fsignal (type, Fcons (obj, build_error_data (0, frob)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2521 maybe_signal_continuable_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2522 Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2523 Error_Behavior errb,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2524 const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 /* Optimization: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 va_start (args, fmt);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2534 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2539 return maybe_signal_continuable_error_1 (type,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2540 Fcons (obj,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2541 build_error_data (0, frob)),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2542 class, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 /* This is what the QUIT macro calls to signal a quit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 signal_quit (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 if (EQ (Vquit_flag, Qcritical))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 debug_on_quit |= 2; /* set critical bit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 /* note that this is continuable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 Fsignal (Qquit, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2559 /************************ convenience error functions ***********************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2560
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2561 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 signal_void_function_error (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2564 return Fsignal (Qvoid_function, list1 (function));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2567 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 signal_invalid_function_error (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2570 return Fsignal (Qinvalid_function, list1 (function));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2573 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 signal_wrong_number_of_arguments_error (Lisp_Object function, int nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2576 return Fsignal (Qwrong_number_of_arguments,
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2577 list2 (function, make_int (nargs)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 /* Used in list traversal macros for efficiency. */
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2581 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 signal_malformed_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2584 signal_error (Qmalformed_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2587 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 signal_malformed_property_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2590 signal_error (Qmalformed_property_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2593 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 signal_circular_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2596 signal_error (Qcircular_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2599 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 signal_circular_property_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2602 signal_error (Qcircular_property_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2604
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2605 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2606 syntax_error (const char *reason, Lisp_Object frob)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2607 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2608 signal_error (Qsyntax_error, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2609 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2610
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2611 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2612 syntax_error_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2613 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2614 signal_error_2 (Qsyntax_error, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2615 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2616
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2617 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2618 maybe_syntax_error (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2619 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2620 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2621 maybe_signal_error (Qsyntax_error, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2622 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2623
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2624 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2625 sferror (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2626 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2627 signal_error (Qstructure_formation_error, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2628 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2629
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2630 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2631 sferror_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2632 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2633 signal_error_2 (Qstructure_formation_error, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2634 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2635
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2636 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2637 maybe_sferror (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2638 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2639 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2640 maybe_signal_error (Qstructure_formation_error, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2641 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2642
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2643 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2644 invalid_argument (const char *reason, Lisp_Object frob)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2645 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2646 signal_error (Qinvalid_argument, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2647 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2648
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2649 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2650 invalid_argument_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2651 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2652 signal_error_2 (Qinvalid_argument, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2653 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2654
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2655 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2656 maybe_invalid_argument (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2657 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2658 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2659 maybe_signal_error (Qinvalid_argument, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2660 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2661
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2662 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2663 invalid_constant (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2664 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2665 signal_error (Qinvalid_constant, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2666 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2667
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2668 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2669 invalid_constant_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2670 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2671 signal_error_2 (Qinvalid_constant, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2672 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2673
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2674 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2675 maybe_invalid_constant (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2676 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2677 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2678 maybe_signal_error (Qinvalid_constant, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2679 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2680
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2681 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2682 invalid_operation (const char *reason, Lisp_Object frob)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2683 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2684 signal_error (Qinvalid_operation, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2685 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2686
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2687 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2688 invalid_operation_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2689 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2690 signal_error_2 (Qinvalid_operation, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2691 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2692
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2693 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2694 maybe_invalid_operation (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2695 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2696 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2697 maybe_signal_error (Qinvalid_operation, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2698 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2699
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2700 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2701 invalid_change (const char *reason, Lisp_Object frob)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2702 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2703 signal_error (Qinvalid_change, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2704 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2705
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2706 DOESNT_RETURN
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2707 invalid_change_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2708 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2709 signal_error_2 (Qinvalid_change, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2710 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2711
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2712 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2713 maybe_invalid_change (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2714 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2715 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2716 maybe_signal_error (Qinvalid_change, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2717 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2718
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2719 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2720 invalid_state (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2721 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2722 signal_error (Qinvalid_state, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2723 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2724
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2725 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2726 invalid_state_2 (const char *reason, Lisp_Object frob1, Lisp_Object frob2)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2727 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2728 signal_error_2 (Qinvalid_state, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2729 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2730
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2731 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2732 maybe_invalid_state (const char *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2733 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2734 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2735 maybe_signal_error (Qinvalid_state, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2736 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2737
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2738 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2739 wtaerror (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2740 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2741 signal_error (Qwrong_type_argument, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2742 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2743
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2744 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2745 stack_overflow (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2746 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2747 signal_error (Qstack_overflow, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2748 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2749
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2750 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2751 out_of_memory (const char *reason, Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2752 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2753 signal_error (Qout_of_memory, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2754 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2755
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2756 DOESNT_RETURN
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2757 printing_unreadable_object (const char *fmt, ...)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2758 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2759 Lisp_Object obj;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2760 va_list args;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2761
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2762 va_start (args, fmt);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2763 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt), Qnil, -1,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2764 args);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2765 va_end (args);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2766
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2767 /* Fsignal GC-protects its args */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2768 signal_error (Qprinting_unreadable_object, 0, obj);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2769 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2770
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 /* User commands */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 DEFUN ("commandp", Fcommandp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 Return t if FUNCTION makes provisions for interactive calling.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 This means it contains a description for how to read arguments to give it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 The value is nil for an invalid function or a symbol with no function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 definition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 Interactively callable functions include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 -- strings and vectors (treated as keyboard macros)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 -- lambda-expressions that contain a top-level call to `interactive'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 -- autoload definitions made by `autoload' with non-nil fourth argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 (i.e. the interactive flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 -- compiled-function objects with a non-nil `compiled-function-interactive'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 -- subrs (built-in functions) that are interactively callable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 Also, a symbol satisfies `commandp' if its function definition does so.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 Lisp_Object fun = indirect_function (function, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 return XCOMPILED_FUNCTION (fun)->flags.interactivep ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 /* Lists may represent commands. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 return Fassq (Qinteractive, Fcdr (Fcdr (fun)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 return Fcar (Fcdr (Fcdr (Fcdr (fun))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 /* Emacs primitives are interactive if their DEFUN specifies an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 interactive spec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 return XSUBR (fun)->prompt ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 /* Strings and vectors are keyboard macros. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 if (VECTORP (fun) || STRINGP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 /* Everything else (including Qunbound) is not a command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 DEFUN ("command-execute", Fcommand_execute, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 Execute CMD as an editor command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 CMD must be an object that satisfies the `commandp' predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 Optional second arg RECORD-FLAG is as in `call-interactively'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 The argument KEYS specifies the value to use instead of (this-command-keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 when reading the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2833 (cmd, record_flag, keys))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 Lisp_Object prefixarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 Lisp_Object final = cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 struct console *con = XCONSOLE (Vselected_console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 prefixarg = con->prefix_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 con->prefix_arg = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 Vcurrent_prefix_arg = prefixarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 debug_on_next_call = 0; /* #### from FSFmacs; correct? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 if (SYMBOLP (cmd) && !NILP (Fget (cmd, Qdisabled, Qnil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 return run_hook (Vdisabled_command_hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 final = indirect_function (cmd, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 if (CONSP (final) && EQ (Fcar (final), Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 do_autoload (final, cmd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 if (CONSP (final) || SUBRP (final) || COMPILED_FUNCTIONP (final))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 backtrace.function = &Qcall_interactively;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 backtrace.args = &cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 backtrace.nargs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2868 final = Fcall_interactively (cmd, record_flag, keys);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 return final;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 else if (STRINGP (final) || VECTORP (final))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 return Fexecute_kbd_macro (final, prefixarg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 Fsignal (Qwrong_type_argument,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 Fcons (Qcommandp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 (EQ (cmd, final)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 ? list1 (cmd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 : list2 (cmd, final))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 DEFUN ("interactive-p", Finteractive_p, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 Return t if function in which this appears was called interactively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 This means that the function was called with call-interactively (which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 includes being called as the binding of a key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 and input is currently coming from the keyboard (not in keyboard macro).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 REGISTER struct backtrace *btp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 REGISTER Lisp_Object fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 if (!INTERACTIVE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 /* Unless the object was compiled, skip the frame of interactive-p itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 (if interpreted) or the frame of byte-code (if called from a compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 function). Note that *btp->function may be a symbol pointing at a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 compiled function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 btp = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 /* #### FSFmacs does the following instead. I can't figure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 out which one is more correct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 /* If this isn't a byte-compiled function, there may be a frame at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 the top for Finteractive_p itself. If so, skip it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 fun = Findirect_function (*btp->function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 if (SUBRP (fun) && XSUBR (fun) == &Sinteractive_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 /* If we're running an Emacs 18-style byte-compiled function, there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 may be a frame for Fbyte_code. Now, given the strictest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 definition, this function isn't really being called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 interactively, but because that's the way Emacs 18 always builds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 byte-compiled functions, we'll accept it for now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 if (EQ (*btp->function, Qbyte_code))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 /* If this isn't a byte-compiled function, then we may now be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 looking at several frames for special forms. Skip past them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 while (btp &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 btp->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 if (! (COMPILED_FUNCTIONP (Findirect_function (*btp->function))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 btp && (btp->nargs == UNEVALLED
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 || EQ (*btp->function, Qbyte_code));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 btp = btp->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 {}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 /* btp now points at the frame of the innermost function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 that DOES eval its args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 If it is a built-in function (such as load or eval-region)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 return nil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 /* Beats me why this is necessary, but it is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 if (btp && EQ (*btp->function, Qcall_interactively))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 fun = Findirect_function (*btp->function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 /* btp points to the frame of a Lisp function that called interactive-p.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 Return t if that function was called interactively. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 /* Autoloading */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 DEFUN ("autoload", Fautoload, 2, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2967 Define FUNCTION to autoload from FILENAME.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2968 FUNCTION is a symbol; FILENAME is a file name string to pass to `load'.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2969 The remaining optional arguments provide additional info about the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2970 real definition.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2971 DOCSTRING is documentation for FUNCTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2972 INTERACTIVE, if non-nil, says FUNCTION can be called interactively.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2973 TYPE indicates the type of the object:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 nil or omitted says FUNCTION is a function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 `keymap' says FUNCTION is really a keymap, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 `macro' or t says FUNCTION is really a macro.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2977 If FUNCTION already has a non-void function definition that is not an
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2978 autoload object, this function does nothing and returns nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2980 (function, filename, docstring, interactive, type))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 CHECK_SYMBOL (function);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2984 CHECK_STRING (filename);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 /* If function is defined and not as an autoload, don't override */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 Lisp_Object f = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 if (!UNBOUNDP (f) && !(CONSP (f) && EQ (XCAR (f), Qautoload)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 if (purify_flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 /* Attempt to avoid consing identical (string=) pure strings. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2996 filename = Fsymbol_name (Fintern (filename, Qnil));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2998
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2999 return Ffset (function, Fcons (Qautoload, list4 (filename,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 docstring,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 interactive,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 type)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 un_autoload (Lisp_Object oldqueue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 REGISTER Lisp_Object queue, first, second;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 /* Queue to unwind is current value of Vautoload_queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 oldqueue is the shadowed value to leave in Vautoload_queue. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 queue = Vautoload_queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 Vautoload_queue = oldqueue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 while (CONSP (queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 first = XCAR (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 second = Fcdr (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 first = Fcar (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 if (NILP (second))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 Vfeatures = first;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 Ffset (first, second);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 queue = Fcdr (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 do_autoload (Lisp_Object fundef,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 Lisp_Object funname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 Lisp_Object fun = funname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 CHECK_SYMBOL (funname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 GCPRO2 (fun, funname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 /* Value saved here is to be restored into Vautoload_queue */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 record_unwind_protect (un_autoload, Vautoload_queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 Vautoload_queue = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 call4 (Qload, Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 Lisp_Object queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 /* Save the old autoloads, in case we ever do an unload. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 for (queue = Vautoload_queue; CONSP (queue); queue = XCDR (queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 Lisp_Object first = XCAR (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 Lisp_Object second = Fcdr (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 first = Fcar (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 /* Note: This test is subtle. The cdr of an autoload-queue entry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 may be an atom if the autoload entry was generated by a defalias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 or fset. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 if (CONSP (second))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 Fput (first, Qautoload, (XCDR (second)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 /* Once loading finishes, don't undo it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 Vautoload_queue = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 fun = indirect_function (fun, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 if (!NILP (Fequal (fun, fundef)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 if (UNBOUNDP (fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 || (CONSP (fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 && EQ (XCAR (fun), Qautoload)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 #endif
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3078 invalid_state ("Autoloading failed to define function", funname);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 /* eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 static Lisp_Object funcall_lambda (Lisp_Object fun,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3088 int nargs, Lisp_Object args[]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 static int in_warnings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 in_warnings_restore (Lisp_Object minimus)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 in_warnings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 DEFUN ("eval", Feval, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 Evaluate FORM and return its value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 Lisp_Object fun, val, original_fun, original_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 int nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 /* I think this is a pretty safe place to call Lisp code, don't you? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 while (!in_warnings && !NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 Lisp_Object this_warning_cons, this_warning, class, level, messij;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 record_unwind_protect (in_warnings_restore, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 in_warnings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 this_warning_cons = Vpending_warnings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 this_warning = XCAR (this_warning_cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 /* in case an error occurs in the warn function, at least
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 it won't happen infinitely */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 Vpending_warnings = XCDR (Vpending_warnings);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 free_cons (XCONS (this_warning_cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 class = XCAR (this_warning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 level = XCAR (XCDR (this_warning));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 messij = XCAR (XCDR (XCDR (this_warning)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 free_list (this_warning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 if (NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 Vpending_warnings_tail = Qnil; /* perhaps not strictly necessary,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 but safer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 GCPRO4 (form, class, level, messij);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 if (!STRINGP (messij))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 messij = Fprin1_to_string (messij, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 call3 (Qdisplay_warning, class, messij, level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 if (!CONSP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 if (SYMBOLP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 return Fsymbol_value (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 return form;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 if ((consing_since_gc > gc_cons_threshold) || always_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 GCPRO1 (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 garbage_collect_1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 if (++lisp_eval_depth > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 if (max_lisp_eval_depth < 100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 max_lisp_eval_depth = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 if (lisp_eval_depth > max_lisp_eval_depth)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3162 stack_overflow ("Lisp nesting exceeds `max-lisp-eval-depth'",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3163 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 /* We guaranteed CONSP (form) above */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 original_fun = XCAR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 original_args = XCDR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 GET_EXTERNAL_LIST_LENGTH (original_args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 backtrace.function = &original_fun; /* This also protects them from gc */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 backtrace.args = &original_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 backtrace.nargs = UNEVALLED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 backtrace.evalargs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 if (debug_on_next_call)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 do_debug_on_call (Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 if (profiling_active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 profile_increase_call_count (original_fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 /* At this point, only original_fun and original_args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 have values that will be used below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 fun = indirect_function (original_fun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 if (nargs < subr->min_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 if (max_args == UNEVALLED) /* Optimize for the common case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 val = (((Lisp_Object (*) (Lisp_Object)) subr_function (subr))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 (original_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 else if (nargs <= max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 Lisp_Object args[SUBR_MAX_ARGS];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 /* &optional args default to nil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 while (p - args < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 *p++ = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 FUNCALL_SUBR (val, subr, args, max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 else if (max_args == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 /* Pass a vector of evaluated arguments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 val = (((Lisp_Object (*) (int, Lisp_Object *)) subr_function (subr))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 (nargs, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 wrong_number_of_arguments:
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
3262 val = signal_wrong_number_of_arguments_error (original_fun, nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 else if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 val = funcall_compiled_function (fun, nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 /* Do the debug-on-exit now, while args is still GCPROed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 /* Don't do it again when we return to eval. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 else if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 do_autoload (fun, original_fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 else if (EQ (funcar, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 val = Feval (apply1 (XCDR (fun), original_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 else if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 backtrace.args = args; /* this also GCPROs `args' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 val = funcall_lambda (fun, nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 /* Do the debug-on-exit now, while args is still GCPROed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 /* Don't do it again when we return to eval. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345 else /* ! (SUBRP (fun) || COMPILED_FUNCTIONP (fun) || CONSP (fun)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3348 val = signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 lisp_eval_depth--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 DEFUN ("funcall", Ffuncall, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 Call first argument as a function, passing the remaining arguments to it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 Thus, (funcall 'cons 'x 'y) returns (x . y).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 Lisp_Object fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 int fun_nargs = nargs - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 Lisp_Object *fun_args = args + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 if ((consing_since_gc > gc_cons_threshold) || always_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 /* Callers should gcpro lexpr args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 garbage_collect_1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 if (++lisp_eval_depth > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 if (max_lisp_eval_depth < 100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 max_lisp_eval_depth = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 if (lisp_eval_depth > max_lisp_eval_depth)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3382 stack_overflow ("Lisp nesting exceeds `max-lisp-eval-depth'",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3383 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 backtrace.function = &args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 backtrace.args = fun_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 backtrace.nargs = fun_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 if (debug_on_next_call)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 do_debug_on_call (Qlambda);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 /* It might be useful to place this *after* all the checks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 if (profiling_active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403 profile_increase_call_count (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 /* We could call indirect_function directly, but profiling shows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 this is worth optimizing by partially unrolling the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 fun = XSYMBOL (fun)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412 fun = XSYMBOL (fun)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 fun = indirect_function (fun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422 Lisp_Object spacious_args[SUBR_MAX_ARGS];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 if (fun_nargs == max_args) /* Optimize for the common case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 funcall_subr:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 FUNCALL_SUBR (val, subr, fun_args, max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 }
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3429 else if (fun_nargs < subr->min_args)
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3430 {
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3431 goto wrong_number_of_arguments;
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3432 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 else if (fun_nargs < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 Lisp_Object *p = spacious_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 /* Default optionals to nil */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 while (fun_nargs--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 *p++ = *fun_args++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 while (p - spacious_args < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 *p++ = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443 fun_args = spacious_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444 goto funcall_subr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 else if (max_args == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3448 val = SUBR_FUNCTION (subr, MANY) (fun_nargs, fun_args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 else if (max_args == UNEVALLED) /* Can't funcall a special form */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 wrong_number_of_arguments:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3457 val = signal_wrong_number_of_arguments_error (fun, fun_nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 else if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 val = funcall_compiled_function (fun, fun_nargs, fun_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 else if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 val = funcall_lambda (fun, fun_nargs, fun_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 else if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 do_autoload (fun, args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 else /* Can't funcall a macro */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 else if (UNBOUNDP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3484 val = signal_void_function_error (args[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3489 val = signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492 lisp_eval_depth--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 DEFUN ("functionp", Ffunctionp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 Return t if OBJECT can be called as a function, else nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 A function is an object that can be applied to arguments,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502 using for example `funcall' or `apply'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 if (SYMBOLP (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 object = indirect_function (object, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 (SUBRP (object) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 COMPILED_FUNCTIONP (object) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 (CONSP (object) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 (EQ (XCAR (object), Qlambda) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 EQ (XCAR (object), Qautoload))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 function_argcount (Lisp_Object function, int function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 Lisp_Object orig_function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 Lisp_Object arglist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 function = indirect_function (function, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 if (SUBRP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3531 /* Using return with the ?: operator tickles a DEC CC compiler bug. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3532 if (function_min_args_p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3533 return Fsubr_min_args (function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3534 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3535 return Fsubr_max_args (function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 else if (COMPILED_FUNCTIONP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 arglist = compiled_function_arglist (XCOMPILED_FUNCTION (function));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 else if (CONSP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 Lisp_Object funcar = XCAR (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 if (EQ (funcar, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 function = XCDR (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 else if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3552 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3553
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3554 GCPRO1 (function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 do_autoload (function, orig_function);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3556 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3557 function = orig_function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 else if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3561 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 arglist = Fcar (XCDR (function));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571 invalid_function:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3572 return signal_invalid_function_error (orig_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 int argcount = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 EXTERNAL_LIST_LOOP_2 (arg, arglist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 if (EQ (arg, Qand_optional))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 if (function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 else if (EQ (arg, Qand_rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 if (function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 argcount++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 return make_int (argcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 DEFUN ("function-min-args", Ffunction_min_args, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 Return the number of arguments a function may be called with.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 The function may be any form that can be passed to `funcall',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 any special form, or any macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 return function_argcount (function, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 DEFUN ("function-max-args", Ffunction_max_args, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 Return the number of arguments a function may be called with.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 The function may be any form that can be passed to `funcall',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 any special form, or any macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 If the function takes an arbitrary number of arguments or is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 a built-in special form, nil is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 return function_argcount (function, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625 DEFUN ("apply", Fapply, 2, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 Call FUNCTION with the remaining args, using the last arg as a list of args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 Thus, (apply '+ 1 2 '(3 4)) returns 10.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 Lisp_Object fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 Lisp_Object spread_arg = args [nargs - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 int numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 int funcall_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 GET_EXTERNAL_LIST_LENGTH (spread_arg, numargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 if (numargs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 /* (apply foo 0 1 '()) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 return Ffuncall (nargs - 1, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 else if (numargs == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644 /* (apply foo 0 1 '(2)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 args [nargs - 1] = XCAR (spread_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 return Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649 /* -1 for function, -1 for spread arg */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 numargs = nargs - 2 + numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 /* +1 for function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 funcall_nargs = 1 + numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 fun = indirect_function (fun, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 if (numargs < subr->min_args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663 || (max_args >= 0 && max_args < numargs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 /* Let funcall get the error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 else if (max_args > numargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 /* Avoid having funcall cons up yet another new vector of arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 by explicitly supplying nil's for optional values */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 funcall_nargs += (max_args - numargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 else if (UNBOUNDP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 /* Let funcall get the error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 Lisp_Object *funcall_args = alloca_array (Lisp_Object, funcall_nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 gcpro1.nvars = funcall_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 /* Copy in the unspread args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 memcpy (funcall_args, args, (nargs - 1) * sizeof (Lisp_Object));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 /* Spread the last arg we got. Its first element goes in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691 the slot that it used to occupy, hence this value of I. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 for (i = nargs - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 !NILP (spread_arg); /* i < 1 + numargs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 i++, spread_arg = XCDR (spread_arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696 funcall_args [i] = XCAR (spread_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 /* Supply nil for optional args (to subrs) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 for (; i < funcall_nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 funcall_args[i] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 RETURN_UNGCPRO (Ffuncall (funcall_nargs, funcall_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 /* Apply lambda list FUN to the NARGS evaluated arguments in ARGS and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 return the result of evaluation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 funcall_lambda (Lisp_Object fun, int nargs, Lisp_Object args[])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3715 Lisp_Object arglist, body, tail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 REGISTER int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 tail = XCDR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 if (!CONSP (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 arglist = XCAR (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725 body = XCDR (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 int optional = 0, rest = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3730 EXTERNAL_LIST_LOOP_2 (symbol, arglist)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 if (!SYMBOLP (symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 if (EQ (symbol, Qand_rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 rest = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736 else if (EQ (symbol, Qand_optional))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 optional = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 else if (rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740 specbind (symbol, Flist (nargs - i, &args[i]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741 i = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 else if (i < nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 specbind (symbol, args[i++]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745 else if (!optional)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 specbind (symbol, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 if (i < nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 return unbind_to (speccount, Fprogn (body));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 wrong_number_of_arguments:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3758 return signal_wrong_number_of_arguments_error (fun, nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3761 return signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 /* Run hook variables in various ways. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 DEFUN ("run-hooks", Frun_hooks, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 Run each hook in HOOKS. Major mode functions use this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 Each argument should be a symbol, a hook variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 These symbols are processed in the order specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 If a hook symbol has a non-nil value, that value may be a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 or a list of functions to be called to run the hook.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 If the value is a function, it is called with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 If it is a list, the elements are called, in order, with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 run_hook_with_args (1, args + i, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 DEFUN ("run-hook-with-args", Frun_hook_with_args, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 HOOK should be a symbol, a hook variable. If HOOK has a non-nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 value, that value may be a function or a list of functions to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795 called to run the hook. If the value is a function, it is called with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 the given arguments and its return value is returned. If it is a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 of functions, those functions are called, in order,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798 with the given arguments ARGS.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3799 It is best not to depend on the value returned by `run-hook-with-args',
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 as that may change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 return run_hook_with_args (nargs, args, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 DEFUN ("run-hook-with-args-until-success", Frun_hook_with_args_until_success, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 HOOK should be a symbol, a hook variable. Its value should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 be a list of functions. We call those functions, one by one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 passing arguments ARGS to each of them, until one of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 returns a non-nil value. Then we return that value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 If all the functions return nil, we return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 return run_hook_with_args (nargs, args, RUN_HOOKS_UNTIL_SUCCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 DEFUN ("run-hook-with-args-until-failure", Frun_hook_with_args_until_failure, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 HOOK should be a symbol, a hook variable. Its value should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 be a list of functions. We call those functions, one by one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 passing arguments ARGS to each of them, until one of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 returns nil. Then we return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 If all the functions return non-nil, we return non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 return run_hook_with_args (nargs, args, RUN_HOOKS_UNTIL_FAILURE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 /* ARGS[0] should be a hook symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 Call each of the functions in the hook value, passing each of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 as arguments all the rest of ARGS (all NARGS - 1 elements).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 COND specifies a condition to test after each call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 to decide whether to stop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 The caller (or its caller, etc) must gcpro all of ARGS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 except that it isn't necessary to gcpro ARGS[0]. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 run_hook_with_args_in_buffer (struct buffer *buf, int nargs, Lisp_Object *args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852 enum run_hooks_condition cond)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 Lisp_Object sym, val, ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 /* We need to bail out of here pronto. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 /* Whenever gc_in_progress is true, preparing_for_armageddon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 will also be true unless something is really hosed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 assert (!gc_in_progress);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 sym = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 val = symbol_value_in_buffer (sym, make_buffer (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 ret = (cond == RUN_HOOKS_UNTIL_FAILURE ? Qt : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3868 if (UNBOUNDP (val) || NILP (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 return ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 else if (!CONSP (val) || EQ (XCAR (val), Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3871 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872 args[0] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 return Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 struct gcpro gcpro1, gcpro2, gcpro3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 Lisp_Object globals = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 GCPRO3 (sym, val, globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 CONSP (val) && ((cond == RUN_HOOKS_TO_COMPLETION)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 || (cond == RUN_HOOKS_UNTIL_SUCCESS ? NILP (ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 : !NILP (ret)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 val = XCDR (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 if (EQ (XCAR (val), Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 /* t indicates this hook has a local binding;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 it means to run the global binding too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 globals = Fdefault_value (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 if ((! CONSP (globals) || EQ (XCAR (globals), Qlambda)) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 ! NILP (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896 args[0] = globals;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 CONSP (globals) && ((cond == RUN_HOOKS_TO_COMPLETION)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 || (cond == RUN_HOOKS_UNTIL_SUCCESS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904 ? NILP (ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 : !NILP (ret)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 globals = XCDR (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 args[0] = XCAR (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 /* In a global value, t should not occur. If it does, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 must ignore it to avoid an endless loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 if (!EQ (args[0], Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 args[0] = XCAR (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 return ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 run_hook_with_args (int nargs, Lisp_Object *args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 enum run_hooks_condition cond)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 return run_hook_with_args_in_buffer (current_buffer, nargs, args, cond);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3937 /* From FSF 19.30, not currently used */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939 /* Run a hook symbol ARGS[0], but use FUNLIST instead of the actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940 present value of that symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 Call each element of FUNLIST,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942 passing each of them the rest of ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 The caller (or its caller, etc) must gcpro all of ARGS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 except that it isn't necessary to gcpro ARGS[0]. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 run_hook_list_with_args (Lisp_Object funlist, int nargs, Lisp_Object *args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 Lisp_Object sym = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 GCPRO2 (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955 for (val = funlist; CONSP (val); val = XCDR (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 if (EQ (XCAR (val), Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 /* t indicates this hook has a local binding;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 it means to run the global binding too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961 Lisp_Object globals;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 for (globals = Fdefault_value (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 CONSP (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 globals = XCDR (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967 args[0] = XCAR (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968 /* In a global value, t should not occur. If it does, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969 must ignore it to avoid an endless loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3970 if (!EQ (args[0], Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3971 Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3972 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976 args[0] = XCAR (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 va_run_hook_with_args (Lisp_Object hook_var, int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 Lisp_Object *funcall_args = alloca_array (Lisp_Object, 1 + nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 funcall_args[0] = hook_var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 funcall_args[i + 1] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 gcpro1.nvars = nargs + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 run_hook_with_args (nargs + 1, funcall_args, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008 va_run_hook_with_args_in_buffer (struct buffer *buf, Lisp_Object hook_var,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 Lisp_Object *funcall_args = alloca_array (Lisp_Object, 1 + nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 funcall_args[0] = hook_var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 funcall_args[i + 1] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024 gcpro1.nvars = nargs + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 run_hook_with_args_in_buffer (buf, nargs + 1, funcall_args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 run_hook (Lisp_Object hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 Frun_hooks (1, &hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039 /* Front-ends to eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 /* Apply fn to arg */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 apply1 (Lisp_Object fn, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050 if (NILP (arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051 return Ffuncall (1, &fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 args[1] = arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 RETURN_UNGCPRO (Fapply (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 /* Call function fn on no arguments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 call0 (Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 GCPRO1 (fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 RETURN_UNGCPRO (Ffuncall (1, &fn));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 /* Call function fn with argument arg0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 call1 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4081 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 RETURN_UNGCPRO (Ffuncall (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 /* Call function fn with arguments arg0, arg1 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087 call2 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088 Lisp_Object arg0, Lisp_Object arg1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 gcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 RETURN_UNGCPRO (Ffuncall (3, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 /* Call function fn with arguments arg0, arg1, arg2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 call3 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108 Lisp_Object args[4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114 gcpro1.nvars = 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 RETURN_UNGCPRO (Ffuncall (4, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 /* Call function fn with arguments arg0, arg1, arg2, arg3 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 call4 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 Lisp_Object arg3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 Lisp_Object args[5];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 gcpro1.nvars = 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 RETURN_UNGCPRO (Ffuncall (5, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 /* Call function fn with arguments arg0, arg1, arg2, arg3, arg4 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 call5 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141 Lisp_Object arg3, Lisp_Object arg4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 Lisp_Object args[6];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153 gcpro1.nvars = 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 RETURN_UNGCPRO (Ffuncall (6, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 call6 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 Lisp_Object args[7];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4165 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173 gcpro1.nvars = 7;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 RETURN_UNGCPRO (Ffuncall (7, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 call7 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 Lisp_Object arg6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 Lisp_Object args[8];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 args[7] = arg6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 gcpro1.nvars = 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 RETURN_UNGCPRO (Ffuncall (8, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 call8 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 Lisp_Object arg6, Lisp_Object arg7)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 Lisp_Object args[9];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 args[7] = arg6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 args[8] = arg7;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 gcpro1.nvars = 9;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 RETURN_UNGCPRO (Ffuncall (9, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 call0_in_buffer (struct buffer *buf, Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 return call0 (fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 val = call0 (fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 call1_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 return call1 (fn, arg0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4250 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 val = call1 (fn, arg0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 call2_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 Lisp_Object arg0, Lisp_Object arg1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 return call2 (fn, arg0, arg1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 val = call2 (fn, arg0, arg1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 call3_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 return call3 (fn, arg0, arg1, arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 val = call3 (fn, arg0, arg1, arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 call4_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 Lisp_Object arg3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299 return call4 (fn, arg0, arg1, arg2, arg3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306 val = call4 (fn, arg0, arg1, arg2, arg3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4310 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 eval_in_buffer (struct buffer *buf, Lisp_Object form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 return Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 val = Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 unbind_to (speccount, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 /* Error-catching front-ends to eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 /* Call function fn on no arguments, with condition handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 call0_with_handler (Lisp_Object handler, Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 args[0] = handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 args[1] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 RETURN_UNGCPRO (Fcall_with_condition_handler (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 /* Call function fn with argument arg0, with condition handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 call1_with_handler (Lisp_Object handler, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 args[0] = handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 args[1] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 args[2] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 gcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361 RETURN_UNGCPRO (Fcall_with_condition_handler (3, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 /* The following functions provide you with error-trapping versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366 of the various front-ends above. They take an additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367 "warning_string" argument; if non-zero, a warning with this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 string and the actual error that occurred will be displayed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 in the *Warnings* buffer if an error occurs. In all cases,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 QUIT is inhibited while these functions are running, and if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 an error occurs, Qunbound is returned instead of the normal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 return value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 /* #### This stuff needs to catch throws as well. We need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 improve internal_catch() so it can take a "catch anything"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 argument similar to Qt or Qerror for condition_case_1(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 if (!NILP (errordata))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386 if (!NILP (arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 char *str = (char *) get_opaque_ptr (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 args[0] = build_string (str);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 args[0] = build_string ("error");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 /* #### This should call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394 (with-output-to-string (display-error errordata))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 but that stuff is all in Lisp currently. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396 args[1] = errordata;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 warn_when_safe_lispobj
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 (Qerror, Qwarning,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4399 emacs_doprnt_string_lisp ((const Bufbyte *) "%s: %s",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400 Qnil, -1, 2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 allow_quit_caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 if (CONSP (errordata) && EQ (XCAR (errordata), Qquit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 return Fsignal (Qquit, XCDR (errordata));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 return caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 safe_run_hook_caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416 Lisp_Object hook = Fcar (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417 arg = Fcdr (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 /* Clear out the hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419 Fset (hook, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 return caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4424 allow_quit_safe_run_hook_caught_a_squirmer (Lisp_Object errordata,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4425 Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427 Lisp_Object hook = Fcar (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 arg = Fcdr (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 if (!CONSP (errordata) || !EQ (XCAR (errordata), Qquit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 /* Clear out the hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 Fset (hook, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 return allow_quit_caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436 catch_them_squirmers_eval_in_buffer (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 return eval_in_buffer (XBUFFER (XCAR (cons)), XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4442 eval_in_buffer_trapping_errors (const char *warning_string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 struct buffer *buf, Lisp_Object form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447 Lisp_Object buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 Lisp_Object cons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4449 Lisp_Object opaque;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452 XSETBUFFER (buffer, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455 /* gc_currently_forbidden = 1; Currently no reason to do this; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 cons = noseeum_cons (buffer, form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459 GCPRO2 (cons, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4462 catch_them_squirmers_eval_in_buffer, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 /* gc_currently_forbidden = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 catch_them_squirmers_run_hook (Lisp_Object hook_symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 run_hook (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4482 run_hook_trapping_errors (const char *warning_string, Lisp_Object hook_symbol)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 Lisp_Object opaque;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 tem = find_symbol_value (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499 GCPRO1 (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 catch_them_squirmers_run_hook, hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 /* Same as run_hook_trapping_errors() but also set the hook to nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 if an error occurs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4515 safe_run_hook_trapping_errors (const char *warning_string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 Lisp_Object hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517 int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526 tem = find_symbol_value (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 if (!allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533 cons = noseeum_cons (hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534 warning_string ? make_opaque_ptr ((void *)warning_string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 GCPRO1 (cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 catch_them_squirmers_run_hook,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541 allow_quit ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4542 allow_quit_safe_run_hook_caught_a_squirmer :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 safe_run_hook_caught_a_squirmer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4545 if (OPAQUE_PTRP (XCDR (cons)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546 free_opaque_ptr (XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 catch_them_squirmers_call0 (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4555 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 return call0 (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4561 call0_trapping_errors (const char *warning_string, Lisp_Object function)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4562 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4563 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4565 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4566 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 GCPRO2 (opaque, function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4578 /* gc_currently_forbidden = 1; Currently no reason to do this; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4580 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4581 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4582 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4583 catch_them_squirmers_call0, function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4584 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 /* gc_currently_forbidden = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 catch_them_squirmers_call1 (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 return call1 (XCAR (cons), XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 catch_them_squirmers_call2 (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 return call2 (XCAR (cons), XCAR (XCDR (cons)), XCAR (XCDR (XCDR (cons))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4608 call1_trapping_errors (const char *warning_string, Lisp_Object function,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609 Lisp_Object object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4611 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4621 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4622 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4624 GCPRO4 (cons, opaque, function, object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4626 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4627 /* gc_currently_forbidden = 1; Currently no reason to do this; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629 cons = noseeum_cons (function, object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4630 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4632 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4633 catch_them_squirmers_call1, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4638 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640 /* gc_currently_forbidden = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4645 call2_trapping_errors (const char *warning_string, Lisp_Object function,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646 Lisp_Object object1, Lisp_Object object2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661 GCPRO5 (cons, opaque, function, object1, object2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4662 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663 /* gc_currently_forbidden = 1; Currently no reason to do this; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 cons = list3 (function, object1, object2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 catch_them_squirmers_call2, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673 free_list (cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 /* gc_currently_forbidden = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 return unbind_to (speccount, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 /* The special binding stack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 /* Most C code should simply use specbind() and unbind_to(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684 /* When performance is critical, use the macros in backtrace.h. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687 #define min_max_specpdl_size 400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 grow_specpdl (size_t reserved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 size_t size_needed = specpdl_depth() + reserved;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 if (size_needed >= max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695 if (max_specpdl_size < min_max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 max_specpdl_size = min_max_specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697 if (size_needed >= max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 if (!NILP (Vdebug_on_error) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 !NILP (Vdebug_on_signal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 /* Leave room for some specpdl in the debugger. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702 max_specpdl_size = size_needed + 100;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4703 signal_continuable_error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4704 (Qstack_overflow,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4705 "Variable binding depth exceeds max-specpdl-size", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 while (specpdl_size < size_needed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 specpdl_size *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 if (specpdl_size > max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 specpdl_size = max_specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 XREALLOC_ARRAY (specpdl, struct specbinding, specpdl_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 specpdl_ptr = specpdl + specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 /* Handle unbinding buffer-local variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 specbind_unwind_local (Lisp_Object ovalue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 Lisp_Object current = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 Lisp_Object symbol = specpdl_ptr->symbol;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
4725 Lisp_Cons *victim = XCONS (ovalue);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 Lisp_Object buf = get_buffer (victim->car, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 ovalue = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 if (NILP (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 /* Deleted buffer -- do nothing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 else if (symbol_value_buffer_local_info (symbol, XBUFFER (buf)) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 /* Was buffer-local when binding was made, now no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 * (kill-local-variable can do this.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 * Do nothing in this case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 else if (EQ (buf, current))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 Fset (symbol, ovalue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 /* Urk! Somebody switched buffers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 GCPRO1 (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749 Fset_buffer (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750 Fset (symbol, ovalue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751 Fset_buffer (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 return symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758 specbind_unwind_wasnt_local (Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 Lisp_Object current = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 Lisp_Object symbol = specpdl_ptr->symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 buffer = get_buffer (buffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 if (NILP (buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 /* Deleted buffer -- do nothing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 else if (symbol_value_buffer_local_info (symbol, XBUFFER (buffer)) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 /* Was buffer-local when binding was made, now no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 * (kill-local-variable can do this.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 * Do nothing in this case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 else if (EQ (buffer, current))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 Fkill_local_variable (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 /* Urk! Somebody switched buffers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 GCPRO1 (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 Fset_buffer (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 Fkill_local_variable (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 Fset_buffer (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 return symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 specbind (Lisp_Object symbol, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 SPECBIND (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 specbind_magic (Lisp_Object symbol, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 int buffer_local =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 symbol_value_buffer_local_info (symbol, current_buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 if (buffer_local == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 specpdl_ptr->old_value = find_symbol_value (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 specpdl_ptr->func = 0; /* Handled specially by unbind_to */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 else if (buffer_local > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 /* Already buffer-local */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 specpdl_ptr->old_value = noseeum_cons (Fcurrent_buffer (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 find_symbol_value (symbol));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 specpdl_ptr->func = specbind_unwind_local;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 /* About to become buffer-local */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818 specpdl_ptr->old_value = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 specpdl_ptr->func = specbind_unwind_wasnt_local;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 specpdl_ptr->symbol = symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 specpdl_ptr++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 specpdl_depth_counter++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 Fset (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 458
diff changeset
4829 /* Note: As long as the unwind-protect exists, its arg is automatically
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 458
diff changeset
4830 GCPRO'd. */
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 458
diff changeset
4831
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 record_unwind_protect (Lisp_Object (*function) (Lisp_Object arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 SPECPDL_RESERVE (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 specpdl_ptr->func = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 specpdl_ptr->symbol = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 specpdl_ptr->old_value = arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 specpdl_ptr++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 specpdl_depth_counter++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 extern int check_sigio (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 /* Unwind the stack till specpdl_depth() == COUNT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847 VALUE is not used, except that, purely as a convenience to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 caller, it is protected from garbage-protection. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 unbind_to (int count, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 UNBIND_TO_GCPRO (count, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 return value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 /* Don't call this directly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 Only for use by UNBIND_TO* macros in backtrace.h */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859 unbind_to_hairy (int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 int quitf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4863 ++specpdl_ptr;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4864 ++specpdl_depth_counter;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4865
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866 check_quit (); /* make Vquit_flag accurate */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 quitf = !NILP (Vquit_flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870 while (specpdl_depth_counter != count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 --specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 --specpdl_depth_counter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 if (specpdl_ptr->func != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 /* An unwind-protect */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 (*specpdl_ptr->func) (specpdl_ptr->old_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 /* We checked symbol for validity when we specbound it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 so only need to call Fset if symbol has magic value. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
4882 Lisp_Symbol *sym = XSYMBOL (specpdl_ptr->symbol);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 if (!SYMBOL_VALUE_MAGIC_P (sym->value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884 sym->value = specpdl_ptr->old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 Fset (specpdl_ptr->symbol, specpdl_ptr->old_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4889 #if 0 /* martin */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890 #ifndef EXCEEDINGLY_QUESTIONABLE_CODE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891 /* There should never be anything here for us to remove.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 If so, it indicates a logic error in Emacs. Catches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 should get removed when a throw or signal occurs, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 when a catch or condition-case exits normally. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 it's too dangerous to just remove this code. --ben */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 /* Furthermore, this code is not in FSFmacs!!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 Braino on mly's part? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 /* If we're unwound past the pdlcount of a catch frame,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 that catch can't possibly still be valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 while (catchlist && catchlist->pdlcount > specpdl_depth_counter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4903 catchlist = catchlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904 /* Don't mess with gcprolist, backtrace_list here */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 if (quitf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 Vquit_flag = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915 /* Get the value of symbol's global binding, even if that binding is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916 not now dynamically visible. May return Qunbound or magic values. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4919 top_level_value (Lisp_Object symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4920 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921 REGISTER struct specbinding *ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923 CHECK_SYMBOL (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 for (; ptr != specpdl_ptr; ptr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926 if (EQ (ptr->symbol, symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 return ptr->old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4928 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929 return XSYMBOL (symbol)->value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4932 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4935 top_level_set (Lisp_Object symbol, Lisp_Object newval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4937 REGISTER struct specbinding *ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4939 CHECK_SYMBOL (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4940 for (; ptr != specpdl_ptr; ptr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4941 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4942 if (EQ (ptr->symbol, symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4943 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 ptr->old_value = newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4945 return newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 return Fset (symbol, newval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 /* Backtraces */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4958 DEFUN ("backtrace-debug", Fbacktrace_debug, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959 Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960 The debugger is entered when that frame exits, if the flag is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 (level, flag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4963 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964 REGISTER struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967 CHECK_INT (level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969 for (i = 0; backlist && i < XINT (level); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4974 if (backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975 backlist->debug_on_exit = !NILP (flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 return flag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981 backtrace_specials (int speccount, int speclimit, Lisp_Object stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 int printing_bindings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 for (; speccount > speclimit; speccount--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987 if (specpdl[speccount - 1].func == 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 || specpdl[speccount - 1].func == specbind_unwind_local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 || specpdl[speccount - 1].func == specbind_unwind_wasnt_local)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 write_c_string (((!printing_bindings) ? " # bind (" : " "),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 Fprin1 (specpdl[speccount - 1].symbol, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994 printing_bindings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 if (printing_bindings) write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 write_c_string (" # (unwind-protect ...)\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 printing_bindings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 if (printing_bindings) write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 DEFUN ("backtrace", Fbacktrace, 0, 2, "", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 Print a trace of Lisp function calls currently active.
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5008 Optional arg STREAM specifies the output stream to send the backtrace to,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5009 and defaults to the value of `standard-output'.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5010 Optional second arg DETAILED non-nil means show places where currently
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5011 active variable bindings, catches, condition-cases, and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5012 unwind-protects, as well as function calls, were made.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5014 (stream, detailed))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017 struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018 struct catchtag *catches = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 int old_nl = print_escape_newlines;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022 int old_pr = print_readably;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5023 Lisp_Object old_level = Vprint_level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5024 Lisp_Object oiq = Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5025 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5027 /* We can't allow quits in here because that could cause the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028 of print_readably and print_escape_newlines to get screwed up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029 Normally we would use a record_unwind_protect but that would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030 screw up the functioning of this function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 Vinhibit_quit = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 entering_debugger = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035 Vprint_level = make_int (3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 print_readably = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037 print_escape_newlines = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039 GCPRO2 (stream, old_level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041 if (NILP (stream))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5042 stream = Vstandard_output;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 if (!noninteractive && (NILP (stream) || EQ (stream, Qt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044 stream = Fselected_frame (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 if (!NILP (detailed) && catches && catches->backlist == backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 int catchpdl = catches->pdlcount;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5051 if (speccount > catchpdl
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5052 && specpdl[catchpdl].func == condition_case_unwind)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 /* This is a condition-case catchpoint */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 catchpdl = catchpdl + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 backtrace_specials (speccount, catchpdl, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 speccount = catches->pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 if (catchpdl == speccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 write_c_string (" # (catch ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062 Fprin1 (catches->tag, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 write_c_string (" ...)\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 write_c_string (" # (condition-case ... . ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 Fprin1 (Fcdr (Fcar (catches->tag)), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 catches = catches->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 else if (!backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 if (!NILP (detailed) && backlist->pdlcount < speccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079 backtrace_specials (speccount, backlist->pdlcount, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080 speccount = backlist->pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082 write_c_string (((backlist->debug_on_exit) ? "* " : " "),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5084 if (backlist->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 Fprin1 (Fcons (*backlist->function, *backlist->args), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 write_c_string ("\n", stream); /* from FSFmacs 19.30 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 Lisp_Object tem = *backlist->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 Fprin1 (tem, stream); /* This can QUIT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 write_c_string ("(", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 if (backlist->nargs == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 Lisp_Object tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 struct gcpro ngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100 NGCPRO1 (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5101 for (tail = *backlist->args, i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 !NILP (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5103 tail = Fcdr (tail), i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105 if (i != 0) write_c_string (" ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106 Fprin1 (Fcar (tail), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5108 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5110 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 for (i = 0; i < backlist->nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5115 if (!i && EQ(tem, Qbyte_code)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116 write_c_string("\"...\"", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 if (i != 0) write_c_string (" ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 Fprin1 (backlist->args[i], stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5123 write_c_string (")\n", stream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 Vprint_level = old_level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 print_readably = old_pr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 print_escape_newlines = old_nl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132 Vinhibit_quit = oiq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5137 DEFUN ("backtrace-frame", Fbacktrace_frame, 1, 1, 0, /*
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5138 Return the function and arguments NFRAMES up from current execution point.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 If that frame has not evaluated the arguments yet (or is a special form),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140 the value is (nil FUNCTION ARG-FORMS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 If that frame has evaluated its arguments and called its function already,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 the value is (t FUNCTION ARG-VALUES...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143 A &rest arg is represented as the tail of the list ARG-VALUES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144 FUNCTION is whatever was supplied as car of evaluated list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 or a lambda expression for macro calls.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5146 If NFRAMES is more than the number of frames, the value is nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148 (nframes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150 REGISTER struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154 CHECK_NATNUM (nframes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 /* Find the frame requested. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157 for (i = XINT (nframes); backlist && (i-- > 0);)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 if (!backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162 if (backlist->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163 return Fcons (Qnil, Fcons (*backlist->function, *backlist->args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 if (backlist->nargs == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 tem = *backlist->args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 tem = Flist (backlist->nargs, backlist->args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 return Fcons (Qt, Fcons (*backlist->function, tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177 /* Warnings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 warn_when_safe_lispobj (Lisp_Object class, Lisp_Object level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 obj = list1 (list3 (class, level, obj));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185 if (NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186 Vpending_warnings = Vpending_warnings_tail = obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 Fsetcdr (Vpending_warnings_tail, obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190 Vpending_warnings_tail = obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194 /* #### This should probably accept Lisp objects; but then we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195 to make sure that Feval() isn't called, since it might not be safe.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197 An alternative approach is to just pass some non-string type of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 Lisp_Object to warn_when_safe_lispobj(); `prin1-to-string' will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 automatically be called when it is safe to do so. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5202 warn_when_safe (Lisp_Object class, Lisp_Object level, const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5203 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 va_start (args, fmt);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5208 obj = emacs_doprnt_string_va ((const Bufbyte *) GETTEXT (fmt),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5209 Qnil, -1, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 warn_when_safe_lispobj (class, level, obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5218 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219 /* Initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5222 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 syms_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5224 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5225 INIT_LRECORD_IMPLEMENTATION (subr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5226
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5227 DEFSYMBOL (Qinhibit_quit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5228 DEFSYMBOL (Qautoload);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5229 DEFSYMBOL (Qdebug_on_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5230 DEFSYMBOL (Qstack_trace_on_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5231 DEFSYMBOL (Qdebug_on_signal);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5232 DEFSYMBOL (Qstack_trace_on_signal);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5233 DEFSYMBOL (Qdebugger);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5234 DEFSYMBOL (Qmacro);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 defsymbol (&Qand_rest, "&rest");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236 defsymbol (&Qand_optional, "&optional");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 /* Note that the process code also uses Qexit */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5238 DEFSYMBOL (Qexit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5239 DEFSYMBOL (Qsetq);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5240 DEFSYMBOL (Qinteractive);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5241 DEFSYMBOL (Qcommandp);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5242 DEFSYMBOL (Qdefun);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5243 DEFSYMBOL (Qprogn);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5244 DEFSYMBOL (Qvalues);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5245 DEFSYMBOL (Qdisplay_warning);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5246 DEFSYMBOL (Qrun_hooks);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5247 DEFSYMBOL (Qif);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249 DEFSUBR (For);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5250 DEFSUBR (Fand);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 DEFSUBR (Fif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5252 DEFSUBR_MACRO (Fwhen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 DEFSUBR_MACRO (Funless);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254 DEFSUBR (Fcond);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 DEFSUBR (Fprogn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 DEFSUBR (Fprog1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 DEFSUBR (Fprog2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 DEFSUBR (Fsetq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259 DEFSUBR (Fquote);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260 DEFSUBR (Ffunction);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261 DEFSUBR (Fdefun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 DEFSUBR (Fdefmacro);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 DEFSUBR (Fdefvar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 DEFSUBR (Fdefconst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265 DEFSUBR (Fuser_variable_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 DEFSUBR (Flet);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 DEFSUBR (FletX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5268 DEFSUBR (Fwhile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 DEFSUBR (Fmacroexpand_internal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270 DEFSUBR (Fcatch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271 DEFSUBR (Fthrow);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 DEFSUBR (Funwind_protect);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273 DEFSUBR (Fcondition_case);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274 DEFSUBR (Fcall_with_condition_handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 DEFSUBR (Fsignal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276 DEFSUBR (Finteractive_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 DEFSUBR (Fcommandp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278 DEFSUBR (Fcommand_execute);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279 DEFSUBR (Fautoload);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5280 DEFSUBR (Feval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5281 DEFSUBR (Fapply);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 DEFSUBR (Ffuncall);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 DEFSUBR (Ffunctionp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 DEFSUBR (Ffunction_min_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285 DEFSUBR (Ffunction_max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286 DEFSUBR (Frun_hooks);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5287 DEFSUBR (Frun_hook_with_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 DEFSUBR (Frun_hook_with_args_until_success);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 DEFSUBR (Frun_hook_with_args_until_failure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5290 DEFSUBR (Fbacktrace_debug);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5291 DEFSUBR (Fbacktrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 DEFSUBR (Fbacktrace_frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5293 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5295 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 reinit_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 specpdl_ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 specpdl_depth_counter = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 catchlist = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 Vcondition_handlers = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 backtrace_list = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305 lisp_eval_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 entering_debugger = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5307 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310 reinit_vars_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 preparing_for_armageddon = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 in_warnings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5314 Qunbound_suspended_errors_tag = make_opaque_ptr (&Qunbound_suspended_errors_tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315 staticpro_nodump (&Qunbound_suspended_errors_tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 specpdl_size = 50;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5318 specpdl = xnew_array (struct specbinding, specpdl_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5319 /* XEmacs change: increase these values. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5320 max_specpdl_size = 3000;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5321 max_lisp_eval_depth = 1000;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5322 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5323 throw_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5324 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328 vars_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330 reinit_vars_of_eval ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332 DEFVAR_INT ("max-specpdl-size", &max_specpdl_size /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333 Limit on number of Lisp variable bindings & unwind-protects before error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 DEFVAR_INT ("max-lisp-eval-depth", &max_lisp_eval_depth /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337 Limit on depth in `eval', `apply' and `funcall' before error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338 This limit is to catch infinite recursions for you before they cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5339 actual stack overflow in C, which would be fatal for Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340 You can safely make it considerably larger than its default value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5341 if that proves inconveniently small.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5342 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5344 DEFVAR_LISP ("quit-flag", &Vquit_flag /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5345 Non-nil causes `eval' to abort, unless `inhibit-quit' is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5346 Typing C-G sets `quit-flag' non-nil, regardless of `inhibit-quit'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5347 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5348 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5350 DEFVAR_LISP ("inhibit-quit", &Vinhibit_quit /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5351 Non-nil inhibits C-g quitting from happening immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5352 Note that `quit-flag' will still be set by typing C-g,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 so a quit will be signalled as soon as `inhibit-quit' is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 To prevent this happening, set `quit-flag' to nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5355 before making `inhibit-quit' nil. The value of `inhibit-quit' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5356 ignored if a critical quit is requested by typing control-shift-G in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5357 an X frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5358 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5359 Vinhibit_quit = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5361 DEFVAR_LISP ("stack-trace-on-error", &Vstack_trace_on_error /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5362 *Non-nil means automatically display a backtrace buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5363 after any error that is not handled by a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5364 If the value is a list, an error only means to display a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5366 See also variable `stack-trace-on-signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5367 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5368 Vstack_trace_on_error = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5370 DEFVAR_LISP ("stack-trace-on-signal", &Vstack_trace_on_signal /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5371 *Non-nil means automatically display a backtrace buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372 after any error that is signalled, whether or not it is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5373 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374 If the value is a list, an error only means to display a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5376 See also variable `stack-trace-on-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5377 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 Vstack_trace_on_signal = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 DEFVAR_LISP ("debug-ignored-errors", &Vdebug_ignored_errors /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 *List of errors for which the debugger should not be called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382 Each element may be a condition-name or a regexp that matches error messages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5383 If any element applies to a given error, that error skips the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 and just returns to top level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 This overrides the variable `debug-on-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 It does not apply to errors handled by `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5388 Vdebug_ignored_errors = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390 DEFVAR_LISP ("debug-on-error", &Vdebug_on_error /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 *Non-nil means enter debugger if an unhandled error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 The debugger will not be entered if the error is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 If the value is a list, an error only means to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5395 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396 This variable is overridden by `debug-ignored-errors'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397 See also variables `debug-on-quit' and `debug-on-signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399 Vdebug_on_error = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 DEFVAR_LISP ("debug-on-signal", &Vdebug_on_signal /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5402 *Non-nil means enter debugger if an error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403 The debugger will be entered whether or not the error is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 If the value is a list, an error only means to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 See also variable `debug-on-quit'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 Vdebug_on_signal = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411 DEFVAR_BOOL ("debug-on-quit", &debug_on_quit /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412 *Non-nil means enter debugger if quit is signalled (C-G, for example).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413 Does not apply if quit is handled by a `condition-case'. Entering the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 debugger can also be achieved at any time (for X11 console) by typing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 control-shift-G to signal a critical quit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417 debug_on_quit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 DEFVAR_BOOL ("debug-on-next-call", &debug_on_next_call /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 Non-nil means enter debugger before next `eval', `apply' or `funcall'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423 DEFVAR_LISP ("debugger", &Vdebugger /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 Function to call to invoke debugger.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425 If due to frame exit, args are `exit' and the value being returned;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426 this function's value will be returned instead of that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 If due to error, args are `error' and a list of the args to `signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428 If due to `apply' or `funcall' entry, one arg, `lambda'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 If due to `eval' entry, one arg, t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 Vdebugger = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 staticpro (&Vpending_warnings);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5434 Vpending_warnings = Qnil;
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
5435 dump_add_root_object (&Vpending_warnings_tail);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 Vpending_warnings_tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5438 staticpro (&Vautoload_queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5439 Vautoload_queue = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441 staticpro (&Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443 staticpro (&Vcurrent_warning_class);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 Vcurrent_warning_class = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446 staticpro (&Vcurrent_error_state);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 Vcurrent_error_state = Qnil; /* errors as normal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5449 reinit_eval ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5450 }