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