comparison src/bytecode-ops.h @ 4921:17362f371cc2

add more byte-code assertions and better failure output -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-02-03 Ben Wing <ben@xemacs.org> * alloc.c (Fmake_byte_code): * bytecode.h: * lisp.h: * lread.c: * lread.c (readevalloop): * lread.c (Fread): * lread.c (Fread_from_string): * lread.c (read_list_conser): * lread.c (read_list): * lread.c (vars_of_lread): * symbols.c: * symbols.c (Fdefine_function): Turn on the "compiled-function annotation hack". Implement it properly by hooking into Fdefalias(). Note in the docstring to `defalias' that we do this. Remove some old broken code and change code that implemented the old kludgy way of hooking into the Lisp reader into bracketed by `#ifdef COMPILED_FUNCTION_ANNOTATION_HACK_OLD_WAY', which is not enabled. Also enable byte-code metering when DEBUG_XEMACS -- this is a form of profiling for computing histograms of which sequences of two bytecodes are used most often. * bytecode-ops.h: * bytecode-ops.h (OPCODE): New file. Extract out all the opcodes and declare them using OPCODE(), a bit like frame slots and such. This way the file can be included multiple times if necessary to iterate multiple times over the byte opcodes. * bytecode.c: * bytecode.c (NUM_REMEMBERED_BYTE_OPS): * bytecode.c (OPCODE): * bytecode.c (assert_failed_with_remembered_ops): * bytecode.c (READ_UINT_2): * bytecode.c (READ_INT_1): * bytecode.c (READ_INT_2): * bytecode.c (PEEK_INT_1): * bytecode.c (PEEK_INT_2): * bytecode.c (JUMP_RELATIVE): * bytecode.c (JUMP_NEXT): * bytecode.c (PUSH): * bytecode.c (POP_WITH_MULTIPLE_VALUES): * bytecode.c (DISCARD): * bytecode.c (UNUSED): * bytecode.c (optimize_byte_code): * bytecode.c (optimize_compiled_function): * bytecode.c (Fbyte_code): * bytecode.c (vars_of_bytecode): * bytecode.c (init_opcode_table_multi_op): * bytecode.c (reinit_vars_of_bytecode): * emacs.c (main_1): * eval.c (funcall_compiled_function): * symsinit.h: Any time we change either the instruction pointer or the stack pointer, assert that we're going to move it to a valid location. This should catch failures right when they occur rather than sometime later. This requires that we pass in another couple of parameters into some functions (only with error-checking enabled, see below). Also keep track, using a circular queue, of the last 100 byte opcodes seen, and when we hit an assert failure during byte-code execution, output the contents of the queue in a nice readable fashion. This requires that bytecode-ops.h be included a second time so that a table mapping opcodes to the name of their operation can be constructed. This table is constructed in new function reinit_vars_of_bytecode(). Everything in the last two paras happens only when ERROR_CHECK_BYTE_CODE. Add some longish comments describing how the arrays that hold the stack and instructions, and the pointers used to access them, work. * gc.c: Import some code from my `latest-fix' workspace to mark the staticpro's in order from lowest to highest, rather than highest to lowest, so it's easier to debug when something goes wrong. * lisp.h (abort_with_message): Renamed from abort_with_msg(). * symbols.c (defsymbol_massage_name_1): * symbols.c (defsymbol_nodump): * symbols.c (defsymbol): * symbols.c (defkeyword): * symeval.h (DEFVAR_SYMVAL_FWD_OBJECT): Make the various calls to staticpro() instead call staticpro_1(), passing in the name of the C var being staticpro'ed, so that it shows up in staticpro_names. Otherwise staticpro_names just has 1000+ copies of the word `location'.
author Ben Wing <ben@xemacs.org>
date Wed, 03 Feb 2010 08:01:55 -0600
parents
children 99f8ebc082d9
comparison
equal deleted inserted replaced
4914:1628e3b9601a 4921:17362f371cc2
1 /* Execution of byte code produced by bytecomp.el.
2 Implementation of compiled-function objects.
3 Copyright (C) 1992, 1993 Free Software Foundation, Inc.
4 Copyright (C) 1995, 2002, 2010 Ben Wing.
5
6 This file is part of XEmacs.
7
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* Synched up with: Mule 2.0, FSF 19.30. */
24
25 /* There is more than one place in bytecode.c that may want to do something
26 with the list of all the opcodes. To handle this, we extract them into
27 a separate file that can get included after defining OPCODE(sym, val)
28 appropriately. No need to undefine OPCODE; that happens automatically.
29 */
30
31 OPCODE (varref, 010)
32 OPCODE (varset, 020)
33 OPCODE (varbind, 030)
34 OPCODE (call, 040)
35 OPCODE (unbind, 050)
36
37 OPCODE (nth, 070)
38 OPCODE (symbolp, 071)
39 OPCODE (consp, 072)
40 OPCODE (stringp, 073)
41 OPCODE (listp, 074)
42 OPCODE (old_eq, 075)
43 OPCODE (old_memq, 076)
44 OPCODE (not, 077)
45 OPCODE (car, 0100)
46 OPCODE (cdr, 0101)
47 OPCODE (cons, 0102)
48 OPCODE (list1, 0103)
49 OPCODE (list2, 0104)
50 OPCODE (list3, 0105)
51 OPCODE (list4, 0106)
52 OPCODE (length, 0107)
53 OPCODE (aref, 0110)
54 OPCODE (aset, 0111)
55 OPCODE (symbol_value, 0112)
56 OPCODE (symbol_function, 0113)
57 OPCODE (set, 0114)
58 OPCODE (fset, 0115)
59 OPCODE (get, 0116)
60 OPCODE (substring, 0117)
61 OPCODE (concat2, 0120)
62 OPCODE (concat3, 0121)
63 OPCODE (concat4, 0122)
64 OPCODE (sub1, 0123)
65 OPCODE (add1, 0124)
66 OPCODE (eqlsign, 0125)
67 OPCODE (gtr, 0126)
68 OPCODE (lss, 0127)
69 OPCODE (leq, 0130)
70 OPCODE (geq, 0131)
71 OPCODE (diff, 0132)
72 OPCODE (negate, 0133)
73 OPCODE (plus, 0134)
74 OPCODE (max, 0135)
75 OPCODE (min, 0136)
76 OPCODE (mult, 0137)
77
78 OPCODE (point, 0140)
79 OPCODE (eq, 0141) /* was Bmark, but no longer
80 generated as of v18 */
81 OPCODE (goto_char, 0142)
82 OPCODE (insert, 0143)
83 OPCODE (point_max, 0144)
84 OPCODE (point_min, 0145)
85 OPCODE (char_after, 0146)
86 OPCODE (following_char, 0147)
87 OPCODE (preceding_char, 0150)
88 OPCODE (current_column, 0151)
89 OPCODE (indent_to, 0152)
90 OPCODE (equal, 0153) /* was Bscan_buffer, but no
91 longer generated as of
92 v18 */
93 OPCODE (eolp, 0154)
94 OPCODE (eobp, 0155)
95 OPCODE (bolp, 0156)
96 OPCODE (bobp, 0157)
97 OPCODE (current_buffer, 0160)
98 OPCODE (set_buffer, 0161)
99 OPCODE (save_current_buffer, 0162) /* was Bread_char, but no
100 longer generated as of
101 v19 */
102 OPCODE (memq, 0163) /* was Bset_mark, but no
103 longer generated as of
104 v18 */
105 OPCODE (interactive_p, 0164) /* Needed since interactive-p
106 takes unevalled args */
107 OPCODE (forward_char, 0165)
108 OPCODE (forward_word, 0166)
109 OPCODE (skip_chars_forward, 0167)
110 OPCODE (skip_chars_backward, 0170)
111 OPCODE (forward_line, 0171)
112 OPCODE (char_syntax, 0172)
113 OPCODE (buffer_substring, 0173)
114 OPCODE (delete_region, 0174)
115 OPCODE (narrow_to_region, 0175)
116 OPCODE (widen, 0176)
117 OPCODE (end_of_line, 0177)
118
119 OPCODE (constant2, 0201)
120 OPCODE (goto, 0202)
121 OPCODE (gotoifnil, 0203)
122 OPCODE (gotoifnonnil, 0204)
123 OPCODE (gotoifnilelsepop, 0205)
124 OPCODE (gotoifnonnilelsepop, 0206)
125 OPCODE (return, 0207)
126 OPCODE (discard, 0210)
127 OPCODE (dup, 0211)
128
129 OPCODE (save_excursion, 0212)
130 OPCODE (save_window_excursion, 0213)
131 OPCODE (save_restriction, 0214)
132 OPCODE (catch, 0215)
133
134 OPCODE (unwind_protect, 0216)
135 OPCODE (condition_case, 0217)
136 OPCODE (temp_output_buffer_setup, 0220)
137 OPCODE (temp_output_buffer_show, 0221)
138
139 OPCODE (unbind_all, 0222)
140
141 OPCODE (set_marker, 0223)
142 OPCODE (match_beginning, 0224)
143 OPCODE (match_end, 0225)
144 OPCODE (upcase, 0226)
145 OPCODE (downcase, 0227)
146
147 OPCODE (string_equal, 0230)
148 OPCODE (string_lessp, 0231)
149 OPCODE (old_equal, 0232)
150 OPCODE (nthcdr, 0233)
151 OPCODE (elt, 0234)
152 OPCODE (old_member, 0235)
153 OPCODE (old_assq, 0236)
154 OPCODE (nreverse, 0237)
155 OPCODE (setcar, 0240)
156 OPCODE (setcdr, 0241)
157 OPCODE (car_safe, 0242)
158 OPCODE (cdr_safe, 0243)
159 OPCODE (nconc, 0244)
160 OPCODE (quo, 0245)
161 OPCODE (rem, 0246)
162 OPCODE (numberp, 0247)
163 OPCODE (fixnump, 0250) /* Was Bintegerp. */
164
165 OPCODE (Rgoto, 0252)
166 OPCODE (Rgotoifnil, 0253)
167 OPCODE (Rgotoifnonnil, 0254)
168 OPCODE (Rgotoifnilelsepop, 0255)
169 OPCODE (Rgotoifnonnilelsepop, 0256)
170
171 OPCODE (listN, 0257)
172 OPCODE (concatN, 0260)
173 OPCODE (insertN, 0261)
174
175 OPCODE (bind_multiple_value_limits, 0262) /* New in 21.5. */
176 OPCODE (multiple_value_list_internal, 0263) /* New in 21.5. */
177 OPCODE (multiple_value_call, 0264) /* New in 21.5. */
178 OPCODE (throw, 0265) /* New in 21.5. */
179
180 OPCODE (member, 0266) /* new in v20 */
181 OPCODE (assq, 0267) /* new in v20 */
182
183 OPCODE (constant, 0300)
184
185 #undef OPCODE