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