1 /*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 2.00 of the Zend license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.zend.com/license/2_00.txt. |
11 | If you did not receive a copy of the Zend license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@zend.com so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Andi Gutmans <andi@php.net> |
16 | Zeev Suraski <zeev@php.net> |
17 | Dmitry Stogov <dmitry@php.net> |
18 +----------------------------------------------------------------------+
19 */
20
21 #include <stdio.h>
22 #include <zend.h>
23 #include <zend_vm_opcodes.h>
24
25 static const char *zend_vm_opcodes_names[195] = {
26 "ZEND_NOP",
27 "ZEND_ADD",
28 "ZEND_SUB",
29 "ZEND_MUL",
30 "ZEND_DIV",
31 "ZEND_MOD",
32 "ZEND_SL",
33 "ZEND_SR",
34 "ZEND_CONCAT",
35 "ZEND_BW_OR",
36 "ZEND_BW_AND",
37 "ZEND_BW_XOR",
38 "ZEND_POW",
39 "ZEND_BW_NOT",
40 "ZEND_BOOL_NOT",
41 "ZEND_BOOL_XOR",
42 "ZEND_IS_IDENTICAL",
43 "ZEND_IS_NOT_IDENTICAL",
44 "ZEND_IS_EQUAL",
45 "ZEND_IS_NOT_EQUAL",
46 "ZEND_IS_SMALLER",
47 "ZEND_IS_SMALLER_OR_EQUAL",
48 "ZEND_ASSIGN",
49 "ZEND_ASSIGN_DIM",
50 "ZEND_ASSIGN_OBJ",
51 "ZEND_ASSIGN_STATIC_PROP",
52 "ZEND_ASSIGN_OP",
53 "ZEND_ASSIGN_DIM_OP",
54 "ZEND_ASSIGN_OBJ_OP",
55 "ZEND_ASSIGN_STATIC_PROP_OP",
56 "ZEND_ASSIGN_REF",
57 "ZEND_QM_ASSIGN",
58 "ZEND_ASSIGN_OBJ_REF",
59 "ZEND_ASSIGN_STATIC_PROP_REF",
60 "ZEND_PRE_INC",
61 "ZEND_PRE_DEC",
62 "ZEND_POST_INC",
63 "ZEND_POST_DEC",
64 "ZEND_PRE_INC_STATIC_PROP",
65 "ZEND_PRE_DEC_STATIC_PROP",
66 "ZEND_POST_INC_STATIC_PROP",
67 "ZEND_POST_DEC_STATIC_PROP",
68 "ZEND_JMP",
69 "ZEND_JMPZ",
70 "ZEND_JMPNZ",
71 "ZEND_JMPZNZ",
72 "ZEND_JMPZ_EX",
73 "ZEND_JMPNZ_EX",
74 "ZEND_CASE",
75 "ZEND_CHECK_VAR",
76 "ZEND_SEND_VAR_NO_REF_EX",
77 "ZEND_CAST",
78 "ZEND_BOOL",
79 "ZEND_FAST_CONCAT",
80 "ZEND_ROPE_INIT",
81 "ZEND_ROPE_ADD",
82 "ZEND_ROPE_END",
83 "ZEND_BEGIN_SILENCE",
84 "ZEND_END_SILENCE",
85 "ZEND_INIT_FCALL_BY_NAME",
86 "ZEND_DO_FCALL",
87 "ZEND_INIT_FCALL",
88 "ZEND_RETURN",
89 "ZEND_RECV",
90 "ZEND_RECV_INIT",
91 "ZEND_SEND_VAL",
92 "ZEND_SEND_VAR_EX",
93 "ZEND_SEND_REF",
94 "ZEND_NEW",
95 "ZEND_INIT_NS_FCALL_BY_NAME",
96 "ZEND_FREE",
97 "ZEND_INIT_ARRAY",
98 "ZEND_ADD_ARRAY_ELEMENT",
99 "ZEND_INCLUDE_OR_EVAL",
100 "ZEND_UNSET_VAR",
101 "ZEND_UNSET_DIM",
102 "ZEND_UNSET_OBJ",
103 "ZEND_FE_RESET_R",
104 "ZEND_FE_FETCH_R",
105 "ZEND_EXIT",
106 "ZEND_FETCH_R",
107 "ZEND_FETCH_DIM_R",
108 "ZEND_FETCH_OBJ_R",
109 "ZEND_FETCH_W",
110 "ZEND_FETCH_DIM_W",
111 "ZEND_FETCH_OBJ_W",
112 "ZEND_FETCH_RW",
113 "ZEND_FETCH_DIM_RW",
114 "ZEND_FETCH_OBJ_RW",
115 "ZEND_FETCH_IS",
116 "ZEND_FETCH_DIM_IS",
117 "ZEND_FETCH_OBJ_IS",
118 "ZEND_FETCH_FUNC_ARG",
119 "ZEND_FETCH_DIM_FUNC_ARG",
120 "ZEND_FETCH_OBJ_FUNC_ARG",
121 "ZEND_FETCH_UNSET",
122 "ZEND_FETCH_DIM_UNSET",
123 "ZEND_FETCH_OBJ_UNSET",
124 "ZEND_FETCH_LIST_R",
125 "ZEND_FETCH_CONSTANT",
126 "ZEND_CHECK_FUNC_ARG",
127 "ZEND_EXT_STMT",
128 "ZEND_EXT_FCALL_BEGIN",
129 "ZEND_EXT_FCALL_END",
130 "ZEND_EXT_NOP",
131 "ZEND_TICKS",
132 "ZEND_SEND_VAR_NO_REF",
133 "ZEND_CATCH",
134 "ZEND_THROW",
135 "ZEND_FETCH_CLASS",
136 "ZEND_CLONE",
137 "ZEND_RETURN_BY_REF",
138 "ZEND_INIT_METHOD_CALL",
139 "ZEND_INIT_STATIC_METHOD_CALL",
140 "ZEND_ISSET_ISEMPTY_VAR",
141 "ZEND_ISSET_ISEMPTY_DIM_OBJ",
142 "ZEND_SEND_VAL_EX",
143 "ZEND_SEND_VAR",
144 "ZEND_INIT_USER_CALL",
145 "ZEND_SEND_ARRAY",
146 "ZEND_SEND_USER",
147 "ZEND_STRLEN",
148 "ZEND_DEFINED",
149 "ZEND_TYPE_CHECK",
150 "ZEND_VERIFY_RETURN_TYPE",
151 "ZEND_FE_RESET_RW",
152 "ZEND_FE_FETCH_RW",
153 "ZEND_FE_FREE",
154 "ZEND_INIT_DYNAMIC_CALL",
155 "ZEND_DO_ICALL",
156 "ZEND_DO_UCALL",
157 "ZEND_DO_FCALL_BY_NAME",
158 "ZEND_PRE_INC_OBJ",
159 "ZEND_PRE_DEC_OBJ",
160 "ZEND_POST_INC_OBJ",
161 "ZEND_POST_DEC_OBJ",
162 "ZEND_ECHO",
163 "ZEND_OP_DATA",
164 "ZEND_INSTANCEOF",
165 "ZEND_GENERATOR_CREATE",
166 "ZEND_MAKE_REF",
167 "ZEND_DECLARE_FUNCTION",
168 "ZEND_DECLARE_LAMBDA_FUNCTION",
169 "ZEND_DECLARE_CONST",
170 "ZEND_DECLARE_CLASS",
171 "ZEND_DECLARE_CLASS_DELAYED",
172 "ZEND_DECLARE_ANON_CLASS",
173 "ZEND_ADD_ARRAY_UNPACK",
174 "ZEND_ISSET_ISEMPTY_PROP_OBJ",
175 "ZEND_HANDLE_EXCEPTION",
176 "ZEND_USER_OPCODE",
177 "ZEND_ASSERT_CHECK",
178 "ZEND_JMP_SET",
179 "ZEND_UNSET_CV",
180 "ZEND_ISSET_ISEMPTY_CV",
181 "ZEND_FETCH_LIST_W",
182 "ZEND_SEPARATE",
183 "ZEND_FETCH_CLASS_NAME",
184 "ZEND_CALL_TRAMPOLINE",
185 "ZEND_DISCARD_EXCEPTION",
186 "ZEND_YIELD",
187 "ZEND_GENERATOR_RETURN",
188 "ZEND_FAST_CALL",
189 "ZEND_FAST_RET",
190 "ZEND_RECV_VARIADIC",
191 "ZEND_SEND_UNPACK",
192 "ZEND_YIELD_FROM",
193 "ZEND_COPY_TMP",
194 "ZEND_BIND_GLOBAL",
195 "ZEND_COALESCE",
196 "ZEND_SPACESHIP",
197 "ZEND_FUNC_NUM_ARGS",
198 "ZEND_FUNC_GET_ARGS",
199 "ZEND_FETCH_STATIC_PROP_R",
200 "ZEND_FETCH_STATIC_PROP_W",
201 "ZEND_FETCH_STATIC_PROP_RW",
202 "ZEND_FETCH_STATIC_PROP_IS",
203 "ZEND_FETCH_STATIC_PROP_FUNC_ARG",
204 "ZEND_FETCH_STATIC_PROP_UNSET",
205 "ZEND_UNSET_STATIC_PROP",
206 "ZEND_ISSET_ISEMPTY_STATIC_PROP",
207 "ZEND_FETCH_CLASS_CONSTANT",
208 "ZEND_BIND_LEXICAL",
209 "ZEND_BIND_STATIC",
210 "ZEND_FETCH_THIS",
211 "ZEND_SEND_FUNC_ARG",
212 "ZEND_ISSET_ISEMPTY_THIS",
213 "ZEND_SWITCH_LONG",
214 "ZEND_SWITCH_STRING",
215 "ZEND_IN_ARRAY",
216 "ZEND_COUNT",
217 "ZEND_GET_CLASS",
218 "ZEND_GET_CALLED_CLASS",
219 "ZEND_GET_TYPE",
220 "ZEND_ARRAY_KEY_EXISTS",
221 };
222
223 static uint32_t zend_vm_opcodes_flags[195] = {
224 0x00000000,
225 0x00000b0b,
226 0x00000b0b,
227 0x80000b0b,
228 0x00000707,
229 0x00000b0b,
230 0x00000b0b,
231 0x00000b0b,
232 0x40000707,
233 0x80000b0b,
234 0x80000b0b,
235 0x80000b0b,
236 0x00000707,
237 0x00000007,
238 0x00000007,
239 0x80000707,
240 0x80000303,
241 0x80000303,
242 0x80000707,
243 0x80000707,
244 0x00000b0b,
245 0x00000b0b,
246 0x00000301,
247 0x00006701,
248 0x00040751,
249 0x00040000,
250 0x04000701,
251 0x04006701,
252 0x04000751,
253 0x04000000,
254 0x0b000101,
255 0x00000003,
256 0x0b040751,
257 0x0b040000,
258 0x00000001,
259 0x00000001,
260 0x00000001,
261 0x00000001,
262 0x00040000,
263 0x00040000,
264 0x00040000,
265 0x00040000,
266 0x00000020,
267 0x00002007,
268 0x00002007,
269 0x03002007,
270 0x00002007,
271 0x00002007,
272 0x00000705,
273 0x00000101,
274 0x00001001,
275 0x07000003,
276 0x00000007,
277 0x00000707,
278 0x01000701,
279 0x01000701,
280 0x01000701,
281 0x00000000,
282 0x00000001,
283 0x01040300,
284 0x00000000,
285 0x01040310,
286 0x00000003,
287 0x0000a110,
288 0x00040310,
289 0x00001007,
290 0x00001001,
291 0x00001001,
292 0x0100a173,
293 0x01040300,
294 0x00000005,
295 0x00186703,
296 0x00106703,
297 0x08000007,
298 0x00010107,
299 0x00000701,
300 0x00040751,
301 0x00002003,
302 0x03000001,
303 0x00000000,
304 0x00010107,
305 0x00000707,
306 0x00040757,
307 0x00010107,
308 0x00006701,
309 0x00640751,
310 0x00010107,
311 0x00006701,
312 0x00040751,
313 0x00010107,
314 0x00000707,
315 0x00040757,
316 0x00010107,
317 0x00006703,
318 0x00240753,
319 0x00010107,
320 0x00000701,
321 0x00040751,
322 0x0000070b,
323 0x00040391,
324 0x00001001,
325 0x00000000,
326 0x00000000,
327 0x00000000,
328 0x00000000,
329 0x01000000,
330 0x00001001,
331 0x02042003,
332 0x00000003,
333 0x00040771,
334 0x00000057,
335 0x0b000003,
336 0x01040757,
337 0x01048773,
338 0x00030107,
339 0x00020707,
340 0x00001003,
341 0x00001001,
342 0x01000703,
343 0x01000000,
344 0x00001003,
345 0x00000007,
346 0x00040003,
347 0x09000007,
348 0x0000a103,
349 0x00002003,
350 0x03000001,
351 0x00000005,
352 0x01000700,
353 0x00000000,
354 0x00000000,
355 0x00000000,
356 0x00040751,
357 0x00040751,
358 0x00040751,
359 0x00040751,
360 0x00000007,
361 0x00000000,
362 0x00047305,
363 0x00000000,
364 0x00000101,
365 0x00000000,
366 0x00040103,
367 0x00000303,
368 0x00000003,
369 0x00000303,
370 0x00040000,
371 0x00000000,
372 0x00060757,
373 0x00000000,
374 0x00000000,
375 0x00002000,
376 0x00002003,
377 0x00000101,
378 0x00020101,
379 0x00000701,
380 0x00000101,
381 0x00000071,
382 0x00000000,
383 0x00000000,
384 0x0b000303,
385 0x00000003,
386 0x00000020,
387 0x00003000,
388 0x0000a110,
389 0x00000000,
390 0x00000003,
391 0x00000105,
392 0x00040301,
393 0x00002003,
394 0x00000707,
395 0x00000101,
396 0x00000103,
397 0x00047000,
398 0x00647000,
399 0x00047000,
400 0x00047000,
401 0x00247000,
402 0x00047000,
403 0x00040000,
404 0x00067000,
405 0x00040373,
406 0x00100101,
407 0x00100101,
408 0x00000101,
409 0x00001001,
410 0x00000101,
411 0x0300030b,
412 0x0300030b,
413 0x01000303,
414 0x00000107,
415 0x00000107,
416 0x00000101,
417 0x00000103,
418 0x00000707,
419 };
420
zend_get_opcode_name(zend_uchar opcode)421 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
422 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
423 return NULL;
424 }
425 return zend_vm_opcodes_names[opcode];
426 }
zend_get_opcode_flags(zend_uchar opcode)427 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {
428 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
429 opcode = ZEND_NOP;
430 }
431 return zend_vm_opcodes_flags[opcode];
432 }
433