xref: /PHP-7.3/Zend/zend_vm_opcodes.c (revision 9afce019)
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