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