Coverage Report

Created: 2025-06-13 06:43

/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
}