/src/php-src/Zend/zend_vm_opcodes.c
Line | Count | Source (jump to first uncovered line) |
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[211] = { |
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 | | NULL, |
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 | | "ZEND_INIT_PARENT_PROPERTY_HOOK_CALL", |
236 | | "ZEND_DECLARE_ATTRIBUTED_CONST", |
237 | | }; |
238 | | |
239 | | static uint32_t zend_vm_opcodes_flags[211] = { |
240 | | 0x00000000, |
241 | | 0x00000b0b, |
242 | | 0x00000b0b, |
243 | | 0x80000b0b, |
244 | | 0x00000707, |
245 | | 0x00000b0b, |
246 | | 0x00000b0b, |
247 | | 0x00000b0b, |
248 | | 0x40000707, |
249 | | 0x80000b0b, |
250 | | 0x80000b0b, |
251 | | 0x80000b0b, |
252 | | 0x00000707, |
253 | | 0x0000000b, |
254 | | 0x00000007, |
255 | | 0x80000707, |
256 | | 0x80000303, |
257 | | 0x80000303, |
258 | | 0x80000707, |
259 | | 0x80000707, |
260 | | 0x00000b0b, |
261 | | 0x00000b0b, |
262 | | 0x00000301, |
263 | | 0x00006701, |
264 | | 0x00040751, |
265 | | 0x00040000, |
266 | | 0x04000701, |
267 | | 0x04006701, |
268 | | 0x04000751, |
269 | | 0x04000000, |
270 | | 0x0b000101, |
271 | | 0x00000003, |
272 | | 0x0b040751, |
273 | | 0x0b040000, |
274 | | 0x00000001, |
275 | | 0x00000001, |
276 | | 0x00000001, |
277 | | 0x00000001, |
278 | | 0x00040000, |
279 | | 0x00040000, |
280 | | 0x00040000, |
281 | | 0x00040000, |
282 | | 0x00000020, |
283 | | 0x00002007, |
284 | | 0x00002007, |
285 | | 0x00000000, |
286 | | 0x00002007, |
287 | | 0x00002007, |
288 | | 0x00000705, |
289 | | 0x00000101, |
290 | | 0x00001301, |
291 | | 0x07000003, |
292 | | 0x00000007, |
293 | | 0x00000707, |
294 | | 0x01000701, |
295 | | 0x01000701, |
296 | | 0x01000701, |
297 | | 0x00000000, |
298 | | 0x00000001, |
299 | | 0x01040300, |
300 | | 0x00000000, |
301 | | 0x01040310, |
302 | | 0x00000003, |
303 | | 0x00000110, |
304 | | 0x00000310, |
305 | | 0x00001307, |
306 | | 0x00001301, |
307 | | 0x00001301, |
308 | | 0x0100a173, |
309 | | 0x01040300, |
310 | | 0x00000005, |
311 | | 0x00186703, |
312 | | 0x00106703, |
313 | | 0x08000007, |
314 | | 0x00010107, |
315 | | 0x00000701, |
316 | | 0x00040751, |
317 | | 0x00002003, |
318 | | 0x03000001, |
319 | | 0x00000000, |
320 | | 0x00010107, |
321 | | 0x00000707, |
322 | | 0x00040757, |
323 | | 0x00010107, |
324 | | 0x00006701, |
325 | | 0x00640751, |
326 | | 0x00010107, |
327 | | 0x00006701, |
328 | | 0x00040751, |
329 | | 0x00010107, |
330 | | 0x00000707, |
331 | | 0x00040757, |
332 | | 0x00010107, |
333 | | 0x00006703, |
334 | | 0x00240753, |
335 | | 0x00010107, |
336 | | 0x00000701, |
337 | | 0x00040751, |
338 | | 0x0000070b, |
339 | | 0x00040391, |
340 | | 0x00001301, |
341 | | 0x00000000, |
342 | | 0x00000000, |
343 | | 0x00000000, |
344 | | 0x00000000, |
345 | | 0x01000000, |
346 | | 0x00001301, |
347 | | 0x02042003, |
348 | | 0x00000007, |
349 | | 0x00040771, |
350 | | 0x00000057, |
351 | | 0x0b000003, |
352 | | 0x01040757, |
353 | | 0x01048773, |
354 | | 0x00030107, |
355 | | 0x00020707, |
356 | | 0x00001303, |
357 | | 0x00001301, |
358 | | 0x01000703, |
359 | | 0x01000000, |
360 | | 0x00001003, |
361 | | 0x00000007, |
362 | | 0x00040003, |
363 | | 0x09000007, |
364 | | 0x00000103, |
365 | | 0x00002003, |
366 | | 0x03000001, |
367 | | 0x00000005, |
368 | | 0x01000700, |
369 | | 0x00000000, |
370 | | 0x00000000, |
371 | | 0x00000000, |
372 | | 0x00040751, |
373 | | 0x00040751, |
374 | | 0x00040751, |
375 | | 0x00040751, |
376 | | 0x00000007, |
377 | | 0x00000000, |
378 | | 0x00047305, |
379 | | 0x00000000, |
380 | | 0x00000101, |
381 | | 0x00001000, |
382 | | 0x00001003, |
383 | | 0x00000303, |
384 | | 0x00000003, |
385 | | 0x00000303, |
386 | | 0x00040000, |
387 | | 0x00000000, |
388 | | 0x00060757, |
389 | | 0x00000000, |
390 | | 0x00000000, |
391 | | 0x00002000, |
392 | | 0x00002003, |
393 | | 0x00000101, |
394 | | 0x00020101, |
395 | | 0x00000701, |
396 | | 0x00000101, |
397 | | 0x00000075, |
398 | | 0x00000000, |
399 | | 0x00000000, |
400 | | 0x0b000703, |
401 | | 0x00000003, |
402 | | 0x00000020, |
403 | | 0x00003000, |
404 | | 0x00000110, |
405 | | 0x00000000, |
406 | | 0x00000007, |
407 | | 0x00000105, |
408 | | 0x00040301, |
409 | | 0x00002003, |
410 | | 0x00000707, |
411 | | 0x00000101, |
412 | | 0x00000103, |
413 | | 0x00047000, |
414 | | 0x00647000, |
415 | | 0x00047000, |
416 | | 0x00047000, |
417 | | 0x00247000, |
418 | | 0x00047000, |
419 | | 0x00040000, |
420 | | 0x00067000, |
421 | | 0x00040b73, |
422 | | 0x00100101, |
423 | | 0x00100001, |
424 | | 0x00000101, |
425 | | 0x00001301, |
426 | | 0x00000101, |
427 | | 0x0300030b, |
428 | | 0x0300030b, |
429 | | 0x01000303, |
430 | | 0x00000107, |
431 | | 0x00000107, |
432 | | 0x00000101, |
433 | | 0x00000103, |
434 | | 0x00000707, |
435 | | 0x0300030b, |
436 | | 0x00000301, |
437 | | 0x0000010b, |
438 | | 0x00002003, |
439 | | 0x00000101, |
440 | | 0x00000101, |
441 | | 0x00000101, |
442 | | 0x00000101, |
443 | | 0x00002001, |
444 | | 0x00000101, |
445 | | 0x00000100, |
446 | | 0x00000000, |
447 | | 0x00000000, |
448 | | 0x01042003, |
449 | | 0x01001103, |
450 | | 0x00000303, |
451 | | }; |
452 | | |
453 | 0 | ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode) { |
454 | 0 | if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) { |
455 | 0 | return NULL; |
456 | 0 | } |
457 | 0 | return zend_vm_opcodes_names[opcode]; |
458 | 0 | } |
459 | 0 | ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(uint8_t opcode) { |
460 | 0 | if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) { |
461 | 0 | opcode = ZEND_NOP; |
462 | 0 | } |
463 | 0 | return zend_vm_opcodes_flags[opcode]; |
464 | 0 | } |
465 | 0 | ZEND_API uint8_t zend_get_opcode_id(const char *name, size_t length) { |
466 | 0 | uint8_t opcode; |
467 | 0 | for (opcode = 0; opcode < (sizeof(zend_vm_opcodes_names) / sizeof(zend_vm_opcodes_names[0])) - 1; opcode++) { |
468 | 0 | const char *opcode_name = zend_vm_opcodes_names[opcode]; |
469 | 0 | if (opcode_name && strncmp(opcode_name, name, length) == 0) { |
470 | 0 | return opcode; |
471 | 0 | } |
472 | 0 | } |
473 | 0 | return ZEND_VM_LAST_OPCODE + 1; |
474 | 0 | } |