1 /*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1998-2018 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[199] = {
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_BW_NOT",
39 "ZEND_BOOL_NOT",
40 "ZEND_BOOL_XOR",
41 "ZEND_IS_IDENTICAL",
42 "ZEND_IS_NOT_IDENTICAL",
43 "ZEND_IS_EQUAL",
44 "ZEND_IS_NOT_EQUAL",
45 "ZEND_IS_SMALLER",
46 "ZEND_IS_SMALLER_OR_EQUAL",
47 "ZEND_CAST",
48 "ZEND_QM_ASSIGN",
49 "ZEND_ASSIGN_ADD",
50 "ZEND_ASSIGN_SUB",
51 "ZEND_ASSIGN_MUL",
52 "ZEND_ASSIGN_DIV",
53 "ZEND_ASSIGN_MOD",
54 "ZEND_ASSIGN_SL",
55 "ZEND_ASSIGN_SR",
56 "ZEND_ASSIGN_CONCAT",
57 "ZEND_ASSIGN_BW_OR",
58 "ZEND_ASSIGN_BW_AND",
59 "ZEND_ASSIGN_BW_XOR",
60 "ZEND_PRE_INC",
61 "ZEND_PRE_DEC",
62 "ZEND_POST_INC",
63 "ZEND_POST_DEC",
64 "ZEND_ASSIGN",
65 "ZEND_ASSIGN_REF",
66 "ZEND_ECHO",
67 "ZEND_GENERATOR_CREATE",
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_MAKE_REF",
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_ASSIGN_OBJ",
163 "ZEND_OP_DATA",
164 "ZEND_INSTANCEOF",
165 "ZEND_DECLARE_CLASS",
166 "ZEND_DECLARE_INHERITED_CLASS",
167 "ZEND_DECLARE_FUNCTION",
168 "ZEND_YIELD_FROM",
169 "ZEND_DECLARE_CONST",
170 "ZEND_ADD_INTERFACE",
171 "ZEND_DECLARE_INHERITED_CLASS_DELAYED",
172 "ZEND_VERIFY_ABSTRACT_CLASS",
173 "ZEND_ASSIGN_DIM",
174 "ZEND_ISSET_ISEMPTY_PROP_OBJ",
175 "ZEND_HANDLE_EXCEPTION",
176 "ZEND_USER_OPCODE",
177 "ZEND_ASSERT_CHECK",
178 "ZEND_JMP_SET",
179 "ZEND_DECLARE_LAMBDA_FUNCTION",
180 "ZEND_ADD_TRAIT",
181 "ZEND_BIND_TRAITS",
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_POW",
193 "ZEND_ASSIGN_POW",
194 "ZEND_BIND_GLOBAL",
195 "ZEND_COALESCE",
196 "ZEND_SPACESHIP",
197 "ZEND_DECLARE_ANON_CLASS",
198 "ZEND_DECLARE_ANON_INHERITED_CLASS",
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_FUNC_NUM_ARGS",
221 "ZEND_FUNC_GET_ARGS",
222 "ZEND_UNSET_CV",
223 "ZEND_ISSET_ISEMPTY_CV",
224 "ZEND_FETCH_LIST_W",
225 };
226
227 static uint32_t zend_vm_opcodes_flags[199] = {
228 0x00000000,
229 0x00000707,
230 0x00000707,
231 0x80000707,
232 0x00000707,
233 0x00000707,
234 0x00000707,
235 0x00000707,
236 0x40000707,
237 0x80000707,
238 0x80000707,
239 0x80000707,
240 0x00000007,
241 0x00000007,
242 0x80000707,
243 0x80000303,
244 0x80000303,
245 0x80000707,
246 0x80000707,
247 0x00000707,
248 0x00000707,
249 0x07000003,
250 0x00000003,
251 0x04046751,
252 0x04046751,
253 0x04046751,
254 0x04046751,
255 0x04046751,
256 0x04046751,
257 0x04046751,
258 0x04046751,
259 0x04046751,
260 0x04046751,
261 0x04046751,
262 0x00000001,
263 0x00000001,
264 0x00000001,
265 0x00000001,
266 0x00000301,
267 0x0b000101,
268 0x00000007,
269 0x00000000,
270 0x00000020,
271 0x00002007,
272 0x00002007,
273 0x03002007,
274 0x00002007,
275 0x00002007,
276 0x00000705,
277 0x00000101,
278 0x00001001,
279 0x00000101,
280 0x00000007,
281 0x00000707,
282 0x01000701,
283 0x01000701,
284 0x01000701,
285 0x00000000,
286 0x00000001,
287 0x01040300,
288 0x00000000,
289 0x01040310,
290 0x00000003,
291 0x0000a110,
292 0x00040310,
293 0x00001007,
294 0x00001001,
295 0x00001001,
296 0x0100a173,
297 0x01040300,
298 0x00000005,
299 0x00186703,
300 0x00106703,
301 0x08000007,
302 0x00010107,
303 0x00000701,
304 0x00040751,
305 0x00002003,
306 0x03000001,
307 0x00000007,
308 0x00010107,
309 0x00000707,
310 0x00040757,
311 0x00010107,
312 0x00006701,
313 0x00040751,
314 0x00010107,
315 0x00006701,
316 0x00040751,
317 0x00010107,
318 0x00000707,
319 0x00040757,
320 0x00010107,
321 0x00006703,
322 0x00040753,
323 0x00010107,
324 0x00000701,
325 0x00040751,
326 0x0000070b,
327 0x00040391,
328 0x00001001,
329 0x00000000,
330 0x00000000,
331 0x00000000,
332 0x00000000,
333 0x01000000,
334 0x00001001,
335 0x02042003,
336 0x00000003,
337 0x00040771,
338 0x00000057,
339 0x0b000003,
340 0x01040757,
341 0x01048773,
342 0x00030107,
343 0x00020707,
344 0x00001003,
345 0x00001001,
346 0x01000703,
347 0x01000000,
348 0x00001003,
349 0x00000007,
350 0x00040003,
351 0x09000007,
352 0x0000a103,
353 0x00002003,
354 0x03000001,
355 0x00000005,
356 0x01000700,
357 0x00000000,
358 0x00000000,
359 0x00000000,
360 0x00040751,
361 0x00040751,
362 0x00040751,
363 0x00040751,
364 0x00040751,
365 0x00000000,
366 0x00047305,
367 0x00000003,
368 0x00000303,
369 0x00000000,
370 0x00000003,
371 0x00000303,
372 0x00040300,
373 0x00000303,
374 0x00000000,
375 0x00006701,
376 0x00060757,
377 0x00000000,
378 0x00000000,
379 0x00002000,
380 0x00002003,
381 0x00000103,
382 0x00040000,
383 0x00000000,
384 0x00000101,
385 0x00000071,
386 0x00000000,
387 0x00000000,
388 0x0b000303,
389 0x00000003,
390 0x00000020,
391 0x00003000,
392 0x0000a110,
393 0x00000000,
394 0x00000707,
395 0x04046751,
396 0x00040301,
397 0x00002007,
398 0x00000707,
399 0x03000000,
400 0x03000303,
401 0x00047307,
402 0x00047307,
403 0x00047307,
404 0x00047307,
405 0x00047307,
406 0x00047307,
407 0x00047307,
408 0x00067307,
409 0x00040373,
410 0x00100101,
411 0x00100301,
412 0x00000101,
413 0x00001001,
414 0x00000101,
415 0x0300030b,
416 0x0300030b,
417 0x01000303,
418 0x00000103,
419 0x00000103,
420 0x00000101,
421 0x00000103,
422 0x00000101,
423 0x00000103,
424 0x00000101,
425 0x00020101,
426 0x00000701,
427 };
428
zend_get_opcode_name(zend_uchar opcode)429 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
430 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
431 return NULL;
432 }
433 return zend_vm_opcodes_names[opcode];
434 }
zend_get_opcode_flags(zend_uchar opcode)435 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {
436 if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
437 opcode = ZEND_NOP;
438 }
439 return zend_vm_opcodes_flags[opcode];
440 }
441