xref: /PHP-7.4/Zend/zend_vm_opcodes.h (revision 48ca5a1e)
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 #ifndef ZEND_VM_OPCODES_H
22 #define ZEND_VM_OPCODES_H
23 
24 #define ZEND_VM_SPEC		1
25 #define ZEND_VM_LINES		0
26 #define ZEND_VM_KIND_CALL	1
27 #define ZEND_VM_KIND_SWITCH	2
28 #define ZEND_VM_KIND_GOTO	3
29 #define ZEND_VM_KIND_HYBRID	4
30 /* HYBRID requires support for computed GOTO and global register variables*/
31 #if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))
32 # define ZEND_VM_KIND		ZEND_VM_KIND_HYBRID
33 #else
34 # define ZEND_VM_KIND		ZEND_VM_KIND_CALL
35 #endif
36 
37 #define ZEND_VM_OP_SPEC          0x00000001
38 #define ZEND_VM_OP_CONST         0x00000002
39 #define ZEND_VM_OP_TMPVAR        0x00000004
40 #define ZEND_VM_OP_TMPVARCV      0x00000008
41 #define ZEND_VM_OP_MASK          0x000000f0
42 #define ZEND_VM_OP_NUM           0x00000010
43 #define ZEND_VM_OP_JMP_ADDR      0x00000020
44 #define ZEND_VM_OP_TRY_CATCH     0x00000030
45 #define ZEND_VM_OP_THIS          0x00000050
46 #define ZEND_VM_OP_NEXT          0x00000060
47 #define ZEND_VM_OP_CLASS_FETCH   0x00000070
48 #define ZEND_VM_OP_CONSTRUCTOR   0x00000080
49 #define ZEND_VM_OP_CONST_FETCH   0x00000090
50 #define ZEND_VM_OP_CACHE_SLOT    0x000000a0
51 #define ZEND_VM_EXT_VAR_FETCH    0x00010000
52 #define ZEND_VM_EXT_ISSET        0x00020000
53 #define ZEND_VM_EXT_CACHE_SLOT   0x00040000
54 #define ZEND_VM_EXT_ARRAY_INIT   0x00080000
55 #define ZEND_VM_EXT_REF          0x00100000
56 #define ZEND_VM_EXT_FETCH_REF    0x00200000
57 #define ZEND_VM_EXT_DIM_OBJ_WRITE 0x00400000
58 #define ZEND_VM_EXT_MASK         0x0f000000
59 #define ZEND_VM_EXT_NUM          0x01000000
60 #define ZEND_VM_EXT_LAST_CATCH   0x02000000
61 #define ZEND_VM_EXT_JMP_ADDR     0x03000000
62 #define ZEND_VM_EXT_OP           0x04000000
63 #define ZEND_VM_EXT_TYPE         0x07000000
64 #define ZEND_VM_EXT_EVAL         0x08000000
65 #define ZEND_VM_EXT_TYPE_MASK    0x09000000
66 #define ZEND_VM_EXT_SRC          0x0b000000
67 #define ZEND_VM_NO_CONST_CONST   0x40000000
68 #define ZEND_VM_COMMUTATIVE      0x80000000
69 #define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)
70 #define ZEND_VM_OP2_FLAGS(flags) ((flags >> 8) & 0xff)
71 
72 BEGIN_EXTERN_C()
73 
74 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);
75 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);
76 
77 END_EXTERN_C()
78 
79 #define ZEND_NOP                          0
80 #define ZEND_ADD                          1
81 #define ZEND_SUB                          2
82 #define ZEND_MUL                          3
83 #define ZEND_DIV                          4
84 #define ZEND_MOD                          5
85 #define ZEND_SL                           6
86 #define ZEND_SR                           7
87 #define ZEND_CONCAT                       8
88 #define ZEND_BW_OR                        9
89 #define ZEND_BW_AND                      10
90 #define ZEND_BW_XOR                      11
91 #define ZEND_POW                         12
92 #define ZEND_BW_NOT                      13
93 #define ZEND_BOOL_NOT                    14
94 #define ZEND_BOOL_XOR                    15
95 #define ZEND_IS_IDENTICAL                16
96 #define ZEND_IS_NOT_IDENTICAL            17
97 #define ZEND_IS_EQUAL                    18
98 #define ZEND_IS_NOT_EQUAL                19
99 #define ZEND_IS_SMALLER                  20
100 #define ZEND_IS_SMALLER_OR_EQUAL         21
101 #define ZEND_ASSIGN                      22
102 #define ZEND_ASSIGN_DIM                  23
103 #define ZEND_ASSIGN_OBJ                  24
104 #define ZEND_ASSIGN_STATIC_PROP          25
105 #define ZEND_ASSIGN_OP                   26
106 #define ZEND_ASSIGN_DIM_OP               27
107 #define ZEND_ASSIGN_OBJ_OP               28
108 #define ZEND_ASSIGN_STATIC_PROP_OP       29
109 #define ZEND_ASSIGN_REF                  30
110 #define ZEND_QM_ASSIGN                   31
111 #define ZEND_ASSIGN_OBJ_REF              32
112 #define ZEND_ASSIGN_STATIC_PROP_REF      33
113 #define ZEND_PRE_INC                     34
114 #define ZEND_PRE_DEC                     35
115 #define ZEND_POST_INC                    36
116 #define ZEND_POST_DEC                    37
117 #define ZEND_PRE_INC_STATIC_PROP         38
118 #define ZEND_PRE_DEC_STATIC_PROP         39
119 #define ZEND_POST_INC_STATIC_PROP        40
120 #define ZEND_POST_DEC_STATIC_PROP        41
121 #define ZEND_JMP                         42
122 #define ZEND_JMPZ                        43
123 #define ZEND_JMPNZ                       44
124 #define ZEND_JMPZNZ                      45
125 #define ZEND_JMPZ_EX                     46
126 #define ZEND_JMPNZ_EX                    47
127 #define ZEND_CASE                        48
128 #define ZEND_CHECK_VAR                   49
129 #define ZEND_SEND_VAR_NO_REF_EX          50
130 #define ZEND_CAST                        51
131 #define ZEND_BOOL                        52
132 #define ZEND_FAST_CONCAT                 53
133 #define ZEND_ROPE_INIT                   54
134 #define ZEND_ROPE_ADD                    55
135 #define ZEND_ROPE_END                    56
136 #define ZEND_BEGIN_SILENCE               57
137 #define ZEND_END_SILENCE                 58
138 #define ZEND_INIT_FCALL_BY_NAME          59
139 #define ZEND_DO_FCALL                    60
140 #define ZEND_INIT_FCALL                  61
141 #define ZEND_RETURN                      62
142 #define ZEND_RECV                        63
143 #define ZEND_RECV_INIT                   64
144 #define ZEND_SEND_VAL                    65
145 #define ZEND_SEND_VAR_EX                 66
146 #define ZEND_SEND_REF                    67
147 #define ZEND_NEW                         68
148 #define ZEND_INIT_NS_FCALL_BY_NAME       69
149 #define ZEND_FREE                        70
150 #define ZEND_INIT_ARRAY                  71
151 #define ZEND_ADD_ARRAY_ELEMENT           72
152 #define ZEND_INCLUDE_OR_EVAL             73
153 #define ZEND_UNSET_VAR                   74
154 #define ZEND_UNSET_DIM                   75
155 #define ZEND_UNSET_OBJ                   76
156 #define ZEND_FE_RESET_R                  77
157 #define ZEND_FE_FETCH_R                  78
158 #define ZEND_EXIT                        79
159 #define ZEND_FETCH_R                     80
160 #define ZEND_FETCH_DIM_R                 81
161 #define ZEND_FETCH_OBJ_R                 82
162 #define ZEND_FETCH_W                     83
163 #define ZEND_FETCH_DIM_W                 84
164 #define ZEND_FETCH_OBJ_W                 85
165 #define ZEND_FETCH_RW                    86
166 #define ZEND_FETCH_DIM_RW                87
167 #define ZEND_FETCH_OBJ_RW                88
168 #define ZEND_FETCH_IS                    89
169 #define ZEND_FETCH_DIM_IS                90
170 #define ZEND_FETCH_OBJ_IS                91
171 #define ZEND_FETCH_FUNC_ARG              92
172 #define ZEND_FETCH_DIM_FUNC_ARG          93
173 #define ZEND_FETCH_OBJ_FUNC_ARG          94
174 #define ZEND_FETCH_UNSET                 95
175 #define ZEND_FETCH_DIM_UNSET             96
176 #define ZEND_FETCH_OBJ_UNSET             97
177 #define ZEND_FETCH_LIST_R                98
178 #define ZEND_FETCH_CONSTANT              99
179 #define ZEND_CHECK_FUNC_ARG             100
180 #define ZEND_EXT_STMT                   101
181 #define ZEND_EXT_FCALL_BEGIN            102
182 #define ZEND_EXT_FCALL_END              103
183 #define ZEND_EXT_NOP                    104
184 #define ZEND_TICKS                      105
185 #define ZEND_SEND_VAR_NO_REF            106
186 #define ZEND_CATCH                      107
187 #define ZEND_THROW                      108
188 #define ZEND_FETCH_CLASS                109
189 #define ZEND_CLONE                      110
190 #define ZEND_RETURN_BY_REF              111
191 #define ZEND_INIT_METHOD_CALL           112
192 #define ZEND_INIT_STATIC_METHOD_CALL    113
193 #define ZEND_ISSET_ISEMPTY_VAR          114
194 #define ZEND_ISSET_ISEMPTY_DIM_OBJ      115
195 #define ZEND_SEND_VAL_EX                116
196 #define ZEND_SEND_VAR                   117
197 #define ZEND_INIT_USER_CALL             118
198 #define ZEND_SEND_ARRAY                 119
199 #define ZEND_SEND_USER                  120
200 #define ZEND_STRLEN                     121
201 #define ZEND_DEFINED                    122
202 #define ZEND_TYPE_CHECK                 123
203 #define ZEND_VERIFY_RETURN_TYPE         124
204 #define ZEND_FE_RESET_RW                125
205 #define ZEND_FE_FETCH_RW                126
206 #define ZEND_FE_FREE                    127
207 #define ZEND_INIT_DYNAMIC_CALL          128
208 #define ZEND_DO_ICALL                   129
209 #define ZEND_DO_UCALL                   130
210 #define ZEND_DO_FCALL_BY_NAME           131
211 #define ZEND_PRE_INC_OBJ                132
212 #define ZEND_PRE_DEC_OBJ                133
213 #define ZEND_POST_INC_OBJ               134
214 #define ZEND_POST_DEC_OBJ               135
215 #define ZEND_ECHO                       136
216 #define ZEND_OP_DATA                    137
217 #define ZEND_INSTANCEOF                 138
218 #define ZEND_GENERATOR_CREATE           139
219 #define ZEND_MAKE_REF                   140
220 #define ZEND_DECLARE_FUNCTION           141
221 #define ZEND_DECLARE_LAMBDA_FUNCTION    142
222 #define ZEND_DECLARE_CONST              143
223 #define ZEND_DECLARE_CLASS              144
224 #define ZEND_DECLARE_CLASS_DELAYED      145
225 #define ZEND_DECLARE_ANON_CLASS         146
226 #define ZEND_ADD_ARRAY_UNPACK           147
227 #define ZEND_ISSET_ISEMPTY_PROP_OBJ     148
228 #define ZEND_HANDLE_EXCEPTION           149
229 #define ZEND_USER_OPCODE                150
230 #define ZEND_ASSERT_CHECK               151
231 #define ZEND_JMP_SET                    152
232 #define ZEND_UNSET_CV                   153
233 #define ZEND_ISSET_ISEMPTY_CV           154
234 #define ZEND_FETCH_LIST_W               155
235 #define ZEND_SEPARATE                   156
236 #define ZEND_FETCH_CLASS_NAME           157
237 #define ZEND_CALL_TRAMPOLINE            158
238 #define ZEND_DISCARD_EXCEPTION          159
239 #define ZEND_YIELD                      160
240 #define ZEND_GENERATOR_RETURN           161
241 #define ZEND_FAST_CALL                  162
242 #define ZEND_FAST_RET                   163
243 #define ZEND_RECV_VARIADIC              164
244 #define ZEND_SEND_UNPACK                165
245 #define ZEND_YIELD_FROM                 166
246 #define ZEND_COPY_TMP                   167
247 #define ZEND_BIND_GLOBAL                168
248 #define ZEND_COALESCE                   169
249 #define ZEND_SPACESHIP                  170
250 #define ZEND_FUNC_NUM_ARGS              171
251 #define ZEND_FUNC_GET_ARGS              172
252 #define ZEND_FETCH_STATIC_PROP_R        173
253 #define ZEND_FETCH_STATIC_PROP_W        174
254 #define ZEND_FETCH_STATIC_PROP_RW       175
255 #define ZEND_FETCH_STATIC_PROP_IS       176
256 #define ZEND_FETCH_STATIC_PROP_FUNC_ARG 177
257 #define ZEND_FETCH_STATIC_PROP_UNSET    178
258 #define ZEND_UNSET_STATIC_PROP          179
259 #define ZEND_ISSET_ISEMPTY_STATIC_PROP  180
260 #define ZEND_FETCH_CLASS_CONSTANT       181
261 #define ZEND_BIND_LEXICAL               182
262 #define ZEND_BIND_STATIC                183
263 #define ZEND_FETCH_THIS                 184
264 #define ZEND_SEND_FUNC_ARG              185
265 #define ZEND_ISSET_ISEMPTY_THIS         186
266 #define ZEND_SWITCH_LONG                187
267 #define ZEND_SWITCH_STRING              188
268 #define ZEND_IN_ARRAY                   189
269 #define ZEND_COUNT                      190
270 #define ZEND_GET_CLASS                  191
271 #define ZEND_GET_CALLED_CLASS           192
272 #define ZEND_GET_TYPE                   193
273 #define ZEND_ARRAY_KEY_EXISTS           194
274 
275 #define ZEND_VM_LAST_OPCODE             194
276 
277 #endif
278