Coverage Report

Created: 2026-02-14 06:52

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