annotate src/backtrace.h @ 5167:e374ea766cc1

clean up, rearrange allocation statistics code -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-03-21 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (assert_proper_sizing): * alloc.c (c_readonly): * alloc.c (malloced_storage_size): * alloc.c (fixed_type_block_overhead): * alloc.c (lisp_object_storage_size): * alloc.c (inc_lrecord_stats): * alloc.c (dec_lrecord_stats): * alloc.c (pluralize_word): * alloc.c (object_memory_usage_stats): * alloc.c (Fobject_memory_usage): * alloc.c (compute_memusage_stats_length): * alloc.c (disksave_object_finalization_1): * alloc.c (Fgarbage_collect): * mc-alloc.c: * mc-alloc.c (mc_alloced_storage_size): * mc-alloc.h: No functionality change here. Collect the allocations-statistics code that was scattered throughout alloc.c into one place. Add remaining section headings so that all sections have headings clearly identifying the start of the section and its purpose. Expose mc_alloced_storage_size() even when not MEMORY_USAGE_STATS; this fixes build problems and is related to the export of lisp_object_storage_size() and malloced_storage_size() when non-MEMORY_USAGE_STATS in the previous change set.
author Ben Wing <ben@xemacs.org>
date Sun, 21 Mar 2010 04:41:49 -0500
parents 989a7680c221
children 308d34e9f07d
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: FSF 19.30. Contained redundantly in various C files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 in FSFmacs. */
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 /* Authorship:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 FSF: Original version; a long time ago.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 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
29 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
30 that problem.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 Mly (probably) or JWZ: Some changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
34 #ifndef INCLUDED_backtrace_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
35 #define INCLUDED_backtrace_h_
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include <setjmp.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
39 #ifdef ERROR_CHECK_CATCH
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
40 /* 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
41 catchlist */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
42 void check_catchlist_sanity (void);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
43
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
44 /* 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
45 stack */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
46 void check_specbind_stack_sanity (void);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
47 #else
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
48 #define check_catchlist_sanity()
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
49 #define check_specbind_stack_sanity()
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
50 #endif
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
51
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* These definitions are used in eval.c and alloc.c */
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
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 struct backtrace *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object *function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Lisp_Object *args; /* Points to vector of args. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 int nargs; /* Length of vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 If nargs is UNEVALLED, args points to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 slot holding list of unevalled args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 int pdlcount; /* specpdl_depth () when invoked */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 char evalargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /* Nonzero means call value of debugger when done with this operation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 char debug_on_exit;
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
66
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
67 /* 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
68 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
69 be relied upon. */
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 /* ----------------------------------------------------------------- */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
72
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
73 /* 0 = profiling not turned on when function called.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
74 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
75 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
76 and need to take evasive action if necessary.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
77 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
78 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
79 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
80 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
81 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
82 2 = profiling turned on, function called.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
83 */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
84 char function_being_called;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
85 /* 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
86 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
87 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
88 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
89 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
90 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
91 `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
92 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
93 `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
94 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
95 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
96 SOME info.
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
97
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
98 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
99 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
100 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
101 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
102 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
103 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
104
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
105 #### 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
106 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
107 EMACS_INT current_total_timing_val;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
108 EMACS_INT current_total_gc_usage_val;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
109 EMACS_UINT total_ticks_at_start;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
110 EMACS_UINT total_consing_at_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 /* This structure helps implement the `catch' and `throw' control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 structure. A struct catchtag contains all the information needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 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
116 (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
117 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
118 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
119 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
120 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
121 which fixes up the condition-handler list.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 catchtag structures are chained together in the C calling stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 the `next' member points to the next outer catchtag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 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
127 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
128 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
129 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
130 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
131 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
132 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
133 Vcatch_everything_tag are set up.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 All the other members are concerned with restoring the interpreter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 state. */
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 struct catchtag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Lisp_Object tag;
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
141 /* 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
142 TAG is Vcatch_everything_tag. */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
143 Lisp_Object actual_tag;
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 1292
diff changeset
144 /* 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
145 Lisp_Object backtrace;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 struct catchtag *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 struct gcpro *gcpro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 JMP_BUF jmp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 struct backtrace *backlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 #if 0 /* FSFmacs */
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 440
diff changeset
152 /* 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
153 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
154 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
155 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
156 condition_case_unwind(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 struct handler *handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 int lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 int pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* This is the equivalent of async_timer_suppress_count.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 We probably don't have to bother with this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 int poll_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 };
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 /* Dynamic-binding-o-rama */
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 /* Structure for recording Lisp call stack for backtrace purposes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 /* The special binding stack holds the outer values of variables while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 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
174 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
175 functions to be called for record_unwind_protect.
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 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
178 This implements record_unwind_protect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 If func is zero and symbol is nil, undoing this binding evaluates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 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
181 form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 Otherwise, undoing this binding stores old_value as symbol's value; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 undoes the bindings made by a let form or function call. */
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 struct specbinding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 Lisp_Object symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 Lisp_Object old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 Lisp_Object (*func) (Lisp_Object); /* for unwind-protect */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 };
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 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 /* Everything needed to describe an active condition case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 struct handler
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 /* The handler clauses and variable from the condition-case form. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 Lisp_Object handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 Lisp_Object var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 /* Fsignal stores here the condition-case clause that applies,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 and Fcondition_case thus knows which clause to run. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 Lisp_Object chosen_clause;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 /* Used to effect the longjmp() out to the handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 struct catchtag *tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* The next enclosing handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 struct handler *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 };
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 extern struct handler *handlerlist;
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 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /* These are extern because GC needs to mark them */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 extern struct specbinding *specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 extern struct specbinding *specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 extern struct catchtag *catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 extern struct backtrace *backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
221 /* 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
222 speed is REALLY IMPORTANT, you can use the faster macros below */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 void specbind_magic (Lisp_Object, Lisp_Object);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
224 void grow_specpdl (EMACS_INT reserved);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 void unbind_to_hairy (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 extern int specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 /* Inline version of specbind().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 Use this instead of specbind() if speed is sufficiently important
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 to save the overhead of even a single function call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #define SPECBIND(symbol_object, value_object) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 Lisp_Object SB_symbol = (symbol_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 Lisp_Object SB_newval = (value_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 Lisp_Object SB_oldval; \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
235 Lisp_Symbol *SB_sym; \
428
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 SPECPDL_RESERVE (1); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 CHECK_SYMBOL (SB_symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 SB_sym = XSYMBOL (SB_symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 SB_oldval = SB_sym->value; \
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 if (!SYMBOL_VALUE_MAGIC_P (SB_oldval) || UNBOUNDP (SB_oldval)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
245 /* #### the following test will go away when we have a constant \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 symbol magic object */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 if (EQ (SB_symbol, Qnil) || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 EQ (SB_symbol, Qt) || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 SYMBOL_IS_KEYWORD (SB_symbol)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 reject_constant_symbols (SB_symbol, SB_newval, 0, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 UNBOUNDP (SB_newval) ? \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 Qmakunbound : Qset); \
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 specpdl_ptr->symbol = SB_symbol; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 specpdl_ptr->old_value = SB_oldval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 specpdl_ptr->func = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 specpdl_ptr++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 specpdl_depth_counter++; \
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 SB_sym->value = (SB_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 specbind_magic (SB_symbol, SB_newval); \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
264 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 /* An even faster, but less safe inline version of specbind().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 - 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
270 - specpdl_depth_counter >= specpdl_size.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 #define SPECBIND_FAST_UNSAFE(symbol_object, value_object) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 Lisp_Object SFU_symbol = (symbol_object); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 Lisp_Object SFU_newval = (value_object); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
275 Lisp_Symbol *SFU_sym = XSYMBOL (SFU_symbol); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 Lisp_Object SFU_oldval = SFU_sym->value; \
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
277 /* 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
278 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
279 if (UNBOUNDP (SFU_oldval) || !SYMBOL_VALUE_MAGIC_P (SFU_oldval)) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 specpdl_ptr->symbol = SFU_symbol; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 specpdl_ptr->old_value = SFU_oldval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 specpdl_ptr->func = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 specpdl_ptr++; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 specpdl_depth_counter++; \
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 SFU_sym->value = (SFU_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 specbind_magic (SFU_symbol, SFU_newval); \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
291 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 /* Request enough room for SIZE future entries on special binding stack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 #define SPECPDL_RESERVE(size) do { \
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
295 EMACS_INT SR_size = (size); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 if (specpdl_depth() + SR_size >= specpdl_size) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 grow_specpdl (SR_size); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
300 /* Inline version of unbind_to_1().
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
301 [[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
302 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
303 This is bogus pseudo-optimization. --ben
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
305 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
306 variables, so optimize for that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 #define UNBIND_TO_GCPRO(count, value) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
311 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 --specpdl_depth_counter; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 if (specpdl_ptr->func != 0 || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 ((sym = XSYMBOL (specpdl_ptr->symbol)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 SYMBOL_VALUE_MAGIC_P (sym->value))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 struct gcpro gcpro1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 GCPRO1 (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 UNGCPRO; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 break; \
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 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 } \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
328 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
331 /* A slightly faster inline version of unbind_to_1,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 that doesn't offer GCPROing services. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 #define UNBIND_TO(count) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
337 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 --specpdl_depth_counter; \
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 if (specpdl_ptr->func != 0 || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 ((sym = XSYMBOL (specpdl_ptr->symbol)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 SYMBOL_VALUE_MAGIC_P (sym->value))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 } \
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 814
diff changeset
351 check_specbind_stack_sanity (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 /* Unused. It's too hard to guarantee that the current bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 contain only variables. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 647
diff changeset
357 /* Another inline version of unbind_to_1(). VALUE is GC-protected.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 - all of the elements on the binding stack are variable bindings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 #define UNBIND_TO_GCPRO_VARIABLES_ONLY(count, value) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 int UNBIND_TO_count = (count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 while (specpdl_depth_counter != UNBIND_TO_count) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 { \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
365 Lisp_Symbol *sym; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 --specpdl_ptr; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 --specpdl_depth_counter; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 sym = XSYMBOL (specpdl_ptr->symbol); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 if (!SYMBOL_VALUE_MAGIC_P (sym->value)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 sym->value = specpdl_ptr->old_value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 struct gcpro gcpro1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 GCPRO1 (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 unbind_to_hairy (UNBIND_TO_count); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 UNGCPRO; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 #endif /* unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 /* A faster, but less safe inline version of Fset().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 Caller guarantees that:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 - 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
387 Else we crash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 #define FSET_FAST_UNSAFE(sym, newval) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 Lisp_Object FFU_sym = (sym); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Lisp_Object FFU_newval = (newval); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
391 Lisp_Symbol *FFU_symbol = XSYMBOL (FFU_sym); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 Lisp_Object FFU_oldval = FFU_symbol->value; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 if (!SYMBOL_VALUE_MAGIC_P (FFU_oldval) || UNBOUNDP (FFU_oldval)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 FFU_symbol->value = FFU_newval; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 Fset (FFU_sym, FFU_newval); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
399 /* 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
400 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
401 on this. */
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
402
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
403 #define PUSH_BACKTRACE(bt) do { \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
404 (bt).next = backtrace_list; \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
405 backtrace_list = &(bt); \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
406 } while (0)
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
407
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
408 #define POP_BACKTRACE(bt) do { \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
409 backtrace_list = (bt).next; \
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
410 } while (0)
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 853
diff changeset
411
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
412 #endif /* INCLUDED_backtrace_h_ */