annotate src/backtrace.h @ 5697:40fbceabaafd

menubar-items.el (default-menubar): Reorganize. Add PROBLEMS to toplevel. New "More about XEmacs" submenu for NEWS, licensing, etc. New "Recent History" menu for messages, lossage, etc. Get rid of ugly and unexpressive ellipses.
author Stephen J. Turnbull <stephen@xemacs.org>
date Mon, 24 Dec 2012 03:08:33 +0900
parents 308d34e9f07d
children
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 /* The lisp stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
3 Copyright (C) 2002, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2532
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2532
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2532
diff changeset
10 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 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
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2532
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 /* Synched up with: FSF 19.30. Contained redundantly in various C files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 in FSFmacs. */
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 /* Authorship:
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 FSF: Original version; a long time ago.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 XEmacs: split out of some C files. (For some obscure reason, a header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 file couldn't be used in FSF Emacs, but XEmacs doesn't have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 that problem.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 Mly (probably) or JWZ: Some changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
32 #ifndef INCLUDED_backtrace_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
33 #define INCLUDED_backtrace_h_
428
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 #include <setjmp.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
37 #ifdef ERROR_CHECK_CATCH
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
38 /* you can use this if you are trying to debug corruption in the
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
39 catchlist */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
40 void check_catchlist_sanity (void);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
41
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
42 /* you can use this if you are trying to debug corruption in the specbind
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
43 stack */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
44 void check_specbind_stack_sanity (void);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
45 #else
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
46 #define check_catchlist_sanity()
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
47 #define check_specbind_stack_sanity()
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
48 #endif
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
49
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 /* These definitions are used in eval.c and alloc.c */
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 struct backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 struct backtrace *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Lisp_Object *function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Lisp_Object *args; /* Points to vector of args. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 int nargs; /* Length of vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 If nargs is UNEVALLED, args points to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 slot holding list of unevalled args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 int pdlcount; /* specpdl_depth () when invoked */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 char evalargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 /* Nonzero means call value of debugger when done with this operation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 char debug_on_exit;
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
64
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
65 /* All the rest is information for the use of the profiler. The only
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
66 thing that eval.c does is set the first value to 0 so that it can
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
67 be relied upon. */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
68
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
69 /* ----------------------------------------------------------------- */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
70
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
71 /* 0 = profiling not turned on when function called.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
72 Since profiling can be turned on and off dynamically, we can't
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
73 always count on having info recorded when a function was called
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
74 and need to take evasive action if necessary.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
75 1 = profiling turned on but function not yet actually called. Lots of
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
76 stuff can happen between when a function is pushed onto the
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
77 backtrace list and when it's actually called (e.g. evalling its
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
78 arguments, autoloading, etc.). For greater accuracy we don't
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
79 treat the preamble stuff as part of the function itself.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
80 2 = profiling turned on, function called.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
81 */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
82 char function_being_called;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
83 /* The trick here is handling recursive functions and dealing with the
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
84 dynamicity of in-profile/not-in-profile. I used to just use a bunch
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
85 of hash tables for all info but that fails in the presence of
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
86 recursive functions because they can modify values out from under
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
87 you. The algorithm here is that we record the total_ticks and
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
88 total_consing, as well as the current values of `total-timing' and
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
89 `total-gc-usage' for the OBJ -- that's because recursive functions,
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
90 which get called later and exit early, will go ahead and modify the
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
91 `total-timing' and `total-gc-usage' for the fun, even though it's
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
92 not "correct" because the outer function is still running. However,
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
93 if we ask for profiling info at this point, at least we're getting
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
94 SOME info.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
95
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
96 So ... On entry, we record these four values. On exit, we compute
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
97 an offset from the recorded value to the current value and then
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
98 store it into the appropriate hash table entry, using the recorded
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
99 value in the entry rather than the actual one. (Inner recursive
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
100 functions may have added their own values to the total-counts, and
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
101 we want to subsume them, not add to them.)
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
102
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
103 #### Also we need to go through the backtrace list during
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
104 stop-profiling and record values, just like for unwind_to. */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
105 EMACS_INT current_total_timing_val;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
106 EMACS_INT current_total_gc_usage_val;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
107 EMACS_UINT total_ticks_at_start;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
108 EMACS_UINT total_consing_at_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 /* This structure helps implement the `catch' and `throw' control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 structure. A struct catchtag contains all the information needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 to restore the state of the interpreter after a non-local jump.
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
114 (No information is stored concerning how to restore the state of
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
115 the condition-handler list; this is handled implicitly through
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
116 an unwind-protect. unwind-protects are on the specbind stack,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
117 which is reset to its proper value by `throw'. In the process of
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
118 that, any intervening bindings are reset and unwind-protects called,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
119 which fixes up the condition-handler list.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 catchtag structures are chained together in the C calling stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 the `next' member points to the next outer catchtag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 A call like (throw TAG VAL) searches for a catchtag whose `tag'
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
125 member is TAG, and then unbinds to it. A value of Vcatch_everything_tag
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
126 for the `tag' member of a catchtag is special and means "catch all throws,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
127 regardless of the tag". This is used internally by the C code. The `val'
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
128 member is used to hold VAL while the stack is unwound; `val' is returned
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
129 as the value of the catch form. The `actual_tag' member holds the value
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
130 of TAG as passed to throw, so that it can be retrieved when catches with
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
131 Vcatch_everything_tag are set up.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 All the other members are concerned with restoring the interpreter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 state. */
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 struct catchtag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 Lisp_Object tag;
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
139 /* Stores the actual tag used in `throw'; the same as TAG, unless
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
140 TAG is Vcatch_everything_tag. */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
141 Lisp_Object actual_tag;
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 1292
diff changeset
142 /* A backtrace prior to the throw, used with Vcatch_everything_tag. */
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 1292
diff changeset
143 Lisp_Object backtrace;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 struct catchtag *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 struct gcpro *gcpro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 JMP_BUF jmp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 struct backtrace *backlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 #if 0 /* FSFmacs */
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
150 /* FSF uses a separate handler stack to hold condition-cases,
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
151 where we use Vcondition_handlers. We should switch to their
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
152 system becaue it avoids the need to mess around with consing
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
153 up stuff and then dangerously freeing it. See comment in
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
154 condition_case_unwind(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 struct handler *handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 int lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 int pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 /* This is the equivalent of async_timer_suppress_count.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 We probably don't have to bother with this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 int poll_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 #endif
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 /* Dynamic-binding-o-rama */
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 /* Structure for recording Lisp call stack for backtrace purposes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 /* The special binding stack holds the outer values of variables while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 they are bound by a function application or a let form, stores the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 code to be executed for Lisp unwind-protect forms, and stores the C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 functions to be called for record_unwind_protect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 If func is non-zero, undoing this binding applies func to old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 This implements record_unwind_protect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 If func is zero and symbol is nil, undoing this binding evaluates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 the list of forms in old_value; this implements Lisp's unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 Otherwise, undoing this binding stores old_value as symbol's value; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 undoes the bindings made by a let form or function call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 struct specbinding
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 Lisp_Object symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 Lisp_Object old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 Lisp_Object (*func) (Lisp_Object); /* for unwind-protect */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 /* Everything needed to describe an active condition case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 struct handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 /* The handler clauses and variable from the condition-case form. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 Lisp_Object handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 Lisp_Object var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 /* Fsignal stores here the condition-case clause that applies,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 and Fcondition_case thus knows which clause to run. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 Lisp_Object chosen_clause;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 /* Used to effect the longjmp() out to the handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 struct catchtag *tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 /* The next enclosing handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 struct handler *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 extern struct handler *handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* These are extern because GC needs to mark them */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 extern struct specbinding *specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 extern struct specbinding *specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 extern struct catchtag *catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 extern struct backtrace *backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
219 /* Most callers should simply use specbind() and unbind_to_1(), but if
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 speed is REALLY IMPORTANT, you can use the faster macros below */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 void specbind_magic (Lisp_Object, Lisp_Object);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
222 void grow_specpdl (EMACS_INT reserved);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 void unbind_to_hairy (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 extern int specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 /* Inline version of specbind().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 Use this instead of specbind() if speed is sufficiently important
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 to save the overhead of even a single function call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #define SPECBIND(symbol_object, value_object) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 Lisp_Object SB_symbol = (symbol_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 Lisp_Object SB_newval = (value_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 Lisp_Object SB_oldval; \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
233 Lisp_Symbol *SB_sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 SPECPDL_RESERVE (1); \
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 CHECK_SYMBOL (SB_symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 SB_sym = XSYMBOL (SB_symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 SB_oldval = SB_sym->value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 if (!SYMBOL_VALUE_MAGIC_P (SB_oldval) || UNBOUNDP (SB_oldval)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
243 /* #### the following test will go away when we have a constant \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 symbol magic object */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 if (EQ (SB_symbol, Qnil) || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 EQ (SB_symbol, Qt) || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 SYMBOL_IS_KEYWORD (SB_symbol)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 reject_constant_symbols (SB_symbol, SB_newval, 0, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 UNBOUNDP (SB_newval) ? \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 Qmakunbound : Qset); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 specpdl_ptr->symbol = SB_symbol; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 specpdl_ptr->old_value = SB_oldval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 specpdl_ptr->func = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 specpdl_ptr++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 specpdl_depth_counter++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 SB_sym->value = (SB_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 specbind_magic (SB_symbol, SB_newval); \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
262 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 /* An even faster, but less safe inline version of specbind().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 - SYMBOL is a non-constant symbol (i.e. not Qnil, Qt, or keyword).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 - specpdl_depth_counter >= specpdl_size.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 #define SPECBIND_FAST_UNSAFE(symbol_object, value_object) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 Lisp_Object SFU_symbol = (symbol_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 Lisp_Object SFU_newval = (value_object); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
273 Lisp_Symbol *SFU_sym = XSYMBOL (SFU_symbol); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 Lisp_Object SFU_oldval = SFU_sym->value; \
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
275 /* Most of the time, will be previously unbound. #### With a bit of \
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
276 rearranging, this could be reduced to only one check. */ \
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
277 if (UNBOUNDP (SFU_oldval) || !SYMBOL_VALUE_MAGIC_P (SFU_oldval)) \
428
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 specpdl_ptr->symbol = SFU_symbol; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 specpdl_ptr->old_value = SFU_oldval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 specpdl_ptr->func = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 specpdl_ptr++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 specpdl_depth_counter++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 SFU_sym->value = (SFU_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 specbind_magic (SFU_symbol, SFU_newval); \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
289 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 /* Request enough room for SIZE future entries on special binding stack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 #define SPECPDL_RESERVE(size) do { \
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
293 EMACS_INT SR_size = (size); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 if (specpdl_depth() + SR_size >= specpdl_size) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 grow_specpdl (SR_size); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
298 /* Inline version of unbind_to_1().
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
299 [[Use this instead of unbind_to_1() if speed is sufficiently important
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
300 to save the overhead of even a single function call.]]
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
301 This is bogus pseudo-optimization. --ben
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
303 Most of the time, unbind_to_1() is called only on ordinary
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 variables, so optimize for that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 #define UNBIND_TO_GCPRO(count, value) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
309 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 --specpdl_depth_counter; \
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 if (specpdl_ptr->func != 0 || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 ((sym = XSYMBOL (specpdl_ptr->symbol)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 SYMBOL_VALUE_MAGIC_P (sym->value))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 struct gcpro gcpro1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 GCPRO1 (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 UNGCPRO; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 } \
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 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 } \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
326 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
329 /* A slightly faster inline version of unbind_to_1,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 that doesn't offer GCPROing services. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 #define UNBIND_TO(count) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
335 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 --specpdl_depth_counter; \
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 if (specpdl_ptr->func != 0 || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 ((sym = XSYMBOL (specpdl_ptr->symbol)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 SYMBOL_VALUE_MAGIC_P (sym->value))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 } \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
349 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 } while (0)
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 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 /* Unused. It's too hard to guarantee that the current bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 contain only variables. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
355 /* Another inline version of unbind_to_1(). VALUE is GC-protected.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 - all of the elements on the binding stack are variable bindings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 #define UNBIND_TO_GCPRO_VARIABLES_ONLY(count, value) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
363 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 --specpdl_depth_counter; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 sym = XSYMBOL (specpdl_ptr->symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 if (!SYMBOL_VALUE_MAGIC_P (sym->value)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 struct gcpro gcpro1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 GCPRO1 (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 UNGCPRO; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 } \
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 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 #endif /* unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 /* A faster, but less safe inline version of Fset().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 - SYMBOL is a non-constant symbol (i.e. not Qnil, Qt, or keyword).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 #define FSET_FAST_UNSAFE(sym, newval) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 Lisp_Object FFU_sym = (sym); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 Lisp_Object FFU_newval = (newval); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
389 Lisp_Symbol *FFU_symbol = XSYMBOL (FFU_sym); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Lisp_Object FFU_oldval = FFU_symbol->value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 if (!SYMBOL_VALUE_MAGIC_P (FFU_oldval) || UNBOUNDP (FFU_oldval)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 FFU_symbol->value = FFU_newval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 Fset (FFU_sym, FFU_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
397 /* Note: you must always fill in all of the fields in a backtrace structure
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
398 before pushing them on the backtrace_list. The profiling code depends
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
399 on this. */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
400
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
401 #define PUSH_BACKTRACE(bt) do { \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
402 (bt).next = backtrace_list; \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
403 backtrace_list = &(bt); \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
404 } while (0)
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
405
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
406 #define POP_BACKTRACE(bt) do { \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
407 backtrace_list = (bt).next; \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
408 } while (0)
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
409
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
410 #endif /* INCLUDED_backtrace_h_ */