xref: /PHP-8.3/Zend/zend_vm_opcodes.c (revision 0b1d750d)
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