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[200] = {
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 "ZEND_MATCH",
222 "ZEND_CASE_STRICT",
223 "ZEND_MATCH_ERROR",
224 "ZEND_JMP_NULL",
225 "ZEND_CHECK_UNDEF_ARGS",
226 };
227
228 static uint32_t zend_vm_opcodes_flags[200] = {
229 0x00000000,
230 0x00000b0b,
231 0x00000b0b,
232 0x80000b0b,
233 0x00000707,
234 0x00000b0b,
235 0x00000b0b,
236 0x00000b0b,
237 0x40000707,
238 0x80000b0b,
239 0x80000b0b,
240 0x80000b0b,
241 0x00000707,
242 0x0000000b,
243 0x00000007,
244 0x80000707,
245 0x80000303,
246 0x80000303,
247 0x80000707,
248 0x80000707,
249 0x00000b0b,
250 0x00000b0b,
251 0x00000301,
252 0x00006701,
253 0x00040751,
254 0x00040000,
255 0x04000701,
256 0x04006701,
257 0x04000751,
258 0x04000000,
259 0x0b000101,
260 0x00000003,
261 0x0b040751,
262 0x0b040000,
263 0x00000001,
264 0x00000001,
265 0x00000001,
266 0x00000001,
267 0x00040000,
268 0x00040000,
269 0x00040000,
270 0x00040000,
271 0x00000020,
272 0x00002007,
273 0x00002007,
274 0x03002007,
275 0x00002007,
276 0x00002007,
277 0x00000705,
278 0x00000101,
279 0x00001301,
280 0x07000003,
281 0x00000007,
282 0x00000707,
283 0x01000701,
284 0x01000701,
285 0x01000701,
286 0x00000000,
287 0x00000001,
288 0x01040300,
289 0x00000000,
290 0x01040310,
291 0x00000003,
292 0x00040110,
293 0x00040310,
294 0x00001307,
295 0x00001301,
296 0x00001301,
297 0x0100a173,
298 0x01040300,
299 0x00000005,
300 0x00186703,
301 0x00106703,
302 0x08000007,
303 0x00010107,
304 0x00000701,
305 0x00040751,
306 0x00002003,
307 0x03000001,
308 0x00000000,
309 0x00010107,
310 0x00000707,
311 0x00040757,
312 0x00010107,
313 0x00006701,
314 0x00640751,
315 0x00010107,
316 0x00006701,
317 0x00040751,
318 0x00010107,
319 0x00000707,
320 0x00040757,
321 0x00010107,
322 0x00006703,
323 0x00240753,
324 0x00010107,
325 0x00000701,
326 0x00040751,
327 0x0000070b,
328 0x00040391,
329 0x00001301,
330 0x00000000,
331 0x00000000,
332 0x00000000,
333 0x00000000,
334 0x01000000,
335 0x00001301,
336 0x02042003,
337 0x00000007,
338 0x00040771,
339 0x00000057,
340 0x0b000003,
341 0x01040757,
342 0x01048773,
343 0x00030107,
344 0x00020707,
345 0x00001303,
346 0x00001301,
347 0x01000703,
348 0x01000000,
349 0x00001003,
350 0x00000007,
351 0x00040003,
352 0x09000007,
353 0x0000a103,
354 0x00002003,
355 0x03000001,
356 0x00000005,
357 0x01000700,
358 0x00000000,
359 0x00000000,
360 0x00000000,
361 0x00040751,
362 0x00040751,
363 0x00040751,
364 0x00040751,
365 0x00000007,
366 0x00000000,
367 0x00047305,
368 0x00000000,
369 0x00000101,
370 0x00000000,
371 0x00040103,
372 0x00000303,
373 0x00000003,
374 0x00000303,
375 0x00040000,
376 0x00000000,
377 0x00060757,
378 0x00000000,
379 0x00000000,
380 0x00002000,
381 0x00002003,
382 0x00000101,
383 0x00020101,
384 0x00000701,
385 0x00000101,
386 0x00000075,
387 0x00000000,
388 0x00000000,
389 0x0b000703,
390 0x00000003,
391 0x00000020,
392 0x00003000,
393 0x00040110,
394 0x00000000,
395 0x00000007,
396 0x00000105,
397 0x00040301,
398 0x00002003,
399 0x00000707,
400 0x00000101,
401 0x00000103,
402 0x00047000,
403 0x00647000,
404 0x00047000,
405 0x00047000,
406 0x00247000,
407 0x00047000,
408 0x00040000,
409 0x00067000,
410 0x00040373,
411 0x00100101,
412 0x00100101,
413 0x00000101,
414 0x00001301,
415 0x00000101,
416 0x0300030b,
417 0x0300030b,
418 0x01000303,
419 0x00000107,
420 0x00000107,
421 0x00000101,
422 0x00000103,
423 0x00000707,
424 0x0300030b,
425 0x00000301,
426 0x0000010b,
427 0x00002003,
428 0x00000101,
429 };
430
zend_get_opcode_name(zend_uchar opcode)431 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
432 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
433 return NULL;
434 }
435 return zend_vm_opcodes_names[opcode];
436 }
zend_get_opcode_flags(zend_uchar opcode)437 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {
438 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
439 opcode = ZEND_NOP;
440 }
441 return zend_vm_opcodes_flags[opcode];
442 }
443