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