Coverage Report

Created: 2026-07-25 06:39

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 © Zend Technologies Ltd., a subsidiary company of          |
6
   |     Perforce Software, Inc., and Contributors.                       |
7
   +----------------------------------------------------------------------+
8
   | This source file is subject to the Modified BSD License that is      |
9
   | bundled with this package in the file LICENSE, and is available      |
10
   | through the World Wide Web at <https://www.php.net/license/>.        |
11
   |                                                                      |
12
   | SPDX-License-Identifier: BSD-3-Clause                                |
13
   +----------------------------------------------------------------------+
14
   | Authors: Andi Gutmans <andi@php.net>                                 |
15
   |          Zeev Suraski <zeev@php.net>                                 |
16
   |          Dmitry Stogov <dmitry@php.net>                              |
17
   +----------------------------------------------------------------------+
18
*/
19
20
#include <stdio.h>
21
#include <zend.h>
22
#include <zend_vm_opcodes.h>
23
24
static const char *zend_vm_opcodes_names[214] = {
25
  "ZEND_NOP",
26
  "ZEND_ADD",
27
  "ZEND_SUB",
28
  "ZEND_MUL",
29
  "ZEND_DIV",
30
  "ZEND_MOD",
31
  "ZEND_SL",
32
  "ZEND_SR",
33
  "ZEND_CONCAT",
34
  "ZEND_BW_OR",
35
  "ZEND_BW_AND",
36
  "ZEND_BW_XOR",
37
  "ZEND_POW",
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_ASSIGN",
48
  "ZEND_ASSIGN_DIM",
49
  "ZEND_ASSIGN_OBJ",
50
  "ZEND_ASSIGN_STATIC_PROP",
51
  "ZEND_ASSIGN_OP",
52
  "ZEND_ASSIGN_DIM_OP",
53
  "ZEND_ASSIGN_OBJ_OP",
54
  "ZEND_ASSIGN_STATIC_PROP_OP",
55
  "ZEND_ASSIGN_REF",
56
  "ZEND_QM_ASSIGN",
57
  "ZEND_ASSIGN_OBJ_REF",
58
  "ZEND_ASSIGN_STATIC_PROP_REF",
59
  "ZEND_PRE_INC",
60
  "ZEND_PRE_DEC",
61
  "ZEND_POST_INC",
62
  "ZEND_POST_DEC",
63
  "ZEND_PRE_INC_STATIC_PROP",
64
  "ZEND_PRE_DEC_STATIC_PROP",
65
  "ZEND_POST_INC_STATIC_PROP",
66
  "ZEND_POST_DEC_STATIC_PROP",
67
  "ZEND_JMP",
68
  "ZEND_JMPZ",
69
  "ZEND_JMPNZ",
70
  NULL,
71
  "ZEND_JMPZ_EX",
72
  "ZEND_JMPNZ_EX",
73
  "ZEND_CASE",
74
  "ZEND_CHECK_VAR",
75
  "ZEND_SEND_VAR_NO_REF_EX",
76
  "ZEND_CAST",
77
  "ZEND_BOOL",
78
  "ZEND_FAST_CONCAT",
79
  "ZEND_ROPE_INIT",
80
  "ZEND_ROPE_ADD",
81
  "ZEND_ROPE_END",
82
  "ZEND_BEGIN_SILENCE",
83
  "ZEND_END_SILENCE",
84
  "ZEND_INIT_FCALL_BY_NAME",
85
  "ZEND_DO_FCALL",
86
  "ZEND_INIT_FCALL",
87
  "ZEND_RETURN",
88
  "ZEND_RECV",
89
  "ZEND_RECV_INIT",
90
  "ZEND_SEND_VAL",
91
  "ZEND_SEND_VAR_EX",
92
  "ZEND_SEND_REF",
93
  "ZEND_NEW",
94
  "ZEND_INIT_NS_FCALL_BY_NAME",
95
  "ZEND_FREE",
96
  "ZEND_INIT_ARRAY",
97
  "ZEND_ADD_ARRAY_ELEMENT",
98
  "ZEND_INCLUDE_OR_EVAL",
99
  "ZEND_UNSET_VAR",
100
  "ZEND_UNSET_DIM",
101
  "ZEND_UNSET_OBJ",
102
  "ZEND_FE_RESET_R",
103
  "ZEND_FE_FETCH_R",
104
  NULL,
105
  "ZEND_FETCH_R",
106
  "ZEND_FETCH_DIM_R",
107
  "ZEND_FETCH_OBJ_R",
108
  "ZEND_FETCH_W",
109
  "ZEND_FETCH_DIM_W",
110
  "ZEND_FETCH_OBJ_W",
111
  "ZEND_FETCH_RW",
112
  "ZEND_FETCH_DIM_RW",
113
  "ZEND_FETCH_OBJ_RW",
114
  "ZEND_FETCH_IS",
115
  "ZEND_FETCH_DIM_IS",
116
  "ZEND_FETCH_OBJ_IS",
117
  "ZEND_FETCH_FUNC_ARG",
118
  "ZEND_FETCH_DIM_FUNC_ARG",
119
  "ZEND_FETCH_OBJ_FUNC_ARG",
120
  "ZEND_FETCH_UNSET",
121
  "ZEND_FETCH_DIM_UNSET",
122
  "ZEND_FETCH_OBJ_UNSET",
123
  "ZEND_FETCH_LIST_R",
124
  "ZEND_FETCH_CONSTANT",
125
  "ZEND_CHECK_FUNC_ARG",
126
  "ZEND_EXT_STMT",
127
  "ZEND_EXT_FCALL_BEGIN",
128
  "ZEND_EXT_FCALL_END",
129
  "ZEND_EXT_NOP",
130
  "ZEND_TICKS",
131
  "ZEND_SEND_VAR_NO_REF",
132
  "ZEND_CATCH",
133
  "ZEND_THROW",
134
  "ZEND_FETCH_CLASS",
135
  "ZEND_CLONE",
136
  "ZEND_RETURN_BY_REF",
137
  "ZEND_INIT_METHOD_CALL",
138
  "ZEND_INIT_STATIC_METHOD_CALL",
139
  "ZEND_ISSET_ISEMPTY_VAR",
140
  "ZEND_ISSET_ISEMPTY_DIM_OBJ",
141
  "ZEND_SEND_VAL_EX",
142
  "ZEND_SEND_VAR",
143
  "ZEND_INIT_USER_CALL",
144
  "ZEND_SEND_ARRAY",
145
  "ZEND_SEND_USER",
146
  "ZEND_STRLEN",
147
  "ZEND_DEFINED",
148
  "ZEND_TYPE_CHECK",
149
  "ZEND_VERIFY_RETURN_TYPE",
150
  "ZEND_FE_RESET_RW",
151
  "ZEND_FE_FETCH_RW",
152
  "ZEND_FE_FREE",
153
  "ZEND_INIT_DYNAMIC_CALL",
154
  "ZEND_DO_ICALL",
155
  "ZEND_DO_UCALL",
156
  "ZEND_DO_FCALL_BY_NAME",
157
  "ZEND_PRE_INC_OBJ",
158
  "ZEND_PRE_DEC_OBJ",
159
  "ZEND_POST_INC_OBJ",
160
  "ZEND_POST_DEC_OBJ",
161
  "ZEND_ECHO",
162
  "ZEND_OP_DATA",
163
  "ZEND_INSTANCEOF",
164
  "ZEND_GENERATOR_CREATE",
165
  "ZEND_MAKE_REF",
166
  "ZEND_DECLARE_FUNCTION",
167
  "ZEND_DECLARE_LAMBDA_FUNCTION",
168
  "ZEND_DECLARE_CONST",
169
  "ZEND_DECLARE_CLASS",
170
  "ZEND_DECLARE_CLASS_DELAYED",
171
  "ZEND_DECLARE_ANON_CLASS",
172
  "ZEND_ADD_ARRAY_UNPACK",
173
  "ZEND_ISSET_ISEMPTY_PROP_OBJ",
174
  "ZEND_HANDLE_EXCEPTION",
175
  "ZEND_USER_OPCODE",
176
  "ZEND_ASSERT_CHECK",
177
  "ZEND_JMP_SET",
178
  "ZEND_UNSET_CV",
179
  "ZEND_ISSET_ISEMPTY_CV",
180
  "ZEND_FETCH_LIST_W",
181
  "ZEND_SEPARATE",
182
  "ZEND_FETCH_CLASS_NAME",
183
  "ZEND_CALL_TRAMPOLINE",
184
  "ZEND_DISCARD_EXCEPTION",
185
  "ZEND_YIELD",
186
  "ZEND_GENERATOR_RETURN",
187
  "ZEND_FAST_CALL",
188
  "ZEND_FAST_RET",
189
  "ZEND_RECV_VARIADIC",
190
  "ZEND_SEND_UNPACK",
191
  "ZEND_YIELD_FROM",
192
  "ZEND_COPY_TMP",
193
  "ZEND_BIND_GLOBAL",
194
  "ZEND_COALESCE",
195
  "ZEND_SPACESHIP",
196
  "ZEND_FUNC_NUM_ARGS",
197
  "ZEND_FUNC_GET_ARGS",
198
  "ZEND_FETCH_STATIC_PROP_R",
199
  "ZEND_FETCH_STATIC_PROP_W",
200
  "ZEND_FETCH_STATIC_PROP_RW",
201
  "ZEND_FETCH_STATIC_PROP_IS",
202
  "ZEND_FETCH_STATIC_PROP_FUNC_ARG",
203
  "ZEND_FETCH_STATIC_PROP_UNSET",
204
  "ZEND_UNSET_STATIC_PROP",
205
  "ZEND_ISSET_ISEMPTY_STATIC_PROP",
206
  "ZEND_FETCH_CLASS_CONSTANT",
207
  "ZEND_BIND_LEXICAL",
208
  "ZEND_BIND_STATIC",
209
  "ZEND_FETCH_THIS",
210
  "ZEND_SEND_FUNC_ARG",
211
  "ZEND_ISSET_ISEMPTY_THIS",
212
  "ZEND_SWITCH_LONG",
213
  "ZEND_SWITCH_STRING",
214
  "ZEND_IN_ARRAY",
215
  "ZEND_COUNT",
216
  "ZEND_GET_CLASS",
217
  "ZEND_GET_CALLED_CLASS",
218
  "ZEND_GET_TYPE",
219
  "ZEND_ARRAY_KEY_EXISTS",
220
  "ZEND_MATCH",
221
  "ZEND_CASE_STRICT",
222
  "ZEND_MATCH_ERROR",
223
  "ZEND_JMP_NULL",
224
  "ZEND_CHECK_UNDEF_ARGS",
225
  "ZEND_FETCH_GLOBALS",
226
  "ZEND_VERIFY_NEVER_TYPE",
227
  "ZEND_CALLABLE_CONVERT",
228
  "ZEND_BIND_INIT_STATIC_OR_JMP",
229
  "ZEND_FRAMELESS_ICALL_0",
230
  "ZEND_FRAMELESS_ICALL_1",
231
  "ZEND_FRAMELESS_ICALL_2",
232
  "ZEND_FRAMELESS_ICALL_3",
233
  "ZEND_JMP_FRAMELESS",
234
  "ZEND_INIT_PARENT_PROPERTY_HOOK_CALL",
235
  "ZEND_DECLARE_ATTRIBUTED_CONST",
236
  "ZEND_TYPE_ASSERT",
237
  "ZEND_CALLABLE_CONVERT_PARTIAL",
238
  "ZEND_SEND_PLACEHOLDER",
239
};
240
241
static uint32_t zend_vm_opcodes_flags[214] = {
242
  0x00000000,
243
  0x00000b0b,
244
  0x00000b0b,
245
  0x80000b0b,
246
  0x00000303,
247
  0x00000b0b,
248
  0x00000b0b,
249
  0x00000b0b,
250
  0x40000303,
251
  0x80000b0b,
252
  0x80000b0b,
253
  0x80000b0b,
254
  0x00000303,
255
  0x0000000b,
256
  0x00000003,
257
  0x80000303,
258
  0x80000303,
259
  0x80000303,
260
  0x80000303,
261
  0x80000303,
262
  0x00000b0b,
263
  0x00000b0b,
264
  0x00000301,
265
  0x00006301,
266
  0x00040351,
267
  0x00040000,
268
  0x04000301,
269
  0x04006301,
270
  0x04000351,
271
  0x04000000,
272
  0x0b000101,
273
  0x00000003,
274
  0x0b040351,
275
  0x0b040000,
276
  0x00000001,
277
  0x00000001,
278
  0x00000001,
279
  0x00000001,
280
  0x00040000,
281
  0x00040000,
282
  0x00040000,
283
  0x00040000,
284
  0x00000020,
285
  0x00002003,
286
  0x00002003,
287
  0x00000000,
288
  0x00002003,
289
  0x00002003,
290
  0x00000301,
291
  0x00000101,
292
  0x00001301,
293
  0x07000003,
294
  0x00000003,
295
  0x00000303,
296
  0x01000301,
297
  0x01000301,
298
  0x01000301,
299
  0x00000000,
300
  0x00000001,
301
  0x01040300,
302
  0x00000000,
303
  0x01040310,
304
  0x00000003,
305
  0x00000110,
306
  0x00000310,
307
  0x00001307,
308
  0x00001301,
309
  0x00001301,
310
  0x0100a173,
311
  0x01040300,
312
  0x00004005,
313
  0x00186303,
314
  0x00106303,
315
  0x08000003,
316
  0x00010107,
317
  0x00000301,
318
  0x00040351,
319
  0x00002003,
320
  0x03000001,
321
  0x00000000,
322
  0x00010103,
323
  0x00000307,
324
  0x00040357,
325
  0x00010103,
326
  0x00006301,
327
  0x00640351,
328
  0x00010103,
329
  0x00006301,
330
  0x00040351,
331
  0x00010103,
332
  0x00000307,
333
  0x00040357,
334
  0x00010103,
335
  0x00006303,
336
  0x00240353,
337
  0x00010103,
338
  0x00000301,
339
  0x00040351,
340
  0x0000030b,
341
  0x00040391,
342
  0x00001301,
343
  0x00000000,
344
  0x00000000,
345
  0x00000000,
346
  0x00000000,
347
  0x01000000,
348
  0x00001301,
349
  0x02042003,
350
  0x00000003,
351
  0x00040371,
352
  0x00000053,
353
  0x0b000003,
354
  0x01040353,
355
  0x01048373,
356
  0x00030103,
357
  0x00020303,
358
  0x00001303,
359
  0x00001301,
360
  0x01000303,
361
  0x01000000,
362
  0x00001003,
363
  0x00000003,
364
  0x00040003,
365
  0x09000003,
366
  0x00000103,
367
  0x00002003,
368
  0x03000001,
369
  0x00004005,
370
  0x01000300,
371
  0x00000000,
372
  0x00000000,
373
  0x00000000,
374
  0x00040351,
375
  0x00040351,
376
  0x00040351,
377
  0x00040351,
378
  0x00000003,
379
  0x00000000,
380
  0x00047301,
381
  0x00000000,
382
  0x00000101,
383
  0x00001000,
384
  0x00001003,
385
  0x00000303,
386
  0x00000003,
387
  0x00000303,
388
  0x00040000,
389
  0x00000000,
390
  0x00060353,
391
  0x00000000,
392
  0x00000000,
393
  0x00002000,
394
  0x00002003,
395
  0x00000101,
396
  0x00020101,
397
  0x00000301,
398
  0x00000101,
399
  0x00000071,
400
  0x00000000,
401
  0x00000000,
402
  0x0b000303,
403
  0x00000003,
404
  0x00000020,
405
  0x00003000,
406
  0x00000110,
407
  0x00000000,
408
  0x00000003,
409
  0x00000105,
410
  0x00040301,
411
  0x00002003,
412
  0x00000303,
413
  0x00000101,
414
  0x00000103,
415
  0x00047000,
416
  0x00647000,
417
  0x00047000,
418
  0x00047000,
419
  0x00247000,
420
  0x00047000,
421
  0x00040000,
422
  0x00067000,
423
  0x00040b73,
424
  0x00100101,
425
  0x00100001,
426
  0x00000101,
427
  0x00001301,
428
  0x00000101,
429
  0x0300030b,
430
  0x0300030b,
431
  0x01000303,
432
  0x00000103,
433
  0x00000103,
434
  0x00000101,
435
  0x00000103,
436
  0x00000303,
437
  0x0300030b,
438
  0x00000301,
439
  0x0000010b,
440
  0x00002003,
441
  0x00000101,
442
  0x00000101,
443
  0x00000101,
444
  0x01040101,
445
  0x00002001,
446
  0x00000101,
447
  0x00000100,
448
  0x00000000,
449
  0x00000000,
450
  0x01042003,
451
  0x01001103,
452
  0x00000303,
453
  0x01000003,
454
  0x010003a0,
455
  0x00001301,
456
};
457
458
0
ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode) {
459
0
  if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
460
0
    return NULL;
461
0
  }
462
0
  return zend_vm_opcodes_names[opcode];
463
0
}
464
0
ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(uint8_t opcode) {
465
0
  if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
466
0
    opcode = ZEND_NOP;
467
0
  }
468
0
  return zend_vm_opcodes_flags[opcode];
469
0
}
470
0
ZEND_API uint8_t zend_get_opcode_id(const char *name, size_t length) {
471
0
  uint8_t opcode;
472
0
  for (opcode = 0; opcode < (sizeof(zend_vm_opcodes_names) / sizeof(zend_vm_opcodes_names[0])) - 1; opcode++) {
473
0
    const char *opcode_name = zend_vm_opcodes_names[opcode];
474
0
    if (opcode_name && strncmp(opcode_name, name, length) == 0) {
475
0
      return opcode;
476
0
    }
477
0
  }
478
0
  return ZEND_VM_LAST_OPCODE + 1;
479
0
}