xref: /php-src/Zend/zend_vm_opcodes.c (revision 631bc816)
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