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