1 : /*
2 : +----------------------------------------------------------------------+
3 : | Zend Engine |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1998-2009 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@zend.com> |
16 : | Zeev Suraski <zeev@zend.com> |
17 : | Dmitry Stogov <dmitry@zend.com> |
18 : +----------------------------------------------------------------------+
19 : */
20 :
21 : static user_opcode_handler_t zend_user_opcode_handlers[256] = {(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL};
22 :
23 : static zend_uchar zend_user_opcodes[256] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
24 :
25 : static opcode_handler_t zend_vm_get_opcode_handler(zend_uchar opcode, zend_op* op);
26 :
27 :
28 : #define ZEND_VM_CONTINUE() return 0
29 : #define ZEND_VM_RETURN() return 1
30 : #define ZEND_VM_ENTER() return 2
31 : #define ZEND_VM_LEAVE() return 3
32 : #define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
33 :
34 : #define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC
35 : #undef EX
36 : #define EX(element) execute_data->element
37 :
38 :
39 : ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
40 400647 : {
41 : zend_execute_data *execute_data;
42 400647 : zend_bool nested = 0;
43 400647 : zend_bool original_in_execution = EG(in_execution);
44 :
45 :
46 400647 : if (EG(exception)) {
47 1 : return;
48 : }
49 :
50 400646 : EG(in_execution) = 1;
51 :
52 13542532 : zend_vm_enter:
53 : /* Initialize execute_data */
54 13542532 : execute_data = (zend_execute_data *)zend_vm_stack_alloc(
55 : ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) +
56 : ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)) +
57 : ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * op_array->T TSRMLS_CC);
58 :
59 13542532 : EX(CVs) = (zval***)((char*)execute_data + ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)));
60 13542532 : memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
61 13542532 : EX(Ts) = (temp_variable *)(((char*)EX(CVs)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)));
62 13542532 : EX(fbc) = NULL;
63 13542532 : EX(called_scope) = NULL;
64 13542532 : EX(object) = NULL;
65 13542532 : EX(old_error_reporting) = NULL;
66 13542532 : EX(op_array) = op_array;
67 13542532 : EX(symbol_table) = EG(active_symbol_table);
68 13542532 : EX(prev_execute_data) = EG(current_execute_data);
69 13542532 : EG(current_execute_data) = execute_data;
70 13542532 : EX(nested) = nested;
71 13542532 : nested = 1;
72 :
73 13542532 : if (op_array->start_op) {
74 0 : ZEND_VM_SET_OPCODE(op_array->start_op);
75 : } else {
76 13542532 : ZEND_VM_SET_OPCODE(op_array->opcodes);
77 : }
78 :
79 13542532 : if (op_array->this_var != -1 && EG(This)) {
80 434 : Z_ADDREF_P(EG(This)); /* For $this pointer */
81 434 : if (!EG(active_symbol_table)) {
82 434 : EX(CVs)[op_array->this_var] = (zval**)EX(CVs) + (op_array->last_var + op_array->this_var);
83 434 : *EX(CVs)[op_array->this_var] = EG(This);
84 : } else {
85 0 : if (zend_ascii_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), (void**)&EX(CVs)[op_array->this_var])==FAILURE) {
86 0 : Z_DELREF_P(EG(This));
87 : }
88 : }
89 : }
90 :
91 13542532 : EG(opline_ptr) = &EX(opline);
92 :
93 13542532 : EX(function_state).function = (zend_function *) op_array;
94 13542532 : EX(function_state).arguments = NULL;
95 :
96 : while (1) {
97 : int ret;
98 : #ifdef ZEND_WIN32
99 : if (EG(timed_out)) {
100 : zend_timeout(0);
101 : }
102 : #endif
103 :
104 583935605 : if ((ret = EX(opline)->handler(execute_data TSRMLS_CC)) > 0) {
105 26683033 : switch (ret) {
106 : case 1:
107 399434 : EG(in_execution) = original_in_execution;
108 399434 : return;
109 : case 2:
110 13141886 : op_array = EG(active_op_array);
111 13141886 : goto zend_vm_enter;
112 : case 3:
113 13141713 : execute_data = EG(current_execute_data);
114 : default:
115 : break;
116 : }
117 : }
118 :
119 570393073 : }
120 : zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen");
121 : }
122 :
123 : static int ZEND_FASTCALL ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
124 28474589 : {
125 : #if DEBUG_ZEND>=2
126 : printf("Jumping to %d\n", EX(opline)->op1.u.opline_num);
127 : #endif
128 28474589 : ZEND_VM_SET_OPCODE(EX(opline)->op1.u.jmp_addr);
129 28474589 : ZEND_VM_CONTINUE(); /* CHECK_ME */
130 : }
131 :
132 : static int ZEND_FASTCALL ZEND_INIT_STRING_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
133 0 : {
134 0 : zval *tmp = &EX_T(EX(opline)->result.u.var).tmp_var;
135 :
136 0 : if (EX(opline)->extended_value == IS_UNICODE) {
137 0 : Z_USTRVAL_P(tmp) = eumalloc(1);
138 0 : Z_USTRVAL_P(tmp)[0] = 0;
139 0 : Z_USTRLEN_P(tmp) = 0;
140 0 : Z_TYPE_P(tmp) = IS_UNICODE;
141 : } else {
142 0 : Z_STRVAL_P(tmp) = emalloc(1);
143 0 : Z_STRVAL_P(tmp)[0] = 0;
144 0 : Z_STRLEN_P(tmp) = 0;
145 0 : Z_TYPE_P(tmp) = IS_STRING;
146 : }
147 0 : Z_SET_REFCOUNT_P(tmp, 1);
148 0 : Z_UNSET_ISREF_P(tmp);
149 0 : ZEND_VM_NEXT_OPCODE();
150 : }
151 :
152 : static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
153 13541147 : {
154 : zend_bool nested;
155 13541147 : zend_op_array *op_array = EX(op_array);
156 :
157 13541147 : EG(current_execute_data) = EX(prev_execute_data);
158 13541147 : EG(opline_ptr) = NULL;
159 13541147 : if (!EG(active_symbol_table)) {
160 13483215 : zval ***cv = EX(CVs);
161 13483215 : zval ***end = cv + EX(op_array)->last_var;
162 142951545 : while (cv != end) {
163 115985115 : if (*cv) {
164 89958587 : zval_ptr_dtor(*cv);
165 : }
166 115985115 : cv++;
167 : }
168 : }
169 :
170 13541147 : nested = EX(nested);
171 :
172 13541147 : zend_vm_stack_free(execute_data TSRMLS_CC);
173 :
174 13541147 : if (nested) {
175 13141713 : execute_data = EG(current_execute_data);
176 :
177 13141713 : if (EX(call_opline)->opcode == ZEND_INCLUDE_OR_EVAL) {
178 :
179 8133 : EX(function_state).function = (zend_function *) EX(op_array);
180 8133 : EX(function_state).arguments = NULL;
181 8133 : EX(object) = EX(current_object);
182 :
183 8133 : if (RETURN_VALUE_USED(EX(call_opline))) {
184 427 : if (!EX_T(EX(call_opline)->result.u.var).var.ptr) { /* there was no return statement */
185 0 : ALLOC_ZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
186 0 : INIT_PZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
187 0 : Z_LVAL_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = 1;
188 0 : Z_TYPE_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = IS_BOOL;
189 : }
190 : }
191 :
192 8133 : EG(opline_ptr) = &EX(opline);
193 8133 : EG(active_op_array) = EX(op_array);
194 8133 : EG(return_value_ptr_ptr) = EX(original_return_value);
195 8133 : destroy_op_array(op_array TSRMLS_CC);
196 8133 : efree(op_array);
197 8133 : if (EG(exception)) {
198 18 : zend_throw_exception_internal(NULL TSRMLS_CC);
199 : }
200 :
201 8133 : EX(opline)++;
202 8133 : ZEND_VM_LEAVE();
203 : } else {
204 :
205 13133580 : EG(opline_ptr) = &EX(opline);
206 13133580 : EG(active_op_array) = EX(op_array);
207 13133580 : EG(return_value_ptr_ptr) = EX(original_return_value);
208 13133580 : if (EG(active_symbol_table)) {
209 33921 : if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
210 0 : zend_hash_destroy(EG(active_symbol_table));
211 0 : FREE_HASHTABLE(EG(active_symbol_table));
212 : } else {
213 : /* clean before putting into the cache, since clean
214 : could call dtors, which could use cached hash */
215 33921 : zend_hash_clean(EG(active_symbol_table));
216 33921 : *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
217 : }
218 : }
219 13133580 : EG(active_symbol_table) = EX(symbol_table);
220 :
221 13133580 : EX(function_state).function = (zend_function *) EX(op_array);
222 13133580 : EX(function_state).arguments = NULL;
223 :
224 13133580 : if (EG(This)) {
225 2594 : if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
226 20 : if (IS_CTOR_USED(EX(called_scope))) {
227 17 : Z_DELREF_P(EG(This));
228 : }
229 20 : if (Z_REFCOUNT_P(EG(This)) == 1) {
230 19 : zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
231 : }
232 : }
233 2594 : zval_ptr_dtor(&EG(This));
234 : }
235 13133580 : EG(This) = EX(current_this);
236 13133580 : EG(scope) = EX(current_scope);
237 13133580 : EG(called_scope) = EX(current_called_scope);
238 :
239 13133580 : EX(object) = EX(current_object);
240 13133580 : EX(called_scope) = DECODE_CTOR(EX(called_scope));
241 :
242 13133580 : zend_vm_stack_clear_multiple(TSRMLS_C);
243 :
244 13133580 : if (EG(exception)) {
245 147 : zend_throw_exception_internal(NULL TSRMLS_CC);
246 147 : if (RETURN_VALUE_USED(EX(call_opline)) && EX_T(EX(call_opline)->result.u.var).var.ptr) {
247 0 : zval_ptr_dtor(&EX_T(EX(call_opline)->result.u.var).var.ptr);
248 : }
249 : }
250 :
251 13133580 : EX(opline)++;
252 13133580 : ZEND_VM_LEAVE();
253 : }
254 : }
255 399434 : ZEND_VM_RETURN();
256 : }
257 :
258 : static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
259 35644162 : {
260 35644162 : zend_op *opline = EX(opline);
261 35644162 : zend_bool should_change_scope = 0;
262 :
263 35644162 : if (EX(function_state).function->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
264 9 : if (EX(function_state).function->common.fn_flags & ZEND_ACC_ABSTRACT) {
265 : /* FIXME: output identifiers properly */
266 1 : zend_error_noreturn(E_ERROR, "Cannot call abstract method %v::%v()", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
267 : ZEND_VM_NEXT_OPCODE(); /* Never reached */
268 : }
269 8 : if (EX(function_state).function->common.fn_flags & ZEND_ACC_DEPRECATED) {
270 8 : zend_error(E_DEPRECATED, "Function %v%s%v() is deprecated",
271 : EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name : EMPTY_ZSTR,
272 : EX(function_state).function->common.scope ? "::" : "",
273 : EX(function_state).function->common.function_name);
274 : }
275 : }
276 35644161 : if (EX(function_state).function->common.scope &&
277 : !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC) &&
278 : !EX(object)) {
279 :
280 31 : if (EX(function_state).function->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
281 : /* FIXME: output identifiers properly */
282 22 : zend_error(E_STRICT, "Non-static method %v::%v() should not be called statically", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
283 : } else {
284 : /* FIXME: output identifiers properly */
285 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
286 9 : zend_error_noreturn(E_ERROR, "Non-static method %v::%v() cannot be called statically", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
287 : }
288 : }
289 :
290 35644152 : if (EX(function_state).function->type == ZEND_USER_FUNCTION ||
291 : EX(function_state).function->common.scope) {
292 13364640 : should_change_scope = 1;
293 13364640 : EX(current_this) = EG(This);
294 13364640 : EX(current_scope) = EG(scope);
295 13364640 : EX(current_called_scope) = EG(called_scope);
296 13364640 : EG(This) = EX(object);
297 13364640 : EG(scope) = (EX(function_state).function->type == ZEND_USER_FUNCTION || !EX(object)) ? EX(function_state).function->common.scope : NULL;
298 13364640 : EG(called_scope) = EX(called_scope);
299 : }
300 :
301 35644152 : zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
302 35644152 : EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
303 :
304 35644152 : if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
305 22510436 : ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
306 22510436 : EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
307 22510436 : EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
308 :
309 22510436 : if (EX(function_state).function->common.arg_info) {
310 22422782 : zend_uint i=0;
311 22422782 : zval **p = (zval**)EX(function_state).arguments;
312 22422782 : ulong arg_count = opline->extended_value;
313 :
314 84792706 : while (arg_count>0) {
315 39947152 : zend_verify_arg_type(EX(function_state).function, ++i, *(p-arg_count), 0 TSRMLS_CC);
316 39947142 : arg_count--;
317 : }
318 : }
319 22510426 : if (!zend_execute_internal) {
320 : /* saves one function call if zend_execute_internal is not used */
321 22510426 : ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, &EX_T(opline->result.u.var).var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
322 : } else {
323 0 : zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
324 : }
325 :
326 22510294 : if (!RETURN_VALUE_USED(opline)) {
327 1129738 : zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
328 : }
329 13133716 : } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
330 13133716 : EX(original_return_value) = EG(return_value_ptr_ptr);
331 13133716 : EG(active_symbol_table) = NULL;
332 13133716 : EG(active_op_array) = &EX(function_state).function->op_array;
333 13133716 : EG(return_value_ptr_ptr) = NULL;
334 13133716 : if (RETURN_VALUE_USED(opline)) {
335 13013154 : EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
336 13013154 : EX_T(opline->result.u.var).var.ptr = NULL;
337 13013154 : EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
338 13013154 : EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
339 : }
340 :
341 13133716 : if (zend_execute == execute && !EG(exception)) {
342 13133715 : EX(call_opline) = opline;
343 13133715 : ZEND_VM_ENTER();
344 : } else {
345 1 : zend_execute(EG(active_op_array) TSRMLS_CC);
346 : }
347 :
348 1 : EG(opline_ptr) = &EX(opline);
349 1 : EG(active_op_array) = EX(op_array);
350 1 : EG(return_value_ptr_ptr) = EX(original_return_value);
351 1 : if (EG(active_symbol_table)) {
352 0 : if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
353 0 : zend_hash_destroy(EG(active_symbol_table));
354 0 : FREE_HASHTABLE(EG(active_symbol_table));
355 : } else {
356 : /* clean before putting into the cache, since clean
357 : could call dtors, which could use cached hash */
358 0 : zend_hash_clean(EG(active_symbol_table));
359 0 : *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
360 : }
361 : }
362 1 : EG(active_symbol_table) = EX(symbol_table);
363 : } else { /* ZEND_OVERLOADED_FUNCTION */
364 0 : ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
365 :
366 : /* Not sure what should be done here if it's a static method */
367 0 : if (EX(object)) {
368 0 : Z_OBJ_HT_P(EX(object))->call_method(EX(function_state).function->common.function_name, opline->extended_value, EX_T(opline->result.u.var).var.ptr, &EX_T(opline->result.u.var).var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
369 : } else {
370 0 : zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
371 : }
372 :
373 0 : if (EX(function_state).function->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
374 0 : efree(EX(function_state).function->common.function_name.v);
375 : }
376 0 : efree(EX(function_state).function);
377 :
378 0 : if (!RETURN_VALUE_USED(opline)) {
379 0 : zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
380 : } else {
381 0 : Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
382 0 : Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
383 0 : EX_T(opline->result.u.var).var.fcall_returned_reference = 0;
384 0 : EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
385 : }
386 : }
387 :
388 22510295 : EX(function_state).function = (zend_function *) EX(op_array);
389 22510295 : EX(function_state).arguments = NULL;
390 :
391 22510295 : if (should_change_scope) {
392 230779 : if (EG(This)) {
393 230328 : if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
394 299 : if (IS_CTOR_USED(EX(called_scope))) {
395 241 : Z_DELREF_P(EG(This));
396 : }
397 299 : if (Z_REFCOUNT_P(EG(This)) == 1) {
398 299 : zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
399 : }
400 : }
401 230328 : zval_ptr_dtor(&EG(This));
402 : }
403 230779 : EG(This) = EX(current_this);
404 230779 : EG(scope) = EX(current_scope);
405 230779 : EG(called_scope) = EX(current_called_scope);
406 : }
407 :
408 22510295 : EX(object) = EX(current_object);
409 22510295 : EX(called_scope) = DECODE_CTOR(EX(called_scope));
410 :
411 22510295 : zend_vm_stack_clear_multiple(TSRMLS_C);
412 :
413 22510295 : if (EG(exception)) {
414 900 : zend_throw_exception_internal(NULL TSRMLS_CC);
415 900 : if (RETURN_VALUE_USED(opline) && EX_T(opline->result.u.var).var.ptr) {
416 252 : zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
417 : }
418 : }
419 :
420 22510295 : ZEND_VM_NEXT_OPCODE();
421 : }
422 :
423 : static int ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
424 6128757 : {
425 6128757 : EX(function_state).function = EX(fbc);
426 6128757 : return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
427 : }
428 :
429 : static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
430 74020361 : {
431 74020361 : zend_op *opline = EX(opline);
432 74020361 : zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
433 74020361 : zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
434 :
435 74020361 : if (param == NULL) {
436 : char *space;
437 70 : zstr class_name = get_active_class_name(&space TSRMLS_CC);
438 70 : zend_execute_data *ptr = EX(prev_execute_data);
439 :
440 70 : if (zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL, opline->extended_value TSRMLS_CC)) {
441 78 : if(ptr && ptr->op_array) {
442 12 : zend_error(E_WARNING, "Missing argument %ld for %v%s%v(), called in %s on line %d and defined", Z_LVAL(opline->op1.u.constant), class_name, space, get_active_function_name(TSRMLS_C), ptr->op_array->filename, ptr->opline->lineno);
443 : } else {
444 54 : zend_error(E_WARNING, "Missing argument %ld for %v%s%v()", Z_LVAL(opline->op1.u.constant), class_name, space, get_active_function_name(TSRMLS_C));
445 : }
446 : }
447 67 : if (opline->result.op_type == IS_VAR) {
448 0 : PZVAL_UNLOCK_FREE(*EX_T(opline->result.u.var).var.ptr_ptr);
449 : }
450 : } else {
451 : zend_free_op free_res;
452 : zval **var_ptr;
453 :
454 74020291 : zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC);
455 74020278 : var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
456 74020278 : Z_DELREF_PP(var_ptr);
457 74020278 : *var_ptr = *param;
458 74020278 : Z_ADDREF_PP(var_ptr);
459 : }
460 :
461 74020345 : ZEND_VM_NEXT_OPCODE();
462 : }
463 :
464 : static int ZEND_FASTCALL ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
465 114761 : {
466 114761 : zend_op *opline = EX(opline);
467 : zval *object_zval;
468 : zend_function *constructor;
469 :
470 114761 : if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
471 : char *class_type;
472 :
473 6 : if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
474 2 : class_type = "interface";
475 : } else {
476 4 : class_type = "abstract class";
477 : }
478 6 : zend_error_noreturn(E_ERROR, "Cannot instantiate %s %v", class_type, EX_T(opline->op1.u.var).class_entry->name);
479 : }
480 114755 : ALLOC_ZVAL(object_zval);
481 114755 : object_init_ex(object_zval, EX_T(opline->op1.u.var).class_entry);
482 114754 : INIT_PZVAL(object_zval);
483 :
484 114754 : constructor = Z_OBJ_HT_P(object_zval)->get_constructor(object_zval TSRMLS_CC);
485 :
486 114749 : if (constructor == NULL) {
487 106731 : if (RETURN_VALUE_USED(opline)) {
488 106720 : AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
489 : } else {
490 11 : zval_ptr_dtor(&object_zval);
491 : }
492 106731 : ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num);
493 : } else {
494 8018 : if (RETURN_VALUE_USED(opline)) {
495 7884 : AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
496 7884 : PZVAL_LOCK(object_zval);
497 : }
498 :
499 8018 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), ENCODE_CTOR(EX(called_scope), RETURN_VALUE_USED(opline)));
500 :
501 : /* We are not handling overloaded classes right now */
502 8018 : EX(object) = object_zval;
503 8018 : EX(fbc) = constructor;
504 8018 : EX(called_scope) = EX_T(opline->op1.u.var).class_entry;
505 :
506 8018 : ZEND_VM_NEXT_OPCODE();
507 : }
508 : }
509 :
510 : static int ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
511 6959699 : {
512 6959699 : zend_op *opline = EX(opline);
513 :
514 6959699 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = EG(error_reporting);
515 6959699 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG; /* shouldn't be necessary */
516 6959699 : if (EX(old_error_reporting) == NULL) {
517 6959687 : EX(old_error_reporting) = &EX_T(opline->result.u.var).tmp_var;
518 : }
519 :
520 6959699 : if (EG(error_reporting)) {
521 1149881 : zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
522 : }
523 6959699 : ZEND_VM_NEXT_OPCODE();
524 : }
525 :
526 : static int ZEND_FASTCALL ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
527 0 : {
528 0 : zend_error_noreturn(E_ERROR, "Cannot call abstract method %v::%v()", EG(scope)->name, EX(op_array)->function_name);
529 : ZEND_VM_NEXT_OPCODE(); /* Never reached */
530 : }
531 :
532 : static int ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
533 0 : {
534 0 : if (!EG(no_extensions)) {
535 0 : zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(op_array) TSRMLS_CC);
536 : }
537 0 : ZEND_VM_NEXT_OPCODE();
538 : }
539 :
540 : static int ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
541 0 : {
542 0 : if (!EG(no_extensions)) {
543 0 : zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(op_array) TSRMLS_CC);
544 : }
545 0 : ZEND_VM_NEXT_OPCODE();
546 : }
547 :
548 : static int ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
549 0 : {
550 0 : if (!EG(no_extensions)) {
551 0 : zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(op_array) TSRMLS_CC);
552 : }
553 0 : ZEND_VM_NEXT_OPCODE();
554 : }
555 :
556 : static int ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
557 239 : {
558 239 : zend_op *opline = EX(opline);
559 :
560 239 : EX_T(opline->result.u.var).class_entry = do_bind_class(opline, EG(class_table), 0 TSRMLS_CC);
561 237 : ZEND_VM_NEXT_OPCODE();
562 : }
563 :
564 : static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
565 1100 : {
566 1100 : zend_op *opline = EX(opline);
567 :
568 1100 : EX_T(opline->result.u.var).class_entry = do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
569 1098 : ZEND_VM_NEXT_OPCODE();
570 : }
571 :
572 : static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
573 0 : {
574 0 : zend_op *opline = EX(opline);
575 : zend_class_entry **pce, **pce_orig;
576 :
577 0 : if (zend_hash_find(EG(class_table), Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void**)&pce) == FAILURE ||
578 : (zend_hash_find(EG(class_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), (void**)&pce_orig) == SUCCESS &&
579 : *pce != *pce_orig)) {
580 0 : do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
581 : }
582 0 : ZEND_VM_NEXT_OPCODE();
583 : }
584 :
585 : static int ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
586 1928 : {
587 1928 : do_bind_function(EX(opline), EG(function_table), 0);
588 1928 : ZEND_VM_NEXT_OPCODE();
589 : }
590 :
591 : static int ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
592 0 : {
593 0 : ZEND_VM_NEXT_OPCODE();
594 : }
595 :
596 : static int ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
597 10310 : {
598 10310 : ZEND_VM_NEXT_OPCODE();
599 : }
600 :
601 : static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
602 1359 : {
603 1359 : zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes;
604 : int i;
605 : zend_uint catch_op_num;
606 1359 : int catched = 0;
607 : zval restored_error_reporting;
608 :
609 : void **stack_frame = (void**)(((char*)EX(Ts)) +
610 1359 : (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * EX(op_array)->T));
611 :
612 2780 : while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
613 62 : zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
614 62 : zval_ptr_dtor(&stack_zval_p);
615 : }
616 :
617 3736 : for (i=0; i<EG(active_op_array)->last_try_catch; i++) {
618 2749 : if (EG(active_op_array)->try_catch_array[i].try_op > op_num) {
619 : /* further blocks will not be relevant... */
620 372 : break;
621 : }
622 2377 : if (op_num >= EG(active_op_array)->try_catch_array[i].try_op
623 : && op_num < EG(active_op_array)->try_catch_array[i].catch_op) {
624 983 : catched = 1;
625 983 : catch_op_num = EX(op_array)->try_catch_array[i].catch_op;
626 : }
627 : }
628 :
629 2737 : while (EX(fbc)) {
630 19 : EX(called_scope) = (zend_class_entry*)zend_ptr_stack_pop(&EG(arg_types_stack));
631 19 : if (EX(object)) {
632 10 : if (IS_CTOR_CALL(EX(called_scope))) {
633 3 : if (IS_CTOR_USED(EX(called_scope))) {
634 2 : Z_DELREF_P(EX(object));
635 : }
636 3 : if (Z_REFCOUNT_P(EX(object)) == 1) {
637 3 : zend_object_store_ctor_failed(EX(object) TSRMLS_CC);
638 : }
639 : }
640 10 : zval_ptr_dtor(&EX(object));
641 : }
642 19 : EX(called_scope) = DECODE_CTOR(EX(called_scope));
643 19 : zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
644 : }
645 :
646 1787 : for (i=0; i<EX(op_array)->last_brk_cont; i++) {
647 539 : if (EX(op_array)->brk_cont_array[i].start < 0) {
648 84 : continue;
649 455 : } else if (EX(op_array)->brk_cont_array[i].start > op_num) {
650 : /* further blocks will not be relevant... */
651 111 : break;
652 344 : } else if (op_num < EX(op_array)->brk_cont_array[i].brk) {
653 225 : if (!catched ||
654 : catch_op_num >= EX(op_array)->brk_cont_array[i].brk) {
655 8 : zend_op *brk_opline = &EX(op_array)->opcodes[EX(op_array)->brk_cont_array[i].brk];
656 :
657 8 : switch (brk_opline->opcode) {
658 : case ZEND_SWITCH_FREE:
659 7 : if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
660 7 : zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
661 : }
662 7 : break;
663 : case ZEND_FREE:
664 0 : if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
665 0 : zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
666 : }
667 : break;
668 : }
669 : }
670 : }
671 : }
672 :
673 : /* restore previous error_reporting value */
674 1359 : if (!EG(error_reporting) && EX(old_error_reporting) != NULL && Z_LVAL_P(EX(old_error_reporting)) != 0) {
675 13 : Z_TYPE(restored_error_reporting) = IS_LONG;
676 13 : Z_LVAL(restored_error_reporting) = Z_LVAL_P(EX(old_error_reporting));
677 13 : convert_to_string(&restored_error_reporting);
678 13 : zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), Z_STRVAL(restored_error_reporting), Z_STRLEN(restored_error_reporting), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
679 13 : zendi_zval_dtor(restored_error_reporting);
680 : }
681 1359 : EX(old_error_reporting) = NULL;
682 :
683 1359 : if (!catched) {
684 393 : return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
685 : } else {
686 966 : ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
687 966 : ZEND_VM_CONTINUE();
688 : }
689 : }
690 :
691 : static int ZEND_FASTCALL ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
692 214 : {
693 214 : zend_verify_abstract_class(EX_T(EX(opline)->op1.u.var).class_entry TSRMLS_CC);
694 209 : ZEND_VM_NEXT_OPCODE();
695 : }
696 :
697 : static int ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
698 0 : {
699 0 : int ret = zend_user_opcode_handlers[EX(opline)->opcode](ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL);
700 :
701 0 : switch (ret) {
702 : case ZEND_USER_OPCODE_CONTINUE:
703 0 : ZEND_VM_CONTINUE();
704 : case ZEND_USER_OPCODE_RETURN:
705 0 : return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
706 : case ZEND_USER_OPCODE_ENTER:
707 0 : ZEND_VM_ENTER();
708 : case ZEND_USER_OPCODE_LEAVE:
709 0 : ZEND_VM_LEAVE();
710 : case ZEND_USER_OPCODE_DISPATCH:
711 0 : ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
712 : default:
713 0 : ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), EX(opline));
714 : }
715 : }
716 :
717 : static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
718 116245 : {
719 116245 : zend_op *opline = EX(opline);
720 :
721 : if (IS_CONST == IS_UNUSED) {
722 : EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
723 : ZEND_VM_NEXT_OPCODE();
724 : } else {
725 :
726 116245 : zval *class_name = &opline->op2.u.constant;
727 :
728 : if (IS_CONST != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
729 : EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
730 116245 : } else if (Z_TYPE_P(class_name) == IS_STRING ||
731 : Z_TYPE_P(class_name) == IS_UNICODE) {
732 116245 : EX_T(opline->result.u.var).class_entry = zend_u_fetch_class(Z_TYPE_P(class_name), Z_UNIVAL_P(class_name), Z_UNILEN_P(class_name), opline->extended_value TSRMLS_CC);
733 : } else {
734 0 : zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
735 : }
736 :
737 116235 : ZEND_VM_NEXT_OPCODE();
738 : }
739 : }
740 :
741 : static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
742 5879279 : {
743 5879279 : zend_op *opline = EX(opline);
744 : zval *function_name;
745 : zstr function_name_strval, lcname;
746 : unsigned int function_name_strlen, lcname_len;
747 :
748 :
749 5879279 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
750 :
751 : if (IS_CONST == IS_CONST) {
752 5879279 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc)) == FAILURE) {
753 21 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
754 : }
755 : } else {
756 : function_name = &opline->op2.u.constant;
757 :
758 : if (IS_CONST != IS_CONST &&
759 : Z_TYPE_P(function_name) == IS_OBJECT &&
760 : Z_OBJ_HANDLER_P(function_name, get_closure) &&
761 : Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
762 : if (EX(object)) {
763 : Z_ADDREF_P(EX(object));
764 : }
765 :
766 : ZEND_VM_NEXT_OPCODE();
767 : }
768 :
769 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
770 : zend_error_noreturn(E_ERROR, "Function name must be a string");
771 : }
772 : function_name_strval = Z_UNIVAL_P(function_name);
773 : function_name_strlen = Z_UNILEN_P(function_name);
774 : if (Z_TYPE_P(function_name) == IS_UNICODE &&
775 : function_name_strval.u[0] == '\\') {
776 : function_name_strlen -= 1;
777 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.u+1), function_name_strlen, 1, &lcname_len);
778 : } else if (Z_TYPE_P(function_name) == IS_STRING &&
779 : function_name_strval.s[0] == '\\') {
780 : function_name_strlen -= 1;
781 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.s+1), function_name_strlen, 1, &lcname_len);
782 : } else {
783 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), function_name_strval, function_name_strlen, 1, &lcname_len);
784 : }
785 : if (zend_u_hash_find(EG(function_table), Z_TYPE_P(function_name), lcname, lcname_len+1, (void **) &EX(fbc)) == FAILURE) {
786 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE_P(function_name), Z_UNIVAL_P(function_name));
787 : }
788 : efree(lcname.v);
789 :
790 : }
791 :
792 5879258 : EX(object) = NULL;
793 :
794 5879258 : ZEND_VM_NEXT_OPCODE();
795 : }
796 :
797 : static int ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
798 273 : {
799 273 : zend_op *opline = EX(opline);
800 273 : zend_op *op_data = opline + 1;
801 :
802 273 : ZEND_VM_INC_OPCODE();
803 273 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
804 :
805 273 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc))==FAILURE) {
806 : zstr short_name;
807 224 : if(Z_TYPE(opline->op1.u.constant) == IS_UNICODE) {
808 224 : short_name.u = Z_USTRVAL(opline->op1.u.constant)+Z_LVAL(op_data->op1.u.constant);
809 : } else {
810 0 : short_name.s = Z_STRVAL(opline->op1.u.constant)+Z_LVAL(op_data->op1.u.constant);
811 : }
812 224 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), short_name, Z_UNILEN(opline->op1.u.constant)-Z_LVAL(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==FAILURE) {
813 0 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE(opline->op2.u.constant), Z_USTRVAL(opline->op2.u.constant));
814 : }
815 : }
816 :
817 273 : EX(object) = NULL;
818 273 : ZEND_VM_NEXT_OPCODE();
819 : }
820 :
821 : static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
822 133045 : {
823 133045 : zend_op *opline = EX(opline);
824 : zval *assignment_value;
825 133045 : zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
826 : zend_free_op free_res;
827 133045 : zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
828 : zval **var_ptr;
829 :
830 133045 : if (param == NULL) {
831 41021 : ALLOC_ZVAL(assignment_value);
832 41021 : *assignment_value = opline->op2.u.constant;
833 41096 : if ((Z_TYPE(opline->op2.u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) {
834 95 : Z_SET_REFCOUNT_P(assignment_value, 1);
835 95 : zval_update_constant(&assignment_value, 0 TSRMLS_CC);
836 : } else {
837 40926 : zval_copy_ctor(assignment_value);
838 : }
839 41001 : INIT_PZVAL(assignment_value);
840 : } else {
841 92024 : assignment_value = *param;
842 92024 : Z_ADDREF_P(assignment_value);
843 : }
844 :
845 133025 : zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
846 133023 : var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
847 133023 : Z_DELREF_PP(var_ptr);
848 133023 : *var_ptr = assignment_value;
849 :
850 133023 : ZEND_VM_NEXT_OPCODE();
851 : }
852 :
853 : static int ZEND_FASTCALL ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
854 18684 : {
855 18684 : zend_op *opline = EX(opline);
856 : zend_brk_cont_element *el;
857 :
858 18684 : el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
859 : EX(op_array), EX(Ts) TSRMLS_CC);
860 18684 : ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
861 : }
862 :
863 : static int ZEND_FASTCALL ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
864 62280 : {
865 62280 : zend_op *opline = EX(opline);
866 : zend_brk_cont_element *el;
867 :
868 62280 : el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
869 : EX(op_array), EX(Ts) TSRMLS_CC);
870 62280 : ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
871 : }
872 :
873 : static int ZEND_FASTCALL ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
874 2 : {
875 : zend_op *brk_opline;
876 2 : zend_op *opline = EX(opline);
877 : zend_brk_cont_element *el;
878 :
879 2 : el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->extended_value,
880 : EX(op_array), EX(Ts) TSRMLS_CC);
881 :
882 2 : brk_opline = EX(op_array)->opcodes + el->brk;
883 :
884 2 : switch (brk_opline->opcode) {
885 : case ZEND_SWITCH_FREE:
886 1 : if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
887 1 : zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
888 : }
889 1 : break;
890 : case ZEND_FREE:
891 0 : if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
892 0 : zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
893 : }
894 : break;
895 : }
896 2 : ZEND_VM_JMP(opline->op1.u.jmp_addr);
897 : }
898 :
899 : static int ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
900 300 : {
901 300 : zend_op *opline = EX(opline);
902 300 : zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
903 300 : zend_class_entry *iface = zend_u_fetch_class(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
904 :
905 298 : if (iface) {
906 297 : if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
907 3 : zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);
908 : }
909 294 : zend_do_implement_interface(ce, iface TSRMLS_CC);
910 : }
911 :
912 280 : ZEND_VM_NEXT_OPCODE();
913 : }
914 :
915 : static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
916 0 : {
917 0 : zend_op *opline = EX(opline);
918 :
919 : if (IS_TMP_VAR == IS_UNUSED) {
920 : EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
921 : ZEND_VM_NEXT_OPCODE();
922 : } else {
923 : zend_free_op free_op2;
924 0 : zval *class_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
925 :
926 0 : if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
927 0 : EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
928 0 : } else if (Z_TYPE_P(class_name) == IS_STRING ||
929 : Z_TYPE_P(class_name) == IS_UNICODE) {
930 0 : EX_T(opline->result.u.var).class_entry = zend_u_fetch_class(Z_TYPE_P(class_name), Z_UNIVAL_P(class_name), Z_UNILEN_P(class_name), opline->extended_value TSRMLS_CC);
931 : } else {
932 0 : zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
933 : }
934 0 : zval_dtor(free_op2.var);
935 0 : ZEND_VM_NEXT_OPCODE();
936 : }
937 : }
938 :
939 : static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
940 0 : {
941 0 : zend_op *opline = EX(opline);
942 : zval *function_name;
943 : zstr function_name_strval, lcname;
944 : unsigned int function_name_strlen, lcname_len;
945 : zend_free_op free_op2;
946 :
947 0 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
948 :
949 : if (IS_TMP_VAR == IS_CONST) {
950 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc)) == FAILURE) {
951 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
952 : }
953 : } else {
954 0 : function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
955 :
956 0 : if (IS_TMP_VAR != IS_CONST &&
957 : Z_TYPE_P(function_name) == IS_OBJECT &&
958 : Z_OBJ_HANDLER_P(function_name, get_closure) &&
959 : Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
960 0 : if (EX(object)) {
961 0 : Z_ADDREF_P(EX(object));
962 : }
963 0 : zval_dtor(free_op2.var);
964 0 : ZEND_VM_NEXT_OPCODE();
965 : }
966 :
967 0 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
968 0 : zend_error_noreturn(E_ERROR, "Function name must be a string");
969 : }
970 0 : function_name_strval = Z_UNIVAL_P(function_name);
971 0 : function_name_strlen = Z_UNILEN_P(function_name);
972 0 : if (Z_TYPE_P(function_name) == IS_UNICODE &&
973 : function_name_strval.u[0] == '\\') {
974 0 : function_name_strlen -= 1;
975 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.u+1), function_name_strlen, 1, &lcname_len);
976 0 : } else if (Z_TYPE_P(function_name) == IS_STRING &&
977 : function_name_strval.s[0] == '\\') {
978 0 : function_name_strlen -= 1;
979 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.s+1), function_name_strlen, 1, &lcname_len);
980 : } else {
981 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), function_name_strval, function_name_strlen, 1, &lcname_len);
982 : }
983 0 : if (zend_u_hash_find(EG(function_table), Z_TYPE_P(function_name), lcname, lcname_len+1, (void **) &EX(fbc)) == FAILURE) {
984 0 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE_P(function_name), Z_UNIVAL_P(function_name));
985 : }
986 0 : efree(lcname.v);
987 0 : zval_dtor(free_op2.var);
988 : }
989 :
990 0 : EX(object) = NULL;
991 :
992 0 : ZEND_VM_NEXT_OPCODE();
993 : }
994 :
995 : static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
996 7 : {
997 7 : zend_op *opline = EX(opline);
998 :
999 : if (IS_VAR == IS_UNUSED) {
1000 : EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1001 : ZEND_VM_NEXT_OPCODE();
1002 : } else {
1003 : zend_free_op free_op2;
1004 7 : zval *class_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
1005 :
1006 7 : if (IS_VAR != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
1007 2 : EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
1008 10 : } else if (Z_TYPE_P(class_name) == IS_STRING ||
1009 : Z_TYPE_P(class_name) == IS_UNICODE) {
1010 5 : EX_T(opline->result.u.var).class_entry = zend_u_fetch_class(Z_TYPE_P(class_name), Z_UNIVAL_P(class_name), Z_UNILEN_P(class_name), opline->extended_value TSRMLS_CC);
1011 : } else {
1012 0 : zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1013 : }
1014 7 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1015 7 : ZEND_VM_NEXT_OPCODE();
1016 : }
1017 : }
1018 :
1019 : static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1020 20 : {
1021 20 : zend_op *opline = EX(opline);
1022 : zval *function_name;
1023 : zstr function_name_strval, lcname;
1024 : unsigned int function_name_strlen, lcname_len;
1025 : zend_free_op free_op2;
1026 :
1027 20 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1028 :
1029 : if (IS_VAR == IS_CONST) {
1030 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc)) == FAILURE) {
1031 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
1032 : }
1033 : } else {
1034 20 : function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
1035 :
1036 20 : if (IS_VAR != IS_CONST &&
1037 : Z_TYPE_P(function_name) == IS_OBJECT &&
1038 : Z_OBJ_HANDLER_P(function_name, get_closure) &&
1039 : Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1040 5 : if (EX(object)) {
1041 2 : Z_ADDREF_P(EX(object));
1042 : }
1043 5 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1044 5 : ZEND_VM_NEXT_OPCODE();
1045 : }
1046 :
1047 15 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
1048 1 : zend_error_noreturn(E_ERROR, "Function name must be a string");
1049 : }
1050 14 : function_name_strval = Z_UNIVAL_P(function_name);
1051 14 : function_name_strlen = Z_UNILEN_P(function_name);
1052 14 : if (Z_TYPE_P(function_name) == IS_UNICODE &&
1053 : function_name_strval.u[0] == '\\') {
1054 0 : function_name_strlen -= 1;
1055 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.u+1), function_name_strlen, 1, &lcname_len);
1056 14 : } else if (Z_TYPE_P(function_name) == IS_STRING &&
1057 : function_name_strval.s[0] == '\\') {
1058 0 : function_name_strlen -= 1;
1059 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.s+1), function_name_strlen, 1, &lcname_len);
1060 : } else {
1061 14 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), function_name_strval, function_name_strlen, 1, &lcname_len);
1062 : }
1063 14 : if (zend_u_hash_find(EG(function_table), Z_TYPE_P(function_name), lcname, lcname_len+1, (void **) &EX(fbc)) == FAILURE) {
1064 0 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE_P(function_name), Z_UNIVAL_P(function_name));
1065 : }
1066 14 : efree(lcname.v);
1067 14 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1068 : }
1069 :
1070 14 : EX(object) = NULL;
1071 :
1072 14 : ZEND_VM_NEXT_OPCODE();
1073 : }
1074 :
1075 : static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1076 2293 : {
1077 2293 : zend_op *opline = EX(opline);
1078 :
1079 : if (IS_UNUSED == IS_UNUSED) {
1080 2293 : EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1081 2293 : ZEND_VM_NEXT_OPCODE();
1082 : } else {
1083 :
1084 : zval *class_name = NULL;
1085 :
1086 : if (IS_UNUSED != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
1087 : EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
1088 : } else if (Z_TYPE_P(class_name) == IS_STRING ||
1089 : Z_TYPE_P(class_name) == IS_UNICODE) {
1090 : EX_T(opline->result.u.var).class_entry = zend_u_fetch_class(Z_TYPE_P(class_name), Z_UNIVAL_P(class_name), Z_UNILEN_P(class_name), opline->extended_value TSRMLS_CC);
1091 : } else {
1092 : zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1093 : }
1094 :
1095 : ZEND_VM_NEXT_OPCODE();
1096 : }
1097 : }
1098 :
1099 : static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1100 1068 : {
1101 1068 : zend_op *opline = EX(opline);
1102 :
1103 : if (IS_CV == IS_UNUSED) {
1104 : EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1105 : ZEND_VM_NEXT_OPCODE();
1106 : } else {
1107 :
1108 1068 : zval *class_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
1109 :
1110 1068 : if (IS_CV != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
1111 17 : EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
1112 2097 : } else if (Z_TYPE_P(class_name) == IS_STRING ||
1113 : Z_TYPE_P(class_name) == IS_UNICODE) {
1114 1050 : EX_T(opline->result.u.var).class_entry = zend_u_fetch_class(Z_TYPE_P(class_name), Z_UNIVAL_P(class_name), Z_UNILEN_P(class_name), opline->extended_value TSRMLS_CC);
1115 : } else {
1116 1 : zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1117 : }
1118 :
1119 1063 : ZEND_VM_NEXT_OPCODE();
1120 : }
1121 : }
1122 :
1123 : static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1124 13178 : {
1125 13178 : zend_op *opline = EX(opline);
1126 : zval *function_name;
1127 : zstr function_name_strval, lcname;
1128 : unsigned int function_name_strlen, lcname_len;
1129 :
1130 :
1131 13178 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1132 :
1133 : if (IS_CV == IS_CONST) {
1134 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc)) == FAILURE) {
1135 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
1136 : }
1137 : } else {
1138 13178 : function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
1139 :
1140 13178 : if (IS_CV != IS_CONST &&
1141 : Z_TYPE_P(function_name) == IS_OBJECT &&
1142 : Z_OBJ_HANDLER_P(function_name, get_closure) &&
1143 : Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1144 80 : if (EX(object)) {
1145 21 : Z_ADDREF_P(EX(object));
1146 : }
1147 :
1148 80 : ZEND_VM_NEXT_OPCODE();
1149 : }
1150 :
1151 13098 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
1152 0 : zend_error_noreturn(E_ERROR, "Function name must be a string");
1153 : }
1154 13098 : function_name_strval = Z_UNIVAL_P(function_name);
1155 13098 : function_name_strlen = Z_UNILEN_P(function_name);
1156 13099 : if (Z_TYPE_P(function_name) == IS_UNICODE &&
1157 : function_name_strval.u[0] == '\\') {
1158 1 : function_name_strlen -= 1;
1159 1 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.u+1), function_name_strlen, 1, &lcname_len);
1160 13097 : } else if (Z_TYPE_P(function_name) == IS_STRING &&
1161 : function_name_strval.s[0] == '\\') {
1162 0 : function_name_strlen -= 1;
1163 0 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), ZSTR(function_name_strval.s+1), function_name_strlen, 1, &lcname_len);
1164 : } else {
1165 13097 : lcname = zend_u_str_case_fold(Z_TYPE_P(function_name), function_name_strval, function_name_strlen, 1, &lcname_len);
1166 : }
1167 13098 : if (zend_u_hash_find(EG(function_table), Z_TYPE_P(function_name), lcname, lcname_len+1, (void **) &EX(fbc)) == FAILURE) {
1168 1 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE_P(function_name), Z_UNIVAL_P(function_name));
1169 : }
1170 13097 : efree(lcname.v);
1171 :
1172 : }
1173 :
1174 13097 : EX(object) = NULL;
1175 :
1176 13097 : ZEND_VM_NEXT_OPCODE();
1177 : }
1178 :
1179 : static int ZEND_FASTCALL ZEND_CATCH_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1180 968 : {
1181 968 : zend_op *opline = EX(opline);
1182 : zend_class_entry *ce;
1183 :
1184 : /* Check whether an exception has been thrown, if not, jump over code */
1185 968 : zend_exception_restore(TSRMLS_C);
1186 968 : if (EG(exception) == NULL) {
1187 0 : ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
1188 0 : ZEND_VM_CONTINUE(); /* CHECK_ME */
1189 : }
1190 968 : ce = Z_OBJCE_P(EG(exception));
1191 :
1192 : #ifdef HAVE_DTRACE
1193 : if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
1194 : char *s_classname;
1195 : int s_classname_len;
1196 : zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, ce->name.u, u_strlen(ce->name.u) TSRMLS_CC);
1197 : DTRACE_EXCEPTION_CAUGHT(s_classname);
1198 : efree(s_classname);
1199 : }
1200 : #endif /* HAVE_DTRACE */
1201 :
1202 968 : if (ce != EX_T(opline->op1.u.var).class_entry) {
1203 490 : if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) {
1204 2 : if (opline->op1.u.EA.type) {
1205 0 : zend_throw_exception_internal(NULL TSRMLS_CC);
1206 0 : ZEND_VM_NEXT_OPCODE();
1207 : }
1208 2 : ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
1209 2 : ZEND_VM_CONTINUE(); /* CHECK_ME */
1210 : }
1211 : }
1212 :
1213 966 : if (!EG(active_symbol_table)) {
1214 142 : if (EX(CVs)[opline->op2.u.var]) {
1215 30 : zval_ptr_dtor(EX(CVs)[opline->op2.u.var]);
1216 : }
1217 142 : EX(CVs)[opline->op2.u.var] = (zval**)EX(CVs) + (EX(op_array)->last_var + opline->op2.u.var);
1218 142 : *EX(CVs)[opline->op2.u.var] = EG(exception);
1219 : } else {
1220 824 : zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.u.var);
1221 824 : zend_u_hash_quick_update(EG(active_symbol_table), IS_UNICODE, cv->name, cv->name_len+1, cv->hash_value,
1222 : &EG(exception), sizeof(zval *), (void**)&EX(CVs)[opline->op2.u.var]);
1223 : }
1224 966 : EG(exception) = NULL;
1225 966 : ZEND_VM_NEXT_OPCODE();
1226 : }
1227 :
1228 : static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1229 84 : {
1230 84 : zend_op *opline = EX(opline);
1231 :
1232 :
1233 84 : bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
1234 : &opline->op1.u.constant TSRMLS_CC);
1235 :
1236 84 : ZEND_VM_NEXT_OPCODE();
1237 : }
1238 :
1239 : static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1240 20030 : {
1241 20030 : zend_op *opline = EX(opline);
1242 :
1243 :
1244 20030 : boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
1245 : &opline->op1.u.constant TSRMLS_CC);
1246 :
1247 20030 : ZEND_VM_NEXT_OPCODE();
1248 : }
1249 :
1250 : static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1251 39519 : {
1252 39519 : zend_op *opline = EX(opline);
1253 :
1254 39519 : zval *z = &opline->op1.u.constant;
1255 : zval z_copy;
1256 39519 : UErrorCode status = U_ZERO_ERROR;
1257 :
1258 : /* UTODO: review this
1259 : * Convert inline HTML blocks to the output encoding, but only if necessary. */
1260 39520 : if (opline->extended_value &&
1261 : strcmp(ucnv_getName(ZEND_U_CONVERTER(UG(output_encoding_conv)), &status),
1262 : EX(op_array)->script_encoding)) {
1263 : zval z_conv;
1264 1 : UConverter *script_enc_conv = NULL;
1265 1 : if (zend_set_converter_encoding(&script_enc_conv, EX(op_array)->script_encoding) == FAILURE) {
1266 0 : zend_error_noreturn(E_ERROR, "Unsupported encoding [%d]", EX(op_array)->script_encoding);
1267 : }
1268 1 : zend_convert_encodings(ZEND_U_CONVERTER(UG(output_encoding_conv)), script_enc_conv, &Z_STRVAL(z_conv), &Z_STRLEN(z_conv), Z_STRVAL_P(z), Z_STRLEN_P(z), &status);
1269 1 : Z_TYPE(z_conv) = IS_STRING;
1270 1 : if (U_SUCCESS(status)) {
1271 1 : zend_print_variable(&z_conv);
1272 : } else {
1273 0 : zend_error(E_WARNING, "Could not convert inline HTML for output");
1274 : }
1275 1 : zval_dtor(&z_conv);
1276 1 : ucnv_close(script_enc_conv);
1277 : } else if (IS_CONST != IS_CONST &&
1278 : Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL &&
1279 : zend_std_cast_object_tostring(z, &z_copy, IS_UNICODE, ZEND_U_CONVERTER(UG(output_encoding_conv)) TSRMLS_CC) == SUCCESS) {
1280 : zend_print_variable(&z_copy);
1281 : zval_dtor(&z_copy);
1282 : } else {
1283 39518 : zend_print_variable(z);
1284 : }
1285 :
1286 39518 : ZEND_VM_NEXT_OPCODE();
1287 : }
1288 :
1289 : static int ZEND_FASTCALL ZEND_PRINT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1290 1288 : {
1291 1288 : zend_op *opline = EX(opline);
1292 :
1293 1288 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
1294 1288 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
1295 :
1296 1288 : return ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1297 : }
1298 :
1299 : static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
1300 1737650 : {
1301 1737650 : zend_op *opline = EX(opline);
1302 1737650 : zend_free_op free_op1 = {0};
1303 1737650 : zval *varname = &opline->op1.u.constant;
1304 : zval **retval;
1305 : zval tmp_varname;
1306 : HashTable *target_symbol_table;
1307 :
1308 : if (IS_CONST != IS_CONST &&
1309 : Z_TYPE_P(varname) != IS_STRING &&
1310 : Z_TYPE_P(varname) != IS_UNICODE) {
1311 : tmp_varname = *varname;
1312 : zval_copy_ctor(&tmp_varname);
1313 : convert_to_unicode(&tmp_varname);
1314 : varname = &tmp_varname;
1315 : }
1316 :
1317 1745842 : if (opline->op2.u.EA.type == ZEND_FETCH_AUTO_GLOBAL &&
1318 : CG(auto_globals_cache)[opline->op2.u.var]) {
1319 8192 : retval = CG(auto_globals_cache)[opline->op2.u.var];
1320 1729458 : } else if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
1321 741 : retval = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname), 0 TSRMLS_CC);
1322 :
1323 : } else {
1324 1728717 : zend_auto_global *auto_global = NULL;
1325 :
1326 1728717 : if (opline->op2.u.EA.type == ZEND_FETCH_AUTO_GLOBAL) {
1327 366 : zend_u_is_auto_global_ex(Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname), 1, &auto_global TSRMLS_CC);
1328 : }
1329 1728717 : target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
1330 : /*
1331 : if (!target_symbol_table) {
1332 : ZEND_VM_NEXT_OPCODE();
1333 : }
1334 : */
1335 1728717 : if (zend_u_hash_find(target_symbol_table, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1, (void **) &retval) == FAILURE) {
1336 1747 : switch (type) {
1337 : case BP_VAR_R:
1338 : case BP_VAR_UNSET:
1339 1485 : zend_error(E_NOTICE,"Undefined variable: %R", Z_TYPE_P(varname), Z_UNIVAL_P(varname));
1340 : /* break missing intentionally */
1341 : case BP_VAR_IS:
1342 1485 : retval = &EG(uninitialized_zval_ptr);
1343 1485 : break;
1344 : case BP_VAR_RW:
1345 0 : zend_error(E_NOTICE,"Undefined variable: %R", Z_TYPE_P(varname), Z_UNIVAL_P(varname));
1346 : /* break missing intentionally */
1347 : case BP_VAR_W: {
1348 262 : zval *new_zval = &EG(uninitialized_zval);
1349 :
1350 262 : Z_ADDREF_P(new_zval);
1351 262 : zend_u_hash_update(target_symbol_table, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1, &new_zval, sizeof(zval *), (void **) &retval);
1352 : }
1353 : break;
1354 : EMPTY_SWITCH_DEFAULT_CASE()
1355 : }
1356 : }
1357 1728717 : switch (opline->op2.u.EA.type) {
1358 : case ZEND_FETCH_AUTO_GLOBAL:
1359 366 : if (auto_global && (!auto_global->armed || !auto_global->runtime)) {
1360 366 : CG(auto_globals_cache)[opline->op2.u.var] = retval;
1361 : }
1362 : /* break missing intentionally */
1363 : case ZEND_FETCH_GLOBAL:
1364 : if (IS_CONST != IS_TMP_VAR) {
1365 :
1366 : }
1367 366 : break;
1368 : case ZEND_FETCH_LOCAL:
1369 :
1370 1148765 : break;
1371 : case ZEND_FETCH_STATIC:
1372 1158 : zval_update_constant(retval, (void*) 1 TSRMLS_CC);
1373 : break;
1374 : case ZEND_FETCH_GLOBAL_LOCK:
1375 : if (IS_CONST == IS_VAR && !free_op1.var) {
1376 : PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
1377 : }
1378 : break;
1379 : }
1380 : }
1381 :
1382 :
1383 : if (IS_CONST != IS_CONST && varname == &tmp_varname) {
1384 : zval_dtor(varname);
1385 : }
1386 1737640 : if (!RETURN_VALUE_UNUSED(&opline->result)) {
1387 1737636 : if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1388 2 : SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
1389 : }
1390 1737636 : PZVAL_LOCK(*retval);
1391 1737636 : switch (type) {
1392 : case BP_VAR_R:
1393 : case BP_VAR_IS:
1394 341809 : AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
1395 341809 : break;
1396 : case BP_VAR_UNSET: {
1397 : zend_free_op free_res;
1398 :
1399 28 : EX_T(opline->result.u.var).var.ptr_ptr = retval;
1400 28 : PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
1401 28 : if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
1402 28 : SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
1403 : }
1404 28 : PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
1405 28 : FREE_OP_VAR_PTR(free_res);
1406 28 : break;
1407 : default:
1408 1395799 : EX_T(opline->result.u.var).var.ptr_ptr = retval;
1409 : break;
1410 : }
1411 : }
1412 : }
1413 1737640 : ZEND_VM_NEXT_OPCODE();
1414 : }
1415 :
1416 : static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1417 341752 : {
1418 341752 : return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1419 : }
1420 :
1421 : static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1422 1395738 : {
1423 1395738 : return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1424 : }
1425 :
1426 : static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1427 67 : {
1428 67 : return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1429 : }
1430 :
1431 : static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1432 42 : {
1433 42 : return zend_fetch_var_address_helper_SPEC_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1434 : }
1435 :
1436 : static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1437 28 : {
1438 28 : return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1439 : }
1440 :
1441 : static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1442 23 : {
1443 23 : return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1444 : }
1445 :
1446 : static int ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1447 847474 : {
1448 847474 : zend_op *opline = EX(opline);
1449 :
1450 847474 : zval *val = &opline->op1.u.constant;
1451 : int ret;
1452 :
1453 : if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
1454 : ret = Z_LVAL_P(val);
1455 : } else {
1456 847474 : ret = i_zend_is_true(val);
1457 :
1458 847474 : if (UNEXPECTED(EG(exception) != NULL)) {
1459 0 : ZEND_VM_CONTINUE();
1460 : }
1461 : }
1462 847474 : if (!ret) {
1463 : #if DEBUG_ZEND>=2
1464 : printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
1465 : #endif
1466 106 : ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
1467 106 : ZEND_VM_CONTINUE();
1468 : }
1469 :
1470 847368 : ZEND_VM_NEXT_OPCODE();
1471 : }
1472 :
1473 : static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1474 9 : {
1475 9 : zend_op *opline = EX(opline);
1476 :
1477 9 : zval *val = &opline->op1.u.constant;
1478 : int ret;
1479 :
1480 : if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
1481 : ret = Z_LVAL_P(val);
1482 : } else {
1483 9 : ret = i_zend_is_true(val);
1484 :
1485 9 : if (UNEXPECTED(EG(exception) != NULL)) {
1486 0 : ZEND_VM_CONTINUE();
1487 : }
1488 : }
1489 9 : if (ret) {
1490 : #if DEBUG_ZEND>=2
1491 : printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
1492 : #endif
1493 6 : ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
1494 6 : ZEND_VM_CONTINUE();
1495 : }
1496 :
1497 3 : ZEND_VM_NEXT_OPCODE();
1498 : }
1499 :
1500 : static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1501 545907 : {
1502 545907 : zend_op *opline = EX(opline);
1503 :
1504 545907 : zval *val = &opline->op1.u.constant;
1505 : int retval;
1506 :
1507 : if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
1508 : retval = Z_LVAL_P(val);
1509 : } else {
1510 545907 : retval = i_zend_is_true(val);
1511 :
1512 545906 : if (UNEXPECTED(EG(exception) != NULL)) {
1513 0 : ZEND_VM_CONTINUE();
1514 : }
1515 : }
1516 545906 : if (EXPECTED(retval != 0)) {
1517 : #if DEBUG_ZEND>=2
1518 : printf("Conditional jmp on true to %d\n", opline->extended_value);
1519 : #endif
1520 545906 : ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
1521 545906 : ZEND_VM_CONTINUE(); /* CHECK_ME */
1522 : } else {
1523 : #if DEBUG_ZEND>=2
1524 : printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
1525 : #endif
1526 0 : ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
1527 0 : ZEND_VM_CONTINUE(); /* CHECK_ME */
1528 : }
1529 : }
1530 :
1531 : static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1532 0 : {
1533 0 : zend_op *opline = EX(opline);
1534 :
1535 0 : zval *val = &opline->op1.u.constant;
1536 : int retval;
1537 :
1538 : if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
1539 : retval = Z_LVAL_P(val);
1540 : } else {
1541 0 : retval = i_zend_is_true(val);
1542 :
1543 0 : if (UNEXPECTED(EG(exception) != NULL)) {
1544 0 : ZEND_VM_CONTINUE();
1545 : }
1546 : }
1547 0 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
1548 0 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
1549 0 : if (!retval) {
1550 : #if DEBUG_ZEND>=2
1551 : printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
1552 : #endif
1553 0 : ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
1554 0 : ZEND_VM_CONTINUE();
1555 : }
1556 0 : ZEND_VM_NEXT_OPCODE();
1557 : }
1558 :
1559 : static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1560 0 : {
1561 0 : zend_op *opline = EX(opline);
1562 :
1563 0 : zval *val = &opline->op1.u.constant;
1564 : int retval;
1565 :
1566 : if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
1567 : retval = Z_LVAL_P(val);
1568 : } else {
1569 0 : retval = i_zend_is_true(val);
1570 :
1571 0 : if (UNEXPECTED(EG(exception) != NULL)) {
1572 0 : ZEND_VM_CONTINUE();
1573 : }
1574 : }
1575 0 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
1576 0 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
1577 0 : if (retval) {
1578 : #if DEBUG_ZEND>=2
1579 : printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
1580 : #endif
1581 0 : ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
1582 0 : ZEND_VM_CONTINUE();
1583 : }
1584 0 : ZEND_VM_NEXT_OPCODE();
1585 : }
1586 :
1587 : static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1588 29515406 : {
1589 29515406 : zend_op *opline = EX(opline);
1590 :
1591 29515406 : zval *fname = &opline->op1.u.constant;
1592 :
1593 29515406 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1594 :
1595 29515406 : if (zend_u_hash_quick_find(EG(function_table), Z_TYPE_P(fname), Z_UNIVAL_P(fname), Z_UNILEN_P(fname)+1, Z_LVAL(opline->op2.u.constant), (void **) &EX(function_state).function)==FAILURE) {
1596 : /* FIXME: output identifiers properly */
1597 0 : zend_error_noreturn(E_ERROR, "Call to undefined function %R()", Z_TYPE_P(fname), Z_UNIVAL_P(fname));
1598 : }
1599 29515405 : EX(object) = NULL;
1600 :
1601 29515405 : return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1602 : }
1603 :
1604 : static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1605 264069 : {
1606 264069 : zend_op *opline = EX(opline);
1607 : zval *retval_ptr;
1608 : zval **retval_ptr_ptr;
1609 :
1610 :
1611 264069 : if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
1612 :
1613 : if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
1614 : /* Not supposed to happen, but we'll allow it */
1615 6 : zend_error(E_NOTICE, "Only variable references should be returned by reference");
1616 6 : goto return_by_value;
1617 : }
1618 :
1619 : retval_ptr_ptr = NULL;
1620 :
1621 : if (IS_CONST == IS_VAR && !retval_ptr_ptr) {
1622 : zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
1623 : }
1624 :
1625 : if (IS_CONST == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
1626 : if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
1627 : EX_T(opline->op1.u.var).var.fcall_returned_reference) {
1628 : } else if (opline->extended_value == ZEND_RETURNS_NEW) {
1629 : } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
1630 : if (IS_CONST == IS_VAR && !0) {
1631 : PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
1632 : }
1633 : zend_error(E_NOTICE, "Only variable references should be returned by reference");
1634 : goto return_by_value;
1635 : }
1636 : }
1637 :
1638 : if (EG(return_value_ptr_ptr)) {
1639 : SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
1640 : Z_ADDREF_PP(retval_ptr_ptr);
1641 :
1642 : (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
1643 : }
1644 : } else {
1645 264069 : return_by_value:
1646 :
1647 264069 : retval_ptr = &opline->op1.u.constant;
1648 :
1649 264069 : if (!EG(return_value_ptr_ptr)) {
1650 : if (IS_CONST == IS_TMP_VAR) {
1651 :
1652 : }
1653 : } else if (!0) { /* Not a temp var */
1654 : if (IS_CONST == IS_CONST ||
1655 : EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
1656 : (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
1657 : zval *ret;
1658 :
1659 122427 : ALLOC_ZVAL(ret);
1660 122427 : INIT_PZVAL_COPY(ret, retval_ptr);
1661 122427 : zval_copy_ctor(ret);
1662 122427 : *EG(return_value_ptr_ptr) = ret;
1663 : } else {
1664 : *EG(return_value_ptr_ptr) = retval_ptr;
1665 : Z_ADDREF_P(retval_ptr);
1666 : }
1667 : } else {
1668 : zval *ret;
1669 :
1670 : ALLOC_ZVAL(ret);
1671 : INIT_PZVAL_COPY(ret, retval_ptr);
1672 : *EG(return_value_ptr_ptr) = ret;
1673 : }
1674 : }
1675 :
1676 264069 : return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1677 : }
1678 :
1679 : static int ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1680 2 : {
1681 2 : zend_op *opline = EX(opline);
1682 : zval *value;
1683 : zval *exception;
1684 :
1685 :
1686 2 : value = &opline->op1.u.constant;
1687 :
1688 : if (IS_CONST == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
1689 2 : zend_error_noreturn(E_ERROR, "Can only throw objects");
1690 : }
1691 : zend_exception_save(TSRMLS_C);
1692 : /* Not sure if a complete copy is what we want here */
1693 : ALLOC_ZVAL(exception);
1694 : INIT_PZVAL_COPY(exception, value);
1695 : if (!0) {
1696 : zval_copy_ctor(exception);
1697 : }
1698 :
1699 : zend_throw_exception_object(exception TSRMLS_CC);
1700 : zend_exception_restore(TSRMLS_C);
1701 :
1702 : ZEND_VM_NEXT_OPCODE();
1703 : }
1704 :
1705 : static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1706 7084854 : {
1707 7084854 : zend_op *opline = EX(opline);
1708 7084854 : if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
1709 : && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
1710 2 : zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
1711 : }
1712 : {
1713 : zval *valptr;
1714 : zval *value;
1715 :
1716 :
1717 7084852 : value = &opline->op1.u.constant;
1718 :
1719 7084852 : ALLOC_ZVAL(valptr);
1720 7084852 : INIT_PZVAL_COPY(valptr, value);
1721 : if (!0) {
1722 7084852 : zval_copy_ctor(valptr);
1723 : }
1724 7084852 : zend_vm_stack_push(valptr TSRMLS_CC);
1725 :
1726 : }
1727 7084852 : ZEND_VM_NEXT_OPCODE();
1728 : }
1729 :
1730 : static int ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1731 1 : {
1732 1 : zend_op *opline = EX(opline);
1733 :
1734 :
1735 : /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
1736 1 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(&opline->op1.u.constant);
1737 1 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
1738 :
1739 1 : ZEND_VM_NEXT_OPCODE();
1740 : }
1741 :
1742 : static int ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1743 2 : {
1744 2 : zend_op *opline = EX(opline);
1745 :
1746 2 : zval *obj = &opline->op1.u.constant;
1747 : zend_class_entry *ce;
1748 : zend_function *clone;
1749 : zend_object_clone_obj_t clone_call;
1750 :
1751 : if (IS_CONST == IS_CONST ||
1752 : (IS_CONST == IS_VAR && !obj) ||
1753 : Z_TYPE_P(obj) != IS_OBJECT) {
1754 2 : zend_error_noreturn(E_ERROR, "__clone method called on non-object");
1755 : }
1756 :
1757 : ce = Z_OBJCE_P(obj);
1758 : clone = ce ? ce->clone : NULL;
1759 : clone_call = Z_OBJ_HT_P(obj)->clone_obj;
1760 : if (!clone_call) {
1761 : if (ce) {
1762 : zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %v", ce->name);
1763 : } else {
1764 : zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
1765 : }
1766 : }
1767 :
1768 : if (ce && clone) {
1769 : if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
1770 : /* Ensure that if we're calling a private function, we're allowed to do so.
1771 : */
1772 : if (ce != EG(scope)) {
1773 : zend_error_noreturn(E_ERROR, "Call to private %v::__clone() from context '%v'", ce->name, EG(scope) ? EG(scope)->name : EMPTY_ZSTR);
1774 : }
1775 : } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
1776 : /* Ensure that if we're calling a protected function, we're allowed to do so.
1777 : */
1778 : if (!zend_check_protected(clone->common.scope, EG(scope))) {
1779 : zend_error_noreturn(E_ERROR, "Call to protected %v::__clone() from context '%v'", ce->name, EG(scope) ? EG(scope)->name : EMPTY_ZSTR);
1780 : }
1781 : }
1782 : }
1783 :
1784 : EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
1785 : if (!EG(exception)) {
1786 : ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
1787 : Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
1788 : Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
1789 : Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
1790 : Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
1791 : if (!RETURN_VALUE_USED(opline) || EG(exception)) {
1792 : zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
1793 : }
1794 : }
1795 :
1796 : ZEND_VM_NEXT_OPCODE();
1797 : }
1798 :
1799 : static int ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1800 253 : {
1801 253 : zend_op *opline = EX(opline);
1802 :
1803 253 : zval *expr = &opline->op1.u.constant;
1804 253 : zval *result = &EX_T(opline->result.u.var).tmp_var;
1805 :
1806 253 : if (opline->extended_value != IS_STRING &&
1807 : opline->extended_value != IS_UNICODE) {
1808 16 : *result = *expr;
1809 : if (!0) {
1810 16 : zendi_zval_copy_ctor(*result);
1811 : }
1812 : }
1813 253 : switch (opline->extended_value) {
1814 : case IS_NULL:
1815 0 : convert_to_null(result);
1816 0 : break;
1817 : case IS_BOOL:
1818 2 : convert_to_boolean(result);
1819 2 : break;
1820 : case IS_LONG:
1821 5 : convert_to_long(result);
1822 5 : break;
1823 : case IS_DOUBLE:
1824 4 : convert_to_double(result);
1825 4 : break;
1826 : case IS_STRING: {
1827 : zval var_copy;
1828 : int use_copy;
1829 :
1830 224 : zend_make_string_zval(expr, &var_copy, &use_copy);
1831 224 : if (use_copy) {
1832 224 : *result = var_copy;
1833 : if (0) {
1834 :
1835 : }
1836 : } else {
1837 0 : *result = *expr;
1838 : if (!0) {
1839 0 : zendi_zval_copy_ctor(*result);
1840 : }
1841 : }
1842 224 : break;
1843 : }
1844 : case IS_UNICODE: {
1845 : zval var_copy;
1846 : int use_copy;
1847 :
1848 13 : zend_make_unicode_zval(expr, &var_copy, &use_copy);
1849 13 : if (use_copy) {
1850 9 : *result = var_copy;
1851 : if (0) {
1852 :
1853 : }
1854 : } else {
1855 4 : *result = *expr;
1856 : if (!0) {
1857 4 : zendi_zval_copy_ctor(*result);
1858 : }
1859 : }
1860 13 : break;
1861 : }
1862 : case IS_ARRAY:
1863 3 : convert_to_array(result);
1864 3 : break;
1865 : case IS_OBJECT:
1866 2 : convert_to_object(result);
1867 : break;
1868 : }
1869 :
1870 253 : ZEND_VM_NEXT_OPCODE();
1871 : }
1872 :
1873 : static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1874 5542 : {
1875 5542 : zend_op *opline = EX(opline);
1876 5542 : zend_op_array *new_op_array=NULL;
1877 : int return_value_used;
1878 :
1879 5542 : zval *inc_filename = &opline->op1.u.constant;
1880 : zval tmp_inc_filename;
1881 5542 : zend_bool failure_retval=0;
1882 :
1883 5542 : if (Z_LVAL(opline->op2.u.constant) == ZEND_EVAL) {
1884 37 : if (Z_TYPE_P(inc_filename) != IS_UNICODE) {
1885 0 : tmp_inc_filename = *inc_filename;
1886 0 : zval_copy_ctor(&tmp_inc_filename);
1887 0 : convert_to_unicode(&tmp_inc_filename);
1888 0 : inc_filename = &tmp_inc_filename;
1889 : }
1890 5505 : } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) {
1891 : char *encpath;
1892 : int encpath_len;
1893 :
1894 5505 : if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) {
1895 0 : failure_retval = 0;
1896 0 : zend_error_noreturn(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename));
1897 : goto skip_compile;
1898 : }
1899 :
1900 5505 : ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0);
1901 5505 : inc_filename = &tmp_inc_filename;
1902 0 : } else if (Z_TYPE_P(inc_filename) != IS_STRING) {
1903 0 : tmp_inc_filename = *inc_filename;
1904 0 : zval_copy_ctor(&tmp_inc_filename);
1905 0 : convert_to_string(&tmp_inc_filename);
1906 0 : inc_filename = &tmp_inc_filename;
1907 : }
1908 :
1909 5542 : return_value_used = RETURN_VALUE_USED(opline);
1910 :
1911 5542 : switch (Z_LVAL(opline->op2.u.constant)) {
1912 : case ZEND_INCLUDE_ONCE:
1913 : case ZEND_REQUIRE_ONCE: {
1914 : zend_file_handle file_handle;
1915 : char *resolved_path;
1916 :
1917 3795 : resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
1918 3795 : if (resolved_path) {
1919 3790 : failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
1920 : } else {
1921 5 : resolved_path = Z_STRVAL_P(inc_filename);
1922 : }
1923 :
1924 3795 : if (failure_retval) {
1925 : /* do nothing, file already included */
1926 3207 : } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
1927 :
1928 3204 : if (!file_handle.opened_path) {
1929 4 : file_handle.opened_path = estrdup(resolved_path);
1930 : }
1931 :
1932 3204 : if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
1933 3203 : new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
1934 3203 : zend_destroy_file_handle(&file_handle TSRMLS_CC);
1935 : } else {
1936 1 : zend_file_handle_dtor(&file_handle TSRMLS_CC);
1937 1 : failure_retval=1;
1938 : }
1939 : } else {
1940 3 : if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
1941 0 : zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
1942 : } else {
1943 3 : zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
1944 : }
1945 : }
1946 3792 : if (resolved_path != Z_STRVAL_P(inc_filename)) {
1947 3790 : efree(resolved_path);
1948 : }
1949 : }
1950 3792 : break;
1951 : case ZEND_INCLUDE:
1952 : case ZEND_REQUIRE:
1953 1710 : new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
1954 1708 : break;
1955 : case ZEND_EVAL: {
1956 37 : char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
1957 :
1958 37 : new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
1959 36 : efree(eval_desc);
1960 : }
1961 : break;
1962 : EMPTY_SWITCH_DEFAULT_CASE()
1963 : }
1964 :
1965 5536 : skip_compile:
1966 5536 : if (inc_filename==&tmp_inc_filename) {
1967 5500 : zval_dtor(&tmp_inc_filename);
1968 : }
1969 :
1970 5536 : EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
1971 5536 : if (new_op_array && !EG(exception)) {
1972 4938 : EX(original_return_value) = EG(return_value_ptr_ptr);
1973 4938 : EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
1974 4938 : EG(active_op_array) = new_op_array;
1975 4938 : EX_T(opline->result.u.var).var.ptr = NULL;
1976 :
1977 4938 : EX(current_object) = EX(object);
1978 :
1979 4938 : EX(function_state).function = (zend_function *) new_op_array;
1980 4938 : EX(object) = NULL;
1981 :
1982 4938 : if (!EG(active_symbol_table)) {
1983 15 : zend_rebuild_symbol_table(TSRMLS_C);
1984 : }
1985 :
1986 4938 : if (zend_execute == execute) {
1987 4938 : EX(call_opline) = opline;
1988 4938 : ZEND_VM_ENTER();
1989 : } else {
1990 0 : zend_execute(new_op_array TSRMLS_CC);
1991 : }
1992 :
1993 0 : EX(function_state).function = (zend_function *) EX(op_array);
1994 0 : EX(object) = EX(current_object);
1995 :
1996 0 : if (return_value_used) {
1997 0 : if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
1998 0 : ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
1999 0 : INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
2000 0 : Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
2001 0 : Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
2002 : }
2003 : }
2004 :
2005 0 : EG(opline_ptr) = &EX(opline);
2006 0 : EG(active_op_array) = EX(op_array);
2007 0 : EG(return_value_ptr_ptr) = EX(original_return_value);
2008 0 : destroy_op_array(new_op_array TSRMLS_CC);
2009 0 : efree(new_op_array);
2010 0 : if (EG(exception)) {
2011 0 : zend_throw_exception_internal(NULL TSRMLS_CC);
2012 : }
2013 : } else {
2014 598 : if (return_value_used) {
2015 0 : ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
2016 0 : INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
2017 0 : Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
2018 0 : Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
2019 : }
2020 : }
2021 598 : ZEND_VM_NEXT_OPCODE();
2022 : }
2023 :
2024 : static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2025 4 : {
2026 4 : zend_op *opline = EX(opline);
2027 : zval tmp, *varname;
2028 : HashTable *target_symbol_table;
2029 :
2030 :
2031 : if (IS_CONST == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
2032 : if (EG(active_symbol_table)) {
2033 : zend_execute_data *ex = EX(prev_execute_data);
2034 : zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
2035 :
2036 : if (zend_u_hash_quick_del(EG(active_symbol_table), IS_UNICODE, cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
2037 : while (ex && ex->symbol_table == EG(active_symbol_table)) {
2038 : int i;
2039 :
2040 : if (ex->op_array) {
2041 : for (i = 0; i < ex->op_array->last_var; i++) {
2042 : if (ex->op_array->vars[i].hash_value == cv->hash_value &&
2043 : ex->op_array->vars[i].name_len == cv->name_len &&
2044 : !memcmp(ex->op_array->vars[i].name.v, cv->name.v, USTR_BYTES(IS_UNICODE, cv->name_len))) {
2045 : ex->CVs[i] = NULL;
2046 : break;
2047 : }
2048 : }
2049 : }
2050 : ex = ex->prev_execute_data;
2051 : }
2052 : }
2053 : EX(CVs)[opline->op1.u.var] = NULL;
2054 : } else if (EX(CVs)[opline->op1.u.var]) {
2055 : zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
2056 : EX(CVs)[opline->op1.u.var] = NULL;
2057 : }
2058 : ZEND_VM_NEXT_OPCODE();
2059 : }
2060 :
2061 4 : varname = &opline->op1.u.constant;
2062 :
2063 4 : if (Z_TYPE_P(varname) != IS_STRING && Z_TYPE_P(varname) != IS_UNICODE) {
2064 0 : tmp = *varname;
2065 0 : zval_copy_ctor(&tmp);
2066 0 : convert_to_unicode(&tmp);
2067 0 : varname = &tmp;
2068 : } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
2069 : Z_ADDREF_P(varname);
2070 : }
2071 :
2072 4 : if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
2073 0 : zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname) TSRMLS_CC);
2074 : } else {
2075 4 : ulong hash_value = zend_u_inline_hash_func(Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1);
2076 :
2077 4 : target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
2078 4 : if (zend_u_hash_quick_del(target_symbol_table, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1, hash_value) == SUCCESS) {
2079 4 : zend_execute_data *ex = execute_data;
2080 : zend_auto_global *auto_global;
2081 :
2082 4 : if (zend_u_hash_quick_find(CG(auto_globals), Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1, hash_value, (void**)&auto_global) == SUCCESS) {
2083 4 : CG(auto_globals_cache)[auto_global->index] = NULL;
2084 : }
2085 : do {
2086 : int i;
2087 :
2088 6 : if (ex->op_array) {
2089 6 : for (i = 0; i < ex->op_array->last_var; i++) {
2090 0 : if (ex->op_array->vars[i].hash_value == hash_value &&
2091 : ex->op_array->vars[i].name_len == Z_UNILEN_P(varname) &&
2092 : !memcmp(ex->op_array->vars[i].name.v, Z_UNIVAL_P(varname).v, USTR_BYTES(Z_TYPE_P(varname), Z_UNILEN_P(varname)))) {
2093 0 : ex->CVs[i] = NULL;
2094 0 : break;
2095 : }
2096 : }
2097 : }
2098 6 : ex = ex->prev_execute_data;
2099 6 : } while (ex && ex->symbol_table == target_symbol_table);
2100 : }
2101 : }
2102 :
2103 4 : if (varname == &tmp) {
2104 0 : zval_dtor(&tmp);
2105 : } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
2106 : zval_ptr_dtor(&varname);
2107 : }
2108 :
2109 4 : ZEND_VM_NEXT_OPCODE();
2110 : }
2111 :
2112 : static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2113 0 : {
2114 0 : zend_op *opline = EX(opline);
2115 :
2116 : zval *array_ptr, **array_ptr_ptr;
2117 : HashTable *fe_ht;
2118 0 : zend_object_iterator *iter = NULL;
2119 0 : zend_class_entry *ce = NULL;
2120 0 : zend_bool is_empty = 0;
2121 :
2122 0 : if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
2123 0 : array_ptr_ptr = NULL;
2124 0 : if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
2125 0 : ALLOC_INIT_ZVAL(array_ptr);
2126 0 : } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
2127 0 : if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
2128 0 : zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
2129 0 : ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
2130 : }
2131 :
2132 0 : ce = Z_OBJCE_PP(array_ptr_ptr);
2133 0 : if (!ce || ce->get_iterator == NULL) {
2134 0 : SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
2135 0 : Z_ADDREF_PP(array_ptr_ptr);
2136 : }
2137 0 : array_ptr = *array_ptr_ptr;
2138 : } else {
2139 0 : if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
2140 0 : SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
2141 0 : if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
2142 0 : Z_SET_ISREF_PP(array_ptr_ptr);
2143 : }
2144 : }
2145 0 : array_ptr = *array_ptr_ptr;
2146 0 : Z_ADDREF_P(array_ptr);
2147 : }
2148 : } else {
2149 0 : array_ptr = &opline->op1.u.constant;
2150 : if (0) { /* IS_TMP_VAR */
2151 : zval *tmp;
2152 :
2153 : ALLOC_ZVAL(tmp);
2154 : INIT_PZVAL_COPY(tmp, array_ptr);
2155 : array_ptr = tmp;
2156 : if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
2157 : ce = Z_OBJCE_P(array_ptr);
2158 : if (ce && ce->get_iterator) {
2159 : Z_DELREF_P(array_ptr);
2160 : }
2161 : }
2162 0 : } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
2163 0 : ce = Z_OBJCE_P(array_ptr);
2164 0 : if (!ce || !ce->get_iterator) {
2165 0 : Z_ADDREF_P(array_ptr);
2166 : }
2167 : } else {
2168 : if (IS_CONST == IS_CONST ||
2169 : ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
2170 : !Z_ISREF_P(array_ptr) &&
2171 : Z_REFCOUNT_P(array_ptr) > 1)) {
2172 : zval *tmp;
2173 :
2174 0 : ALLOC_ZVAL(tmp);
2175 0 : INIT_PZVAL_COPY(tmp, array_ptr);
2176 0 : zval_copy_ctor(tmp);
2177 0 : array_ptr = tmp;
2178 : } else {
2179 : Z_ADDREF_P(array_ptr);
2180 : }
2181 : }
2182 : }
2183 :
2184 0 : if (ce && ce->get_iterator) {
2185 0 : iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
2186 :
2187 0 : if (iter && !EG(exception)) {
2188 0 : array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
2189 : } else {
2190 0 : if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
2191 :
2192 : } else {
2193 :
2194 : }
2195 0 : if (!EG(exception)) {
2196 0 : zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %v did not create an Iterator", ce->name);
2197 : }
2198 0 : zend_throw_exception_internal(NULL TSRMLS_CC);
2199 0 : ZEND_VM_NEXT_OPCODE();
2200 : }
2201 : }
2202 :
2203 0 : AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
2204 0 : PZVAL_LOCK(array_ptr);
2205 :
2206 0 : if (iter) {
2207 0 : iter->index = 0;
2208 0 : if (iter->funcs->rewind) {
2209 0 : iter->funcs->rewind(iter TSRMLS_CC);
2210 0 : if (EG(exception)) {
2211 0 : Z_DELREF_P(array_ptr);
2212 0 : zval_ptr_dtor(&array_ptr);
2213 0 : if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
2214 :
2215 : } else {
2216 :
2217 : }
2218 0 : ZEND_VM_NEXT_OPCODE();
2219 : }
2220 : }
2221 0 : is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
2222 0 : if (EG(exception)) {
2223 0 : Z_DELREF_P(array_ptr);
2224 0 : zval_ptr_dtor(&array_ptr);
2225 0 : if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
2226 :
2227 : } else {
2228 :
2229 : }
2230 0 : ZEND_VM_NEXT_OPCODE();
2231 : }
2232 0 : iter->index = -1; /* will be set to 0 before using next handler */
2233 0 : } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
2234 0 : zend_hash_internal_pointer_reset(fe_ht);
2235 0 : if (ce) {
2236 0 : zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
2237 0 : while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
2238 : zstr str_key;
2239 : uint str_key_len;
2240 : ulong int_key;
2241 : zend_uchar key_type;
2242 :
2243 0 : key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
2244 0 : if (key_type != HASH_KEY_NON_EXISTANT &&
2245 : (key_type == HASH_KEY_IS_LONG ||
2246 : zend_check_property_access(zobj, key_type == HASH_KEY_IS_UNICODE?IS_UNICODE:IS_STRING, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
2247 : break;
2248 : }
2249 0 : zend_hash_move_forward(fe_ht);
2250 : }
2251 : }
2252 0 : is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
2253 0 : zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
2254 : } else {
2255 0 : zend_error(E_WARNING, "Invalid argument supplied for foreach()");
2256 0 : is_empty = 1;
2257 : }
2258 :
2259 0 : if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
2260 :
2261 : } else {
2262 :
2263 : }
2264 0 : if (is_empty) {
2265 0 : ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
2266 : } else {
2267 0 : ZEND_VM_NEXT_OPCODE();
2268 : }
2269 : }
2270 :
2271 : static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2272 14 : {
2273 14 : zend_op *opline = EX(opline);
2274 : zval **value;
2275 14 : zend_bool isset = 1;
2276 :
2277 : if (IS_CONST == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
2278 : if (EX(CVs)[opline->op1.u.var]) {
2279 : value = EX(CVs)[opline->op1.u.var];
2280 : } else if (EG(active_symbol_table)) {
2281 : zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
2282 :
2283 : if (zend_u_hash_quick_find(EG(active_symbol_table), IS_UNICODE, cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
2284 : isset = 0;
2285 : }
2286 : } else {
2287 : isset = 0;
2288 : }
2289 : } else {
2290 : HashTable *target_symbol_table;
2291 :
2292 14 : zval tmp, *varname = &opline->op1.u.constant;
2293 :
2294 14 : if (Z_TYPE_P(varname) != IS_STRING && Z_TYPE_P(varname) != IS_UNICODE) {
2295 0 : tmp = *varname;
2296 0 : zval_copy_ctor(&tmp);
2297 0 : convert_to_unicode(&tmp);
2298 0 : varname = &tmp;
2299 : }
2300 :
2301 14 : if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
2302 4 : value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname), 1 TSRMLS_CC);
2303 4 : if (!value) {
2304 1 : isset = 0;
2305 : }
2306 : } else {
2307 10 : target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
2308 10 : if (zend_u_hash_find(target_symbol_table, Z_TYPE_P(varname), Z_UNIVAL_P(varname), Z_UNILEN_P(varname)+1, (void **) &value) == FAILURE) {
2309 0 : isset = 0;
2310 : }
2311 : }
2312 :
2313 14 : if (varname == &tmp) {
2314 0 : zval_dtor(&tmp);
2315 : }
2316 :
2317 : }
2318 :
2319 14 : Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
2320 :
2321 14 : switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
2322 : case ZEND_ISSET:
2323 11 : if (isset && Z_TYPE_PP(value) == IS_NULL) {
2324 1 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
2325 : } else {
2326 9 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
2327 : }
2328 10 : break;
2329 : case ZEND_ISEMPTY:
2330 4 : if (!isset || !i_zend_is_true(*value)) {
2331 0 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
2332 : } else {
2333 4 : Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
2334 : }
2335 : break;
2336 : }
2337 :
2338 14 : ZEND_VM_NEXT_OPCODE();
2339 : }
2340 :
2341 : static int ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2342 655 : {
2343 : #if 0 || (IS_CONST != IS_UNUSED)
2344 655 : zend_op *opline = EX(opline);
2345 : if (IS_CONST != IS_UNUSED) {
2346 :
2347 655 : zval *ptr = &opline->op1.u.constant;
2348 :
2349 655 : if (Z_TYPE_P(ptr) == IS_LONG) {
2350 22 : EG(exit_status) = Z_LVAL_P(ptr);
2351 : } else {
2352 633 : zend_print_variable(ptr);
2353 : }
2354 :
2355 : }
2356 : #endif
2357 655 : zend_bailout();
2358 0 : ZEND_VM_NEXT_OPCODE();
2359 : }
2360 :
2361 : static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2362 5 : {
2363 5 : zend_op *opline = EX(opline);
2364 :
2365 5 : zval *value = &opline->op1.u.constant;
2366 :
2367 5 : if (i_zend_is_true(value)) {
2368 3 : EX_T(opline->result.u.var).tmp_var = *value;
2369 3 : zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
2370 :
2371 : #if DEBUG_ZEND>=2
2372 : printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
2373 : #endif
2374 3 : ZEND_VM_JMP(opline->op2.u.jmp_addr);
2375 : }
2376 :
2377 2 : ZEND_VM_NEXT_OPCODE();
2378 : }
2379 :
2380 : static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2381 676769 : {
2382 676769 : zend_op *opline = EX(opline);
2383 :
2384 676769 : zval *value = &opline->op1.u.constant;
2385 :
2386 676769 : EX_T(opline->result.u.var).tmp_var = *value;
2387 : if (!0) {
2388 676769 : zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
2389 : }
2390 :
2391 676769 : ZEND_VM_NEXT_OPCODE();
2392 : }
2393 :
2394 : static int ZEND_FASTCALL ZEND_TICKS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2395 38 : {
2396 38 : zend_op *opline = EX(opline);
2397 :
2398 38 : if (++EG(ticks_count)>=Z_LVAL(opline->op1.u.constant)) {
2399 38 : EG(ticks_count)=0;
2400 38 : if (zend_ticks_function) {
2401 38 : zend_ticks_function(Z_LVAL(opline->op1.u.constant));
2402 : }
2403 : }
2404 38 : ZEND_VM_NEXT_OPCODE();
2405 : }
2406 :
2407 : static int ZEND_FASTCALL ZEND_U_NORMALIZE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2408 13 : {
2409 : zval var_copy;
2410 : int use_copy;
2411 : UChar *norm;
2412 : int norm_len;
2413 13 : zend_op *opline = EX(opline);
2414 :
2415 13 : zval *string = &opline->op1.u.constant;
2416 13 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2417 :
2418 13 : *result = *string;
2419 : if (!0) {
2420 13 : zendi_zval_copy_ctor(*result);
2421 : }
2422 :
2423 13 : zend_make_unicode_zval(result, &var_copy, &use_copy);
2424 13 : if (use_copy) {
2425 4 : zval_dtor(result);
2426 4 : *result = var_copy;
2427 : }
2428 13 : if (zend_normalize_identifier(&norm, &norm_len,
2429 : Z_USTRVAL_P(result), Z_USTRLEN_P(result), 0) == FAILURE) {
2430 0 : zend_error(E_WARNING, "Could not normalize identifier: %r", Z_USTRVAL_P(result));
2431 13 : } else if (norm != Z_USTRVAL_P(result)) {
2432 1 : efree(Z_USTRVAL_P(result));
2433 1 : ZVAL_UNICODEL(result, norm, norm_len, 0);
2434 : }
2435 :
2436 13 : ZEND_VM_NEXT_OPCODE();
2437 : }
2438 :
2439 : static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2440 1262 : {
2441 1262 : zend_op *opline = EX(opline);
2442 :
2443 :
2444 1262 : add_function(&EX_T(opline->result.u.var).tmp_var,
2445 : &opline->op1.u.constant,
2446 : &opline->op2.u.constant TSRMLS_CC);
2447 :
2448 :
2449 1262 : ZEND_VM_NEXT_OPCODE();
2450 : }
2451 :
2452 : static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2453 111 : {
2454 111 : zend_op *opline = EX(opline);
2455 :
2456 :
2457 111 : sub_function(&EX_T(opline->result.u.var).tmp_var,
2458 : &opline->op1.u.constant,
2459 : &opline->op2.u.constant TSRMLS_CC);
2460 :
2461 :
2462 111 : ZEND_VM_NEXT_OPCODE();
2463 : }
2464 :
2465 : static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2466 8234 : {
2467 8234 : zend_op *opline = EX(opline);
2468 :
2469 :
2470 8234 : mul_function(&EX_T(opline->result.u.var).tmp_var,
2471 : &opline->op1.u.constant,
2472 : &opline->op2.u.constant TSRMLS_CC);
2473 :
2474 :
2475 8234 : ZEND_VM_NEXT_OPCODE();
2476 : }
2477 :
2478 : static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2479 34 : {
2480 34 : zend_op *opline = EX(opline);
2481 :
2482 :
2483 34 : div_function(&EX_T(opline->result.u.var).tmp_var,
2484 : &opline->op1.u.constant,
2485 : &opline->op2.u.constant TSRMLS_CC);
2486 :
2487 :
2488 34 : ZEND_VM_NEXT_OPCODE();
2489 : }
2490 :
2491 : static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2492 4 : {
2493 4 : zend_op *opline = EX(opline);
2494 :
2495 :
2496 4 : mod_function(&EX_T(opline->result.u.var).tmp_var,
2497 : &opline->op1.u.constant,
2498 : &opline->op2.u.constant TSRMLS_CC);
2499 :
2500 :
2501 4 : ZEND_VM_NEXT_OPCODE();
2502 : }
2503 :
2504 : static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2505 15 : {
2506 15 : zend_op *opline = EX(opline);
2507 :
2508 :
2509 15 : shift_left_function(&EX_T(opline->result.u.var).tmp_var,
2510 : &opline->op1.u.constant,
2511 : &opline->op2.u.constant TSRMLS_CC);
2512 :
2513 :
2514 15 : ZEND_VM_NEXT_OPCODE();
2515 : }
2516 :
2517 : static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2518 0 : {
2519 0 : zend_op *opline = EX(opline);
2520 :
2521 :
2522 0 : shift_right_function(&EX_T(opline->result.u.var).tmp_var,
2523 : &opline->op1.u.constant,
2524 : &opline->op2.u.constant TSRMLS_CC);
2525 :
2526 :
2527 0 : ZEND_VM_NEXT_OPCODE();
2528 : }
2529 :
2530 : static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2531 18779 : {
2532 18779 : zend_op *opline = EX(opline);
2533 :
2534 :
2535 18779 : concat_function(&EX_T(opline->result.u.var).tmp_var,
2536 : &opline->op1.u.constant,
2537 : &opline->op2.u.constant TSRMLS_CC);
2538 :
2539 :
2540 18779 : ZEND_VM_NEXT_OPCODE();
2541 : }
2542 :
2543 : static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2544 0 : {
2545 0 : zend_op *opline = EX(opline);
2546 :
2547 :
2548 0 : is_identical_function(&EX_T(opline->result.u.var).tmp_var,
2549 : &opline->op1.u.constant,
2550 : &opline->op2.u.constant TSRMLS_CC);
2551 :
2552 :
2553 0 : ZEND_VM_NEXT_OPCODE();
2554 : }
2555 :
2556 : static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2557 0 : {
2558 0 : zend_op *opline = EX(opline);
2559 :
2560 0 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2561 :
2562 0 : is_identical_function(result,
2563 : &opline->op1.u.constant,
2564 : &opline->op2.u.constant TSRMLS_CC);
2565 0 : Z_LVAL_P(result) = !Z_LVAL_P(result);
2566 :
2567 :
2568 0 : ZEND_VM_NEXT_OPCODE();
2569 : }
2570 :
2571 : static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2572 76 : {
2573 76 : zend_op *opline = EX(opline);
2574 :
2575 76 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2576 :
2577 76 : compare_function(result,
2578 : &opline->op1.u.constant,
2579 : &opline->op2.u.constant TSRMLS_CC);
2580 76 : ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
2581 :
2582 :
2583 76 : ZEND_VM_NEXT_OPCODE();
2584 : }
2585 :
2586 : static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2587 291 : {
2588 291 : zend_op *opline = EX(opline);
2589 :
2590 291 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2591 :
2592 291 : compare_function(result,
2593 : &opline->op1.u.constant,
2594 : &opline->op2.u.constant TSRMLS_CC);
2595 291 : ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
2596 :
2597 :
2598 291 : ZEND_VM_NEXT_OPCODE();
2599 : }
2600 :
2601 : static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2602 22 : {
2603 22 : zend_op *opline = EX(opline);
2604 :
2605 22 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2606 :
2607 22 : compare_function(result,
2608 : &opline->op1.u.constant,
2609 : &opline->op2.u.constant TSRMLS_CC);
2610 22 : ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
2611 :
2612 :
2613 22 : ZEND_VM_NEXT_OPCODE();
2614 : }
2615 :
2616 : static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2617 0 : {
2618 0 : zend_op *opline = EX(opline);
2619 :
2620 0 : zval *result = &EX_T(opline->result.u.var).tmp_var;
2621 :
2622 0 : compare_function(result,
2623 : &opline->op1.u.constant,
2624 : &opline->op2.u.constant TSRMLS_CC);
2625 0 : ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
2626 :
2627 :
2628 0 : ZEND_VM_NEXT_OPCODE();
2629 : }
2630 :
2631 : static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2632 601 : {
2633 601 : zend_op *opline = EX(opline);
2634 :
2635 :
2636 601 : bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
2637 : &opline->op1.u.constant,
2638 : &opline->op2.u.constant TSRMLS_CC);
2639 :
2640 :
2641 601 : ZEND_VM_NEXT_OPCODE();
2642 : }
2643 :
2644 : static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2645 0 : {
2646 0 : zend_op *opline = EX(opline);
2647 :
2648 :
2649 0 : bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
2650 : &opline->op1.u.constant,
2651 : &opline->op2.u.constant TSRMLS_CC);
2652 :
2653 :
2654 0 : ZEND_VM_NEXT_OPCODE();
2655 : }
2656 :
2657 : static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2658 8 : {
2659 8 : zend_op *opline = EX(opline);
2660 :
2661 :
2662 8 : bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
2663 : &opline->op1.u.constant,
2664 : &opline->op2.u.constant TSRMLS_CC);
2665 :
2666 :
2667 8 : ZEND_VM_NEXT_OPCODE();
2668 : }
2669 :
2670 : static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2671 0 : {
2672 0 : zend_op *opline = EX(opline);
2673 :
2674 :
2675 0 : boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
2676 : &opline->op1.u.constant,
2677 : &opline->op2.u.constant TSRMLS_CC);
2678 :
2679 :
2680 0 : ZEND_VM_NEXT_OPCODE();
2681 : }
2682 :
2683 : static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2684 6 : {
2685 6 : zend_op *opline = EX(opline);
2686 :
2687 : zval *container;
2688 :
2689 : if (IS_CONST == IS_VAR && EX_T(opline->op1.u.var).var.ptr == NULL) {
2690 : zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
2691 : }
2692 : if (IS_CONST == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr) {
2693 : PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
2694 : }
2695 6 : container = &opline->op1.u.constant;
2696 6 : if (Z_TYPE_P(container) != IS_ARRAY) {
2697 6 : if (!RETURN_VALUE_UNUSED(&opline->result)) {
2698 6 : AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
2699 6 : PZVAL_LOCK(EG(uninitialized_zval_ptr));
2700 : }
2701 : } else {
2702 :
2703 0 : zval *dim = &opline->op2.u.constant;
2704 :
2705 0 : AI_SET_PTR(EX_T(opline->result.u.var).var, *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC));
2706 0 : SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
2707 :
2708 : }
2709 6 : ZEND_VM_NEXT_OPCODE();
2710 : }
2711 :
2712 : static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2713 2542 : {
2714 2542 : zend_op *opline = EX(opline);
2715 : zval *function_name;
2716 : zend_class_entry *ce;
2717 :
2718 2542 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
2719 :
2720 : if (IS_CONST == IS_CONST) {
2721 : /* no function found. try a static method in class */
2722 2542 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
2723 2542 : if (!ce) {
2724 0 : zend_error_noreturn(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
2725 : }
2726 2542 : EX(called_scope) = ce;
2727 : } else {
2728 : ce = EX_T(opline->op1.u.var).class_entry;
2729 :
2730 : if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
2731 : EX(called_scope) = EG(called_scope);
2732 : } else {
2733 : EX(called_scope) = ce;
2734 : }
2735 : }
2736 : if(IS_CONST != IS_UNUSED) {
2737 2542 : zstr function_name_strval = NULL_ZSTR;
2738 2542 : unsigned int function_name_strlen = 0;
2739 :
2740 : zend_uchar function_name_type;
2741 :
2742 : if (IS_CONST == IS_CONST) {
2743 2542 : function_name_strval = Z_UNIVAL(opline->op2.u.constant);
2744 2542 : function_name_strlen = Z_UNILEN(opline->op2.u.constant);
2745 2542 : function_name_type = Z_TYPE(opline->op2.u.constant);
2746 : } else {
2747 : function_name = &opline->op2.u.constant;
2748 :
2749 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
2750 : zend_error_noreturn(E_ERROR, "Function name must be a string");
2751 : } else {
2752 : function_name_strval = Z_UNIVAL_P(function_name);
2753 : function_name_strlen = Z_UNILEN_P(function_name);
2754 : function_name_type = Z_TYPE_P(function_name);
2755 : }
2756 : }
2757 :
2758 2542 : if (function_name_strval.v) {
2759 2542 : if (ce->get_static_method) {
2760 0 : EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
2761 : } else {
2762 2542 : EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
2763 : }
2764 2535 : if (!EX(fbc)) {
2765 3 : zend_error_noreturn(E_ERROR, "Call to undefined method %v::%R()", ce->name, function_name_type, function_name_strval);
2766 : }
2767 : }
2768 :
2769 : if (IS_CONST != IS_CONST) {
2770 :
2771 : }
2772 : } else {
2773 : if(!ce->constructor) {
2774 : zend_error_noreturn(E_ERROR, "Cannot call constructor");
2775 : }
2776 : if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
2777 : zend_error(E_COMPILE_ERROR, "Cannot call private %v::__construct()", ce->name);
2778 : }
2779 : EX(fbc) = ce->constructor;
2780 : }
2781 :
2782 2532 : if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
2783 2465 : EX(object) = NULL;
2784 : } else {
2785 67 : if (EG(This) &&
2786 : Z_OBJ_HT_P(EG(This))->get_class_entry &&
2787 : !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
2788 : /* We are calling method of the other (incompatible) class,
2789 : but passing $this. This is done for compatibility with php-4. */
2790 : int severity;
2791 : char *verb;
2792 1 : if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
2793 0 : severity = E_STRICT;
2794 0 : verb = "should not";
2795 : } else {
2796 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
2797 1 : severity = E_ERROR;
2798 1 : verb = "cannot";
2799 : }
2800 1 : zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
2801 :
2802 : }
2803 66 : if ((EX(object) = EG(This))) {
2804 43 : Z_ADDREF_P(EX(object));
2805 43 : EX(called_scope) = Z_OBJCE_P(EX(object));
2806 : }
2807 : }
2808 :
2809 2531 : ZEND_VM_NEXT_OPCODE();
2810 : }
2811 :
2812 : static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2813 12 : {
2814 12 : zend_op *opline = EX(opline);
2815 12 : int switch_expr_is_overloaded=0;
2816 :
2817 :
2818 : if (IS_CONST==IS_VAR) {
2819 : if (EX_T(opline->op1.u.var).var.ptr_ptr) {
2820 : PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
2821 : } else {
2822 : switch_expr_is_overloaded = 1;
2823 : Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
2824 : }
2825 : }
2826 12 : is_equal_function(&EX_T(opline->result.u.var).tmp_var,
2827 : &opline->op1.u.constant,
2828 : &opline->op2.u.constant TSRMLS_CC);
2829 :
2830 12 : if (switch_expr_is_overloaded) {
2831 : /* We only free op1 if this is a string offset,
2832 : * Since if it is a TMP_VAR, it'll be reused by
2833 : * other CASE opcodes (whereas string offsets
2834 : * are allocated at each get_zval_ptr())
2835 : */
2836 :
2837 0 : EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
2838 0 : EX_T(opline->op1.u.var).var.ptr = NULL;
2839 : }
2840 12 : ZEND_VM_NEXT_OPCODE();
2841 : }
2842 :
2843 : static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2844 7345 : {
2845 7345 : zend_op *opline = EX(opline);
2846 :
2847 : if (IS_CONST == IS_UNUSED) {
2848 : if (!zend_u_get_constant_ex(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), &EX_T(opline->result.u.var).tmp_var, NULL, opline->extended_value TSRMLS_CC)) {
2849 : if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
2850 : zstr actual;
2851 : unsigned int actual_len;
2852 : if(Z_TYPE(opline->op2.u.constant) == IS_UNICODE) {
2853 : actual.u = u_memrchr(Z_USTRVAL(opline->op2.u.constant), '\\', Z_USTRLEN(opline->op2.u.constant));
2854 : if(actual.u) {
2855 : actual.u++;
2856 : actual_len = Z_USTRLEN(opline->op2.u.constant) - (actual.u - Z_USTRVAL(opline->op2.u.constant));
2857 : }
2858 : } else {
2859 : actual.s = zend_memrchr(Z_STRVAL(opline->op2.u.constant), '\\', Z_STRLEN(opline->op2.u.constant));
2860 : if(actual.s) {
2861 : actual.s++;
2862 : actual_len = Z_STRLEN(opline->op2.u.constant) - (actual.s - Z_STRVAL(opline->op2.u.constant));
2863 : }
2864 : }
2865 : if(!actual.v) {
2866 : actual = Z_UNIVAL(opline->op2.u.constant);
2867 : actual_len = Z_UNILEN(opline->op2.u.constant);
2868 : }
2869 : /* non-qualified constant - allow text substitution */
2870 : zend_error(E_NOTICE, "Use of undefined constant %R - assumed '%R'",
2871 : Z_TYPE(opline->op2.u.constant), actual, Z_TYPE(opline->op2.u.constant), actual);
2872 : ZVAL_ZSTRL(&EX_T(opline->result.u.var).tmp_var, Z_TYPE(opline->op2.u.constant), actual, actual_len, 1);
2873 : } else {
2874 : zend_error_noreturn(E_ERROR, "Undefined constant '%R'", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
2875 : }
2876 : }
2877 : ZEND_VM_NEXT_OPCODE();
2878 : } else {
2879 : /* class constant */
2880 : zend_class_entry *ce;
2881 : zval **value;
2882 :
2883 : if (IS_CONST == IS_CONST) {
2884 :
2885 7345 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
2886 7344 : if (!ce) {
2887 0 : zend_error_noreturn(E_ERROR, "Undefined class constant '%R'", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
2888 : }
2889 : } else {
2890 : ce = EX_T(opline->op1.u.var).class_entry;
2891 : }
2892 :
2893 7344 : if (zend_u_hash_find(&ce->constants_table, Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant)+1, (void **) &value) == SUCCESS) {
2894 7342 : if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
2895 : (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
2896 25 : zend_class_entry *old_scope = EG(scope);
2897 :
2898 25 : EG(scope) = ce;
2899 25 : zval_update_constant(value, (void *) 1 TSRMLS_CC);
2900 23 : EG(scope) = old_scope;
2901 : }
2902 7340 : EX_T(opline->result.u.var).tmp_var = **value;
2903 7340 : zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
2904 : } else {
2905 2 : zend_error_noreturn(E_ERROR, "Undefined class constant '%R'", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
2906 : }
2907 :
2908 7340 : ZEND_VM_NEXT_OPCODE();
2909 : }
2910 : }
2911 :
2912 : static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2913 64565 : {
2914 64565 : zend_op *opline = EX(opline);
2915 :
2916 64565 : zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
2917 : zval *expr_ptr;
2918 64565 : zval *offset=&opline->op2.u.constant;
2919 :
2920 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
2921 : zval **expr_ptr_ptr = NULL;
2922 :
2923 : if (opline->extended_value) {
2924 : expr_ptr_ptr=NULL;
2925 : expr_ptr = *expr_ptr_ptr;
2926 : } else {
2927 : expr_ptr=&opline->op1.u.constant;
2928 : }
2929 : #else
2930 64565 : expr_ptr=&opline->op1.u.constant;
2931 : #endif
2932 :
2933 : if (0) { /* temporary variable */
2934 : zval *new_expr;
2935 :
2936 : ALLOC_ZVAL(new_expr);
2937 : INIT_PZVAL_COPY(new_expr, expr_ptr);
2938 : expr_ptr = new_expr;
2939 : } else {
2940 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
2941 : if (opline->extended_value) {
2942 : SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
2943 : expr_ptr = *expr_ptr_ptr;
2944 : Z_ADDREF_P(expr_ptr);
2945 : } else
2946 : #endif
2947 : if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
2948 : zval *new_expr;
2949 :
2950 64565 : ALLOC_ZVAL(new_expr);
2951 64565 : INIT_PZVAL_COPY(new_expr, expr_ptr);
2952 64565 : expr_ptr = new_expr;
2953 64565 : zendi_zval_copy_ctor(*expr_ptr);
2954 : } else {
2955 : Z_ADDREF_P(expr_ptr);
2956 : }
2957 : }
2958 64565 : if (offset) {
2959 64565 : switch (Z_TYPE_P(offset)) {
2960 : case IS_DOUBLE:
2961 278 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
2962 278 : break;
2963 : case IS_LONG:
2964 : case IS_BOOL:
2965 2005 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
2966 2005 : break;
2967 : case IS_STRING:
2968 : case IS_UNICODE:
2969 62162 : zend_u_symtable_update(Z_ARRVAL_P(array_ptr), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
2970 62162 : break;
2971 : case IS_NULL:
2972 120 : zend_u_hash_update(Z_ARRVAL_P(array_ptr), IS_UNICODE, EMPTY_ZSTR, sizeof(""), &expr_ptr, sizeof(zval *), NULL);
2973 120 : break;
2974 : default:
2975 0 : zend_error(E_WARNING, "Illegal offset type");
2976 0 : zval_ptr_dtor(&expr_ptr);
2977 : /* do nothing */
2978 : break;
2979 : }
2980 :
2981 : } else {
2982 0 : zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
2983 : }
2984 64565 : if (opline->extended_value) {
2985 :
2986 : } else {
2987 :
2988 : }
2989 64565 : ZEND_VM_NEXT_OPCODE();
2990 : }
2991 :
2992 : static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2993 33325 : {
2994 33325 : zend_op *opline = EX(opline);
2995 :
2996 33325 : array_init(&EX_T(opline->result.u.var).tmp_var);
2997 : if (IS_CONST == IS_UNUSED) {
2998 : ZEND_VM_NEXT_OPCODE();
2999 : #if 0 || IS_CONST != IS_UNUSED
3000 : } else {
3001 33325 : return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3002 : #endif
3003 : }
3004 : }
3005 :
3006 : static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3007 32 : {
3008 32 : zend_op *opline = EX(opline);
3009 :
3010 32 : zval *name = &opline->op1.u.constant;
3011 32 : zval *val = &opline->op2.u.constant;
3012 : zend_constant c;
3013 :
3014 34 : if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
3015 2 : zval tmp = *val;
3016 2 : zval *tmp_ptr = &tmp;
3017 :
3018 2 : if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
3019 0 : zval_copy_ctor(&tmp);
3020 : }
3021 2 : INIT_PZVAL(&tmp);
3022 2 : zval_update_constant(&tmp_ptr, NULL TSRMLS_CC);
3023 2 : c.value = *tmp_ptr;
3024 : } else {
3025 30 : c.value = *val;
3026 30 : zval_copy_ctor(&c.value);
3027 : }
3028 32 : c.flags = CONST_CS; /* non persistent, case sensetive */
3029 32 : if (Z_TYPE_P(name) == IS_UNICODE) {
3030 32 : c.name.u = zend_ustrndup(Z_USTRVAL_P(name), Z_USTRLEN_P(name));
3031 : } else {
3032 0 : c.name.s = zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name));
3033 : }
3034 32 : c.name_len = Z_UNILEN_P(name)+1;
3035 32 : c.module_number = PHP_USER_CONSTANT;
3036 :
3037 32 : if (zend_u_register_constant(Z_TYPE_P(name), &c TSRMLS_CC) == FAILURE) {
3038 : }
3039 :
3040 :
3041 32 : ZEND_VM_NEXT_OPCODE();
3042 : }
3043 :
3044 : static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3045 105 : {
3046 105 : zend_op *opline = EX(opline);
3047 : zend_op_array *op_array;
3048 :
3049 105 : if (zend_u_hash_quick_find(EG(function_table), IS_UNICODE, Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), Z_LVAL(opline->op2.u.constant), (void *) &op_array) == FAILURE ||
3050 : op_array->type != ZEND_USER_FUNCTION) {
3051 0 : zend_error_noreturn(E_ERROR, "Base lambda function for closure not found");
3052 : }
3053 :
3054 105 : zend_create_closure(&EX_T(opline->result.u.var).tmp_var, (zend_function*)op_array, EG(scope), EG(This) TSRMLS_CC);
3055 :
3056 105 : ZEND_VM_NEXT_OPCODE();
3057 : }
3058 :
3059 : static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3060 62578 : {
3061 62578 : zend_op *opline = EX(opline);
3062 : zend_free_op free_op2;
3063 :
3064 62578 : add_function(&EX_T(opline->result.u.var).tmp_var,
3065 : &opline->op1.u.constant,
3066 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3067 :
3068 62578 : zval_dtor(free_op2.var);
3069 62578 : ZEND_VM_NEXT_OPCODE();
3070 : }
3071 :
3072 : static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3073 39 : {
3074 39 : zend_op *opline = EX(opline);
3075 : zend_free_op free_op2;
3076 :
3077 39 : sub_function(&EX_T(opline->result.u.var).tmp_var,
3078 : &opline->op1.u.constant,
3079 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3080 :
3081 39 : zval_dtor(free_op2.var);
3082 39 : ZEND_VM_NEXT_OPCODE();
3083 : }
3084 :
3085 : static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3086 5 : {
3087 5 : zend_op *opline = EX(opline);
3088 : zend_free_op free_op2;
3089 :
3090 5 : mul_function(&EX_T(opline->result.u.var).tmp_var,
3091 : &opline->op1.u.constant,
3092 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3093 :
3094 5 : zval_dtor(free_op2.var);
3095 5 : ZEND_VM_NEXT_OPCODE();
3096 : }
3097 :
3098 : static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3099 0 : {
3100 0 : zend_op *opline = EX(opline);
3101 : zend_free_op free_op2;
3102 :
3103 0 : div_function(&EX_T(opline->result.u.var).tmp_var,
3104 : &opline->op1.u.constant,
3105 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3106 :
3107 0 : zval_dtor(free_op2.var);
3108 0 : ZEND_VM_NEXT_OPCODE();
3109 : }
3110 :
3111 : static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3112 0 : {
3113 0 : zend_op *opline = EX(opline);
3114 : zend_free_op free_op2;
3115 :
3116 0 : mod_function(&EX_T(opline->result.u.var).tmp_var,
3117 : &opline->op1.u.constant,
3118 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3119 :
3120 0 : zval_dtor(free_op2.var);
3121 0 : ZEND_VM_NEXT_OPCODE();
3122 : }
3123 :
3124 : static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3125 0 : {
3126 0 : zend_op *opline = EX(opline);
3127 : zend_free_op free_op2;
3128 :
3129 0 : shift_left_function(&EX_T(opline->result.u.var).tmp_var,
3130 : &opline->op1.u.constant,
3131 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3132 :
3133 0 : zval_dtor(free_op2.var);
3134 0 : ZEND_VM_NEXT_OPCODE();
3135 : }
3136 :
3137 : static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3138 0 : {
3139 0 : zend_op *opline = EX(opline);
3140 : zend_free_op free_op2;
3141 :
3142 0 : shift_right_function(&EX_T(opline->result.u.var).tmp_var,
3143 : &opline->op1.u.constant,
3144 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3145 :
3146 0 : zval_dtor(free_op2.var);
3147 0 : ZEND_VM_NEXT_OPCODE();
3148 : }
3149 :
3150 : static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3151 1327 : {
3152 1327 : zend_op *opline = EX(opline);
3153 : zend_free_op free_op2;
3154 :
3155 1327 : concat_function(&EX_T(opline->result.u.var).tmp_var,
3156 : &opline->op1.u.constant,
3157 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3158 :
3159 1327 : zval_dtor(free_op2.var);
3160 1327 : ZEND_VM_NEXT_OPCODE();
3161 : }
3162 :
3163 : static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3164 0 : {
3165 0 : zend_op *opline = EX(opline);
3166 : zend_free_op free_op2;
3167 :
3168 0 : is_identical_function(&EX_T(opline->result.u.var).tmp_var,
3169 : &opline->op1.u.constant,
3170 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3171 :
3172 0 : zval_dtor(free_op2.var);
3173 0 : ZEND_VM_NEXT_OPCODE();
3174 : }
3175 :
3176 : static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3177 12 : {
3178 12 : zend_op *opline = EX(opline);
3179 : zend_free_op free_op2;
3180 12 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3181 :
3182 12 : is_identical_function(result,
3183 : &opline->op1.u.constant,
3184 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3185 12 : Z_LVAL_P(result) = !Z_LVAL_P(result);
3186 :
3187 12 : zval_dtor(free_op2.var);
3188 12 : ZEND_VM_NEXT_OPCODE();
3189 : }
3190 :
3191 : static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3192 12 : {
3193 12 : zend_op *opline = EX(opline);
3194 : zend_free_op free_op2;
3195 12 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3196 :
3197 12 : compare_function(result,
3198 : &opline->op1.u.constant,
3199 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3200 12 : ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
3201 :
3202 12 : zval_dtor(free_op2.var);
3203 12 : ZEND_VM_NEXT_OPCODE();
3204 : }
3205 :
3206 : static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3207 0 : {
3208 0 : zend_op *opline = EX(opline);
3209 : zend_free_op free_op2;
3210 0 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3211 :
3212 0 : compare_function(result,
3213 : &opline->op1.u.constant,
3214 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3215 0 : ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
3216 :
3217 0 : zval_dtor(free_op2.var);
3218 0 : ZEND_VM_NEXT_OPCODE();
3219 : }
3220 :
3221 : static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3222 8755978 : {
3223 8755978 : zend_op *opline = EX(opline);
3224 : zend_free_op free_op2;
3225 8755978 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3226 :
3227 8755978 : compare_function(result,
3228 : &opline->op1.u.constant,
3229 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3230 8755978 : ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
3231 :
3232 8755978 : zval_dtor(free_op2.var);
3233 8755978 : ZEND_VM_NEXT_OPCODE();
3234 : }
3235 :
3236 : static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3237 18357 : {
3238 18357 : zend_op *opline = EX(opline);
3239 : zend_free_op free_op2;
3240 18357 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3241 :
3242 18357 : compare_function(result,
3243 : &opline->op1.u.constant,
3244 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3245 18357 : ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
3246 :
3247 18357 : zval_dtor(free_op2.var);
3248 18357 : ZEND_VM_NEXT_OPCODE();
3249 : }
3250 :
3251 : static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3252 6157 : {
3253 6157 : zend_op *opline = EX(opline);
3254 : zend_free_op free_op2;
3255 :
3256 6157 : bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
3257 : &opline->op1.u.constant,
3258 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3259 :
3260 6157 : zval_dtor(free_op2.var);
3261 6157 : ZEND_VM_NEXT_OPCODE();
3262 : }
3263 :
3264 : static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3265 81 : {
3266 81 : zend_op *opline = EX(opline);
3267 : zend_free_op free_op2;
3268 :
3269 81 : bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
3270 : &opline->op1.u.constant,
3271 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3272 :
3273 81 : zval_dtor(free_op2.var);
3274 81 : ZEND_VM_NEXT_OPCODE();
3275 : }
3276 :
3277 : static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3278 0 : {
3279 0 : zend_op *opline = EX(opline);
3280 : zend_free_op free_op2;
3281 :
3282 0 : bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
3283 : &opline->op1.u.constant,
3284 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3285 :
3286 0 : zval_dtor(free_op2.var);
3287 0 : ZEND_VM_NEXT_OPCODE();
3288 : }
3289 :
3290 : static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3291 0 : {
3292 0 : zend_op *opline = EX(opline);
3293 : zend_free_op free_op2;
3294 :
3295 0 : boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
3296 : &opline->op1.u.constant,
3297 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3298 :
3299 0 : zval_dtor(free_op2.var);
3300 0 : ZEND_VM_NEXT_OPCODE();
3301 : }
3302 :
3303 : static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3304 0 : {
3305 0 : zend_op *opline = EX(opline);
3306 : zval *function_name;
3307 : zend_class_entry *ce;
3308 :
3309 0 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
3310 :
3311 : if (IS_CONST == IS_CONST) {
3312 : /* no function found. try a static method in class */
3313 0 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
3314 0 : if (!ce) {
3315 0 : zend_error_noreturn(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
3316 : }
3317 0 : EX(called_scope) = ce;
3318 : } else {
3319 : ce = EX_T(opline->op1.u.var).class_entry;
3320 :
3321 : if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
3322 : EX(called_scope) = EG(called_scope);
3323 : } else {
3324 : EX(called_scope) = ce;
3325 : }
3326 : }
3327 : if(IS_TMP_VAR != IS_UNUSED) {
3328 0 : zstr function_name_strval = NULL_ZSTR;
3329 0 : unsigned int function_name_strlen = 0;
3330 : zend_free_op free_op2;
3331 : zend_uchar function_name_type;
3332 :
3333 : if (IS_TMP_VAR == IS_CONST) {
3334 : function_name_strval = Z_UNIVAL(opline->op2.u.constant);
3335 : function_name_strlen = Z_UNILEN(opline->op2.u.constant);
3336 : function_name_type = Z_TYPE(opline->op2.u.constant);
3337 : } else {
3338 0 : function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
3339 :
3340 0 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
3341 0 : zend_error_noreturn(E_ERROR, "Function name must be a string");
3342 : } else {
3343 0 : function_name_strval = Z_UNIVAL_P(function_name);
3344 0 : function_name_strlen = Z_UNILEN_P(function_name);
3345 0 : function_name_type = Z_TYPE_P(function_name);
3346 : }
3347 : }
3348 :
3349 0 : if (function_name_strval.v) {
3350 0 : if (ce->get_static_method) {
3351 0 : EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
3352 : } else {
3353 0 : EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
3354 : }
3355 0 : if (!EX(fbc)) {
3356 0 : zend_error_noreturn(E_ERROR, "Call to undefined method %v::%R()", ce->name, function_name_type, function_name_strval);
3357 : }
3358 : }
3359 :
3360 : if (IS_TMP_VAR != IS_CONST) {
3361 0 : zval_dtor(free_op2.var);
3362 : }
3363 : } else {
3364 : if(!ce->constructor) {
3365 : zend_error_noreturn(E_ERROR, "Cannot call constructor");
3366 : }
3367 : if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
3368 : zend_error(E_COMPILE_ERROR, "Cannot call private %v::__construct()", ce->name);
3369 : }
3370 : EX(fbc) = ce->constructor;
3371 : }
3372 :
3373 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
3374 0 : EX(object) = NULL;
3375 : } else {
3376 0 : if (EG(This) &&
3377 : Z_OBJ_HT_P(EG(This))->get_class_entry &&
3378 : !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
3379 : /* We are calling method of the other (incompatible) class,
3380 : but passing $this. This is done for compatibility with php-4. */
3381 : int severity;
3382 : char *verb;
3383 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
3384 0 : severity = E_STRICT;
3385 0 : verb = "should not";
3386 : } else {
3387 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
3388 0 : severity = E_ERROR;
3389 0 : verb = "cannot";
3390 : }
3391 0 : zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
3392 :
3393 : }
3394 0 : if ((EX(object) = EG(This))) {
3395 0 : Z_ADDREF_P(EX(object));
3396 0 : EX(called_scope) = Z_OBJCE_P(EX(object));
3397 : }
3398 : }
3399 :
3400 0 : ZEND_VM_NEXT_OPCODE();
3401 : }
3402 :
3403 : static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3404 0 : {
3405 0 : zend_op *opline = EX(opline);
3406 0 : int switch_expr_is_overloaded=0;
3407 : zend_free_op free_op2;
3408 :
3409 : if (IS_CONST==IS_VAR) {
3410 : if (EX_T(opline->op1.u.var).var.ptr_ptr) {
3411 : PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
3412 : } else {
3413 : switch_expr_is_overloaded = 1;
3414 : Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
3415 : }
3416 : }
3417 0 : is_equal_function(&EX_T(opline->result.u.var).tmp_var,
3418 : &opline->op1.u.constant,
3419 : _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3420 :
3421 0 : zval_dtor(free_op2.var);
3422 0 : if (switch_expr_is_overloaded) {
3423 : /* We only free op1 if this is a string offset,
3424 : * Since if it is a TMP_VAR, it'll be reused by
3425 : * other CASE opcodes (whereas string offsets
3426 : * are allocated at each get_zval_ptr())
3427 : */
3428 :
3429 0 : EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
3430 0 : EX_T(opline->op1.u.var).var.ptr = NULL;
3431 : }
3432 0 : ZEND_VM_NEXT_OPCODE();
3433 : }
3434 :
3435 : static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3436 100 : {
3437 100 : zend_op *opline = EX(opline);
3438 : zend_free_op free_op2;
3439 100 : zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
3440 : zval *expr_ptr;
3441 100 : zval *offset=_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
3442 :
3443 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
3444 : zval **expr_ptr_ptr = NULL;
3445 :
3446 : if (opline->extended_value) {
3447 : expr_ptr_ptr=NULL;
3448 : expr_ptr = *expr_ptr_ptr;
3449 : } else {
3450 : expr_ptr=&opline->op1.u.constant;
3451 : }
3452 : #else
3453 100 : expr_ptr=&opline->op1.u.constant;
3454 : #endif
3455 :
3456 : if (0) { /* temporary variable */
3457 : zval *new_expr;
3458 :
3459 : ALLOC_ZVAL(new_expr);
3460 : INIT_PZVAL_COPY(new_expr, expr_ptr);
3461 : expr_ptr = new_expr;
3462 : } else {
3463 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
3464 : if (opline->extended_value) {
3465 : SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
3466 : expr_ptr = *expr_ptr_ptr;
3467 : Z_ADDREF_P(expr_ptr);
3468 : } else
3469 : #endif
3470 : if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
3471 : zval *new_expr;
3472 :
3473 100 : ALLOC_ZVAL(new_expr);
3474 100 : INIT_PZVAL_COPY(new_expr, expr_ptr);
3475 100 : expr_ptr = new_expr;
3476 100 : zendi_zval_copy_ctor(*expr_ptr);
3477 : } else {
3478 : Z_ADDREF_P(expr_ptr);
3479 : }
3480 : }
3481 100 : if (offset) {
3482 100 : switch (Z_TYPE_P(offset)) {
3483 : case IS_DOUBLE:
3484 0 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
3485 0 : break;
3486 : case IS_LONG:
3487 : case IS_BOOL:
3488 92 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
3489 92 : break;
3490 : case IS_STRING:
3491 : case IS_UNICODE:
3492 7 : zend_u_symtable_update(Z_ARRVAL_P(array_ptr), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
3493 7 : break;
3494 : case IS_NULL:
3495 0 : zend_u_hash_update(Z_ARRVAL_P(array_ptr), IS_UNICODE, EMPTY_ZSTR, sizeof(""), &expr_ptr, sizeof(zval *), NULL);
3496 0 : break;
3497 : default:
3498 1 : zend_error(E_WARNING, "Illegal offset type");
3499 1 : zval_ptr_dtor(&expr_ptr);
3500 : /* do nothing */
3501 : break;
3502 : }
3503 100 : zval_dtor(free_op2.var);
3504 : } else {
3505 0 : zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
3506 : }
3507 100 : if (opline->extended_value) {
3508 :
3509 : } else {
3510 :
3511 : }
3512 100 : ZEND_VM_NEXT_OPCODE();
3513 : }
3514 :
3515 : static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3516 66 : {
3517 66 : zend_op *opline = EX(opline);
3518 :
3519 66 : array_init(&EX_T(opline->result.u.var).tmp_var);
3520 : if (IS_CONST == IS_UNUSED) {
3521 : ZEND_VM_NEXT_OPCODE();
3522 : #if 0 || IS_CONST != IS_UNUSED
3523 : } else {
3524 66 : return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3525 : #endif
3526 : }
3527 : }
3528 :
3529 : static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3530 1 : {
3531 1 : zend_op *opline = EX(opline);
3532 : zend_free_op free_op2;
3533 :
3534 1 : add_function(&EX_T(opline->result.u.var).tmp_var,
3535 : &opline->op1.u.constant,
3536 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3537 :
3538 1 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3539 1 : ZEND_VM_NEXT_OPCODE();
3540 : }
3541 :
3542 : static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3543 2193 : {
3544 2193 : zend_op *opline = EX(opline);
3545 : zend_free_op free_op2;
3546 :
3547 2193 : sub_function(&EX_T(opline->result.u.var).tmp_var,
3548 : &opline->op1.u.constant,
3549 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3550 :
3551 2193 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3552 2193 : ZEND_VM_NEXT_OPCODE();
3553 : }
3554 :
3555 : static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3556 15 : {
3557 15 : zend_op *opline = EX(opline);
3558 : zend_free_op free_op2;
3559 :
3560 15 : mul_function(&EX_T(opline->result.u.var).tmp_var,
3561 : &opline->op1.u.constant,
3562 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3563 :
3564 15 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3565 15 : ZEND_VM_NEXT_OPCODE();
3566 : }
3567 :
3568 : static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3569 0 : {
3570 0 : zend_op *opline = EX(opline);
3571 : zend_free_op free_op2;
3572 :
3573 0 : div_function(&EX_T(opline->result.u.var).tmp_var,
3574 : &opline->op1.u.constant,
3575 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3576 :
3577 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3578 0 : ZEND_VM_NEXT_OPCODE();
3579 : }
3580 :
3581 : static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3582 0 : {
3583 0 : zend_op *opline = EX(opline);
3584 : zend_free_op free_op2;
3585 :
3586 0 : mod_function(&EX_T(opline->result.u.var).tmp_var,
3587 : &opline->op1.u.constant,
3588 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3589 :
3590 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3591 0 : ZEND_VM_NEXT_OPCODE();
3592 : }
3593 :
3594 : static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3595 0 : {
3596 0 : zend_op *opline = EX(opline);
3597 : zend_free_op free_op2;
3598 :
3599 0 : shift_left_function(&EX_T(opline->result.u.var).tmp_var,
3600 : &opline->op1.u.constant,
3601 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3602 :
3603 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3604 0 : ZEND_VM_NEXT_OPCODE();
3605 : }
3606 :
3607 : static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3608 0 : {
3609 0 : zend_op *opline = EX(opline);
3610 : zend_free_op free_op2;
3611 :
3612 0 : shift_right_function(&EX_T(opline->result.u.var).tmp_var,
3613 : &opline->op1.u.constant,
3614 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3615 :
3616 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3617 0 : ZEND_VM_NEXT_OPCODE();
3618 : }
3619 :
3620 : static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3621 144922 : {
3622 144922 : zend_op *opline = EX(opline);
3623 : zend_free_op free_op2;
3624 :
3625 144922 : concat_function(&EX_T(opline->result.u.var).tmp_var,
3626 : &opline->op1.u.constant,
3627 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3628 :
3629 144922 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3630 144922 : ZEND_VM_NEXT_OPCODE();
3631 : }
3632 :
3633 : static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3634 113 : {
3635 113 : zend_op *opline = EX(opline);
3636 : zend_free_op free_op2;
3637 :
3638 113 : is_identical_function(&EX_T(opline->result.u.var).tmp_var,
3639 : &opline->op1.u.constant,
3640 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3641 :
3642 113 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3643 113 : ZEND_VM_NEXT_OPCODE();
3644 : }
3645 :
3646 : static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3647 25775 : {
3648 25775 : zend_op *opline = EX(opline);
3649 : zend_free_op free_op2;
3650 25775 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3651 :
3652 25775 : is_identical_function(result,
3653 : &opline->op1.u.constant,
3654 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3655 25775 : Z_LVAL_P(result) = !Z_LVAL_P(result);
3656 :
3657 25775 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3658 25775 : ZEND_VM_NEXT_OPCODE();
3659 : }
3660 :
3661 : static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3662 1808 : {
3663 1808 : zend_op *opline = EX(opline);
3664 : zend_free_op free_op2;
3665 1808 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3666 :
3667 1808 : compare_function(result,
3668 : &opline->op1.u.constant,
3669 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3670 1808 : ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
3671 :
3672 1808 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3673 1808 : ZEND_VM_NEXT_OPCODE();
3674 : }
3675 :
3676 : static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3677 82 : {
3678 82 : zend_op *opline = EX(opline);
3679 : zend_free_op free_op2;
3680 82 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3681 :
3682 82 : compare_function(result,
3683 : &opline->op1.u.constant,
3684 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3685 82 : ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
3686 :
3687 82 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3688 82 : ZEND_VM_NEXT_OPCODE();
3689 : }
3690 :
3691 : static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3692 5867432 : {
3693 5867432 : zend_op *opline = EX(opline);
3694 : zend_free_op free_op2;
3695 5867432 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3696 :
3697 5867432 : compare_function(result,
3698 : &opline->op1.u.constant,
3699 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3700 5867432 : ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
3701 :
3702 5867432 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3703 5867432 : ZEND_VM_NEXT_OPCODE();
3704 : }
3705 :
3706 : static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3707 22 : {
3708 22 : zend_op *opline = EX(opline);
3709 : zend_free_op free_op2;
3710 22 : zval *result = &EX_T(opline->result.u.var).tmp_var;
3711 :
3712 22 : compare_function(result,
3713 : &opline->op1.u.constant,
3714 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3715 22 : ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
3716 :
3717 22 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3718 22 : ZEND_VM_NEXT_OPCODE();
3719 : }
3720 :
3721 : static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3722 0 : {
3723 0 : zend_op *opline = EX(opline);
3724 : zend_free_op free_op2;
3725 :
3726 0 : bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
3727 : &opline->op1.u.constant,
3728 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3729 :
3730 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3731 0 : ZEND_VM_NEXT_OPCODE();
3732 : }
3733 :
3734 : static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3735 1 : {
3736 1 : zend_op *opline = EX(opline);
3737 : zend_free_op free_op2;
3738 :
3739 1 : bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
3740 : &opline->op1.u.constant,
3741 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3742 :
3743 1 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3744 1 : ZEND_VM_NEXT_OPCODE();
3745 : }
3746 :
3747 : static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3748 0 : {
3749 0 : zend_op *opline = EX(opline);
3750 : zend_free_op free_op2;
3751 :
3752 0 : bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
3753 : &opline->op1.u.constant,
3754 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3755 :
3756 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3757 0 : ZEND_VM_NEXT_OPCODE();
3758 : }
3759 :
3760 : static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3761 0 : {
3762 0 : zend_op *opline = EX(opline);
3763 : zend_free_op free_op2;
3764 :
3765 0 : boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
3766 : &opline->op1.u.constant,
3767 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3768 :
3769 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3770 0 : ZEND_VM_NEXT_OPCODE();
3771 : }
3772 :
3773 : static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3774 2 : {
3775 2 : zend_op *opline = EX(opline);
3776 : zval *function_name;
3777 : zend_class_entry *ce;
3778 :
3779 2 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
3780 :
3781 : if (IS_CONST == IS_CONST) {
3782 : /* no function found. try a static method in class */
3783 2 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
3784 2 : if (!ce) {
3785 0 : zend_error_noreturn(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
3786 : }
3787 2 : EX(called_scope) = ce;
3788 : } else {
3789 : ce = EX_T(opline->op1.u.var).class_entry;
3790 :
3791 : if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
3792 : EX(called_scope) = EG(called_scope);
3793 : } else {
3794 : EX(called_scope) = ce;
3795 : }
3796 : }
3797 : if(IS_VAR != IS_UNUSED) {
3798 2 : zstr function_name_strval = NULL_ZSTR;
3799 2 : unsigned int function_name_strlen = 0;
3800 : zend_free_op free_op2;
3801 : zend_uchar function_name_type;
3802 :
3803 : if (IS_VAR == IS_CONST) {
3804 : function_name_strval = Z_UNIVAL(opline->op2.u.constant);
3805 : function_name_strlen = Z_UNILEN(opline->op2.u.constant);
3806 : function_name_type = Z_TYPE(opline->op2.u.constant);
3807 : } else {
3808 2 : function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
3809 :
3810 2 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
3811 0 : zend_error_noreturn(E_ERROR, "Function name must be a string");
3812 : } else {
3813 2 : function_name_strval = Z_UNIVAL_P(function_name);
3814 2 : function_name_strlen = Z_UNILEN_P(function_name);
3815 2 : function_name_type = Z_TYPE_P(function_name);
3816 : }
3817 : }
3818 :
3819 2 : if (function_name_strval.v) {
3820 2 : if (ce->get_static_method) {
3821 0 : EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
3822 : } else {
3823 2 : EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
3824 : }
3825 2 : if (!EX(fbc)) {
3826 0 : zend_error_noreturn(E_ERROR, "Call to undefined method %v::%R()", ce->name, function_name_type, function_name_strval);
3827 : }
3828 : }
3829 :
3830 : if (IS_VAR != IS_CONST) {
3831 2 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3832 : }
3833 : } else {
3834 : if(!ce->constructor) {
3835 : zend_error_noreturn(E_ERROR, "Cannot call constructor");
3836 : }
3837 : if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
3838 : zend_error(E_COMPILE_ERROR, "Cannot call private %v::__construct()", ce->name);
3839 : }
3840 : EX(fbc) = ce->constructor;
3841 : }
3842 :
3843 2 : if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
3844 1 : EX(object) = NULL;
3845 : } else {
3846 1 : if (EG(This) &&
3847 : Z_OBJ_HT_P(EG(This))->get_class_entry &&
3848 : !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
3849 : /* We are calling method of the other (incompatible) class,
3850 : but passing $this. This is done for compatibility with php-4. */
3851 : int severity;
3852 : char *verb;
3853 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
3854 0 : severity = E_STRICT;
3855 0 : verb = "should not";
3856 : } else {
3857 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
3858 0 : severity = E_ERROR;
3859 0 : verb = "cannot";
3860 : }
3861 0 : zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
3862 :
3863 : }
3864 1 : if ((EX(object) = EG(This))) {
3865 0 : Z_ADDREF_P(EX(object));
3866 0 : EX(called_scope) = Z_OBJCE_P(EX(object));
3867 : }
3868 : }
3869 :
3870 2 : ZEND_VM_NEXT_OPCODE();
3871 : }
3872 :
3873 : static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3874 0 : {
3875 0 : zend_op *opline = EX(opline);
3876 0 : int switch_expr_is_overloaded=0;
3877 : zend_free_op free_op2;
3878 :
3879 : if (IS_CONST==IS_VAR) {
3880 : if (EX_T(opline->op1.u.var).var.ptr_ptr) {
3881 : PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
3882 : } else {
3883 : switch_expr_is_overloaded = 1;
3884 : Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
3885 : }
3886 : }
3887 0 : is_equal_function(&EX_T(opline->result.u.var).tmp_var,
3888 : &opline->op1.u.constant,
3889 : _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
3890 :
3891 0 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3892 0 : if (switch_expr_is_overloaded) {
3893 : /* We only free op1 if this is a string offset,
3894 : * Since if it is a TMP_VAR, it'll be reused by
3895 : * other CASE opcodes (whereas string offsets
3896 : * are allocated at each get_zval_ptr())
3897 : */
3898 :
3899 0 : EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
3900 0 : EX_T(opline->op1.u.var).var.ptr = NULL;
3901 : }
3902 0 : ZEND_VM_NEXT_OPCODE();
3903 : }
3904 :
3905 : static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3906 56 : {
3907 56 : zend_op *opline = EX(opline);
3908 : zend_free_op free_op2;
3909 56 : zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
3910 : zval *expr_ptr;
3911 56 : zval *offset=_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
3912 :
3913 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
3914 : zval **expr_ptr_ptr = NULL;
3915 :
3916 : if (opline->extended_value) {
3917 : expr_ptr_ptr=NULL;
3918 : expr_ptr = *expr_ptr_ptr;
3919 : } else {
3920 : expr_ptr=&opline->op1.u.constant;
3921 : }
3922 : #else
3923 56 : expr_ptr=&opline->op1.u.constant;
3924 : #endif
3925 :
3926 : if (0) { /* temporary variable */
3927 : zval *new_expr;
3928 :
3929 : ALLOC_ZVAL(new_expr);
3930 : INIT_PZVAL_COPY(new_expr, expr_ptr);
3931 : expr_ptr = new_expr;
3932 : } else {
3933 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
3934 : if (opline->extended_value) {
3935 : SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
3936 : expr_ptr = *expr_ptr_ptr;
3937 : Z_ADDREF_P(expr_ptr);
3938 : } else
3939 : #endif
3940 : if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
3941 : zval *new_expr;
3942 :
3943 56 : ALLOC_ZVAL(new_expr);
3944 56 : INIT_PZVAL_COPY(new_expr, expr_ptr);
3945 56 : expr_ptr = new_expr;
3946 56 : zendi_zval_copy_ctor(*expr_ptr);
3947 : } else {
3948 : Z_ADDREF_P(expr_ptr);
3949 : }
3950 : }
3951 56 : if (offset) {
3952 56 : switch (Z_TYPE_P(offset)) {
3953 : case IS_DOUBLE:
3954 0 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
3955 0 : break;
3956 : case IS_LONG:
3957 : case IS_BOOL:
3958 0 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
3959 0 : break;
3960 : case IS_STRING:
3961 : case IS_UNICODE:
3962 0 : zend_u_symtable_update(Z_ARRVAL_P(array_ptr), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
3963 0 : break;
3964 : case IS_NULL:
3965 45 : zend_u_hash_update(Z_ARRVAL_P(array_ptr), IS_UNICODE, EMPTY_ZSTR, sizeof(""), &expr_ptr, sizeof(zval *), NULL);
3966 45 : break;
3967 : default:
3968 11 : zend_error(E_WARNING, "Illegal offset type");
3969 11 : zval_ptr_dtor(&expr_ptr);
3970 : /* do nothing */
3971 : break;
3972 : }
3973 56 : if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
3974 : } else {
3975 0 : zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
3976 : }
3977 56 : if (opline->extended_value) {
3978 :
3979 : } else {
3980 :
3981 : }
3982 56 : ZEND_VM_NEXT_OPCODE();
3983 : }
3984 :
3985 : static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3986 38 : {
3987 38 : zend_op *opline = EX(opline);
3988 :
3989 38 : array_init(&EX_T(opline->result.u.var).tmp_var);
3990 : if (IS_CONST == IS_UNUSED) {
3991 : ZEND_VM_NEXT_OPCODE();
3992 : #if 0 || IS_CONST != IS_UNUSED
3993 : } else {
3994 38 : return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3995 : #endif
3996 : }
3997 : }
3998 :
3999 : static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4000 1 : {
4001 1 : zend_op *opline = EX(opline);
4002 : zval *function_name;
4003 : zend_class_entry *ce;
4004 :
4005 1 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
4006 :
4007 : if (IS_CONST == IS_CONST) {
4008 : /* no function found. try a static method in class */
4009 1 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
4010 1 : if (!ce) {
4011 0 : zend_error_noreturn(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
4012 : }
4013 1 : EX(called_scope) = ce;
4014 : } else {
4015 : ce = EX_T(opline->op1.u.var).class_entry;
4016 :
4017 : if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
4018 : EX(called_scope) = EG(called_scope);
4019 : } else {
4020 : EX(called_scope) = ce;
4021 : }
4022 : }
4023 : if(IS_UNUSED != IS_UNUSED) {
4024 : zstr function_name_strval = NULL_ZSTR;
4025 : unsigned int function_name_strlen = 0;
4026 :
4027 : zend_uchar function_name_type;
4028 :
4029 : if (IS_UNUSED == IS_CONST) {
4030 : function_name_strval = Z_UNIVAL(opline->op2.u.constant);
4031 : function_name_strlen = Z_UNILEN(opline->op2.u.constant);
4032 : function_name_type = Z_TYPE(opline->op2.u.constant);
4033 : } else {
4034 : function_name = NULL;
4035 :
4036 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
4037 : zend_error_noreturn(E_ERROR, "Function name must be a string");
4038 : } else {
4039 : function_name_strval = Z_UNIVAL_P(function_name);
4040 : function_name_strlen = Z_UNILEN_P(function_name);
4041 : function_name_type = Z_TYPE_P(function_name);
4042 : }
4043 : }
4044 :
4045 : if (function_name_strval.v) {
4046 : if (ce->get_static_method) {
4047 : EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
4048 : } else {
4049 : EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
4050 : }
4051 : if (!EX(fbc)) {
4052 : zend_error_noreturn(E_ERROR, "Call to undefined method %v::%R()", ce->name, function_name_type, function_name_strval);
4053 : }
4054 : }
4055 :
4056 : if (IS_UNUSED != IS_CONST) {
4057 :
4058 : }
4059 : } else {
4060 1 : if(!ce->constructor) {
4061 1 : zend_error_noreturn(E_ERROR, "Cannot call constructor");
4062 : }
4063 0 : if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
4064 0 : zend_error(E_COMPILE_ERROR, "Cannot call private %v::__construct()", ce->name);
4065 : }
4066 0 : EX(fbc) = ce->constructor;
4067 : }
4068 :
4069 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
4070 0 : EX(object) = NULL;
4071 : } else {
4072 0 : if (EG(This) &&
4073 : Z_OBJ_HT_P(EG(This))->get_class_entry &&
4074 : !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
4075 : /* We are calling method of the other (incompatible) class,
4076 : but passing $this. This is done for compatibility with php-4. */
4077 : int severity;
4078 : char *verb;
4079 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
4080 0 : severity = E_STRICT;
4081 0 : verb = "should not";
4082 : } else {
4083 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
4084 0 : severity = E_ERROR;
4085 0 : verb = "cannot";
4086 : }
4087 0 : zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
4088 :
4089 : }
4090 0 : if ((EX(object) = EG(This))) {
4091 0 : Z_ADDREF_P(EX(object));
4092 0 : EX(called_scope) = Z_OBJCE_P(EX(object));
4093 : }
4094 : }
4095 :
4096 0 : ZEND_VM_NEXT_OPCODE();
4097 : }
4098 :
4099 : static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4100 313273 : {
4101 313273 : zend_op *opline = EX(opline);
4102 :
4103 313273 : zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
4104 : zval *expr_ptr;
4105 313273 : zval *offset=NULL;
4106 :
4107 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
4108 : zval **expr_ptr_ptr = NULL;
4109 :
4110 : if (opline->extended_value) {
4111 : expr_ptr_ptr=NULL;
4112 : expr_ptr = *expr_ptr_ptr;
4113 : } else {
4114 : expr_ptr=&opline->op1.u.constant;
4115 : }
4116 : #else
4117 313273 : expr_ptr=&opline->op1.u.constant;
4118 : #endif
4119 :
4120 : if (0) { /* temporary variable */
4121 : zval *new_expr;
4122 :
4123 : ALLOC_ZVAL(new_expr);
4124 : INIT_PZVAL_COPY(new_expr, expr_ptr);
4125 : expr_ptr = new_expr;
4126 : } else {
4127 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
4128 : if (opline->extended_value) {
4129 : SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
4130 : expr_ptr = *expr_ptr_ptr;
4131 : Z_ADDREF_P(expr_ptr);
4132 : } else
4133 : #endif
4134 : if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
4135 : zval *new_expr;
4136 :
4137 313273 : ALLOC_ZVAL(new_expr);
4138 313273 : INIT_PZVAL_COPY(new_expr, expr_ptr);
4139 313273 : expr_ptr = new_expr;
4140 313273 : zendi_zval_copy_ctor(*expr_ptr);
4141 : } else {
4142 : Z_ADDREF_P(expr_ptr);
4143 : }
4144 : }
4145 313273 : if (offset) {
4146 0 : switch (Z_TYPE_P(offset)) {
4147 : case IS_DOUBLE:
4148 0 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
4149 0 : break;
4150 : case IS_LONG:
4151 : case IS_BOOL:
4152 0 : zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
4153 0 : break;
4154 : case IS_STRING:
4155 : case IS_UNICODE:
4156 0 : zend_u_symtable_update(Z_ARRVAL_P(array_ptr), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
4157 0 : break;
4158 : case IS_NULL:
4159 0 : zend_u_hash_update(Z_ARRVAL_P(array_ptr), IS_UNICODE, EMPTY_ZSTR, sizeof(""), &expr_ptr, sizeof(zval *), NULL);
4160 0 : break;
4161 : default:
4162 0 : zend_error(E_WARNING, "Illegal offset type");
4163 0 : zval_ptr_dtor(&expr_ptr);
4164 : /* do nothing */
4165 : break;
4166 : }
4167 :
4168 : } else {
4169 313273 : zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
4170 : }
4171 313273 : if (opline->extended_value) {
4172 :
4173 : } else {
4174 :
4175 : }
4176 313273 : ZEND_VM_NEXT_OPCODE();
4177 : }
4178 :
4179 : static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4180 198660 : {
4181 198660 : zend_op *opline = EX(opline);
4182 :
4183 198660 : array_init(&EX_T(opline->result.u.var).tmp_var);
4184 : if (IS_CONST == IS_UNUSED) {
4185 : ZEND_VM_NEXT_OPCODE();
4186 : #if 0 || IS_CONST != IS_UNUSED
4187 : } else {
4188 198660 : return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4189 : #endif
4190 : }
4191 : }
4192 :
4193 : static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4194 52 : {
4195 52 : zend_op *opline = EX(opline);
4196 :
4197 :
4198 52 : add_function(&EX_T(opline->result.u.var).tmp_var,
4199 : &opline->op1.u.constant,
4200 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4201 :
4202 :
4203 52 : ZEND_VM_NEXT_OPCODE();
4204 : }
4205 :
4206 : static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4207 104 : {
4208 104 : zend_op *opline = EX(opline);
4209 :
4210 :
4211 104 : sub_function(&EX_T(opline->result.u.var).tmp_var,
4212 : &opline->op1.u.constant,
4213 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4214 :
4215 :
4216 104 : ZEND_VM_NEXT_OPCODE();
4217 : }
4218 :
4219 : static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4220 2111 : {
4221 2111 : zend_op *opline = EX(opline);
4222 :
4223 :
4224 2111 : mul_function(&EX_T(opline->result.u.var).tmp_var,
4225 : &opline->op1.u.constant,
4226 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4227 :
4228 :
4229 2111 : ZEND_VM_NEXT_OPCODE();
4230 : }
4231 :
4232 : static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4233 0 : {
4234 0 : zend_op *opline = EX(opline);
4235 :
4236 :
4237 0 : div_function(&EX_T(opline->result.u.var).tmp_var,
4238 : &opline->op1.u.constant,
4239 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4240 :
4241 :
4242 0 : ZEND_VM_NEXT_OPCODE();
4243 : }
4244 :
4245 : static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4246 0 : {
4247 0 : zend_op *opline = EX(opline);
4248 :
4249 :
4250 0 : mod_function(&EX_T(opline->result.u.var).tmp_var,
4251 : &opline->op1.u.constant,
4252 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4253 :
4254 :
4255 0 : ZEND_VM_NEXT_OPCODE();
4256 : }
4257 :
4258 : static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4259 0 : {
4260 0 : zend_op *opline = EX(opline);
4261 :
4262 :
4263 0 : shift_left_function(&EX_T(opline->result.u.var).tmp_var,
4264 : &opline->op1.u.constant,
4265 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4266 :
4267 :
4268 0 : ZEND_VM_NEXT_OPCODE();
4269 : }
4270 :
4271 : static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4272 0 : {
4273 0 : zend_op *opline = EX(opline);
4274 :
4275 :
4276 0 : shift_right_function(&EX_T(opline->result.u.var).tmp_var,
4277 : &opline->op1.u.constant,
4278 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4279 :
4280 :
4281 0 : ZEND_VM_NEXT_OPCODE();
4282 : }
4283 :
4284 : static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4285 15012 : {
4286 15012 : zend_op *opline = EX(opline);
4287 :
4288 :
4289 15012 : concat_function(&EX_T(opline->result.u.var).tmp_var,
4290 : &opline->op1.u.constant,
4291 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4292 :
4293 :
4294 15012 : ZEND_VM_NEXT_OPCODE();
4295 : }
4296 :
4297 : static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4298 49 : {
4299 49 : zend_op *opline = EX(opline);
4300 :
4301 :
4302 49 : is_identical_function(&EX_T(opline->result.u.var).tmp_var,
4303 : &opline->op1.u.constant,
4304 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4305 :
4306 :
4307 49 : ZEND_VM_NEXT_OPCODE();
4308 : }
4309 :
4310 : static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4311 651 : {
4312 651 : zend_op *opline = EX(opline);
4313 :
4314 651 : zval *result = &EX_T(opline->result.u.var).tmp_var;
4315 :
4316 651 : is_identical_function(result,
4317 : &opline->op1.u.constant,
4318 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4319 651 : Z_LVAL_P(result) = !Z_LVAL_P(result);
4320 :
4321 :
4322 651 : ZEND_VM_NEXT_OPCODE();
4323 : }
4324 :
4325 : static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4326 3110 : {
4327 3110 : zend_op *opline = EX(opline);
4328 :
4329 3110 : zval *result = &EX_T(opline->result.u.var).tmp_var;
4330 :
4331 3110 : compare_function(result,
4332 : &opline->op1.u.constant,
4333 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4334 3110 : ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
4335 :
4336 :
4337 3110 : ZEND_VM_NEXT_OPCODE();
4338 : }
4339 :
4340 : static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4341 110 : {
4342 110 : zend_op *opline = EX(opline);
4343 :
4344 110 : zval *result = &EX_T(opline->result.u.var).tmp_var;
4345 :
4346 110 : compare_function(result,
4347 : &opline->op1.u.constant,
4348 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4349 110 : ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
4350 :
4351 :
4352 110 : ZEND_VM_NEXT_OPCODE();
4353 : }
4354 :
4355 : static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4356 2274279 : {
4357 2274279 : zend_op *opline = EX(opline);
4358 :
4359 2274279 : zval *result = &EX_T(opline->result.u.var).tmp_var;
4360 :
4361 2274279 : compare_function(result,
4362 : &opline->op1.u.constant,
4363 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4364 2274279 : ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
4365 :
4366 :
4367 2274279 : ZEND_VM_NEXT_OPCODE();
4368 : }
4369 :
4370 : static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4371 35665 : {
4372 35665 : zend_op *opline = EX(opline);
4373 :
4374 35665 : zval *result = &EX_T(opline->result.u.var).tmp_var;
4375 :
4376 35665 : compare_function(result,
4377 : &opline->op1.u.constant,
4378 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4379 35665 : ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
4380 :
4381 :
4382 35665 : ZEND_VM_NEXT_OPCODE();
4383 : }
4384 :
4385 : static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4386 0 : {
4387 0 : zend_op *opline = EX(opline);
4388 :
4389 :
4390 0 : bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
4391 : &opline->op1.u.constant,
4392 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4393 :
4394 :
4395 0 : ZEND_VM_NEXT_OPCODE();
4396 : }
4397 :
4398 : static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4399 0 : {
4400 0 : zend_op *opline = EX(opline);
4401 :
4402 :
4403 0 : bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
4404 : &opline->op1.u.constant,
4405 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4406 :
4407 :
4408 0 : ZEND_VM_NEXT_OPCODE();
4409 : }
4410 :
4411 : static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4412 0 : {
4413 0 : zend_op *opline = EX(opline);
4414 :
4415 :
4416 0 : bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
4417 : &opline->op1.u.constant,
4418 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4419 :
4420 :
4421 0 : ZEND_VM_NEXT_OPCODE();
4422 : }
4423 :
4424 : static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4425 0 : {
4426 0 : zend_op *opline = EX(opline);
4427 :
4428 :
4429 0 : boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
4430 : &opline->op1.u.constant,
4431 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4432 :
4433 :
4434 0 : ZEND_VM_NEXT_OPCODE();
4435 : }
4436 :
4437 : static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4438 8 : {
4439 8 : zend_op *opline = EX(opline);
4440 : zval *function_name;
4441 : zend_class_entry *ce;
4442 :
4443 8 : zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
4444 :
4445 : if (IS_CONST == IS_CONST) {
4446 : /* no function found. try a static method in class */
4447 8 : ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
4448 8 : if (!ce) {
4449 0 : zend_error_noreturn(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
4450 : }
4451 8 : EX(called_scope) = ce;
4452 : } else {
4453 : ce = EX_T(opline->op1.u.var).class_entry;
4454 :
4455 : if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
4456 : EX(called_scope) = EG(called_scope);
4457 : } else {
4458 : EX(called_scope) = ce;
4459 : }
4460 : }
4461 : if(IS_CV != IS_UNUSED) {
4462 8 : zstr function_name_strval = NULL_ZSTR;
4463 8 : unsigned int function_name_strlen = 0;
4464 :
4465 : zend_uchar function_name_type;
4466 :
4467 : if (IS_CV == IS_CONST) {
4468 : function_name_strval = Z_UNIVAL(opline->op2.u.constant);
4469 : function_name_strlen = Z_UNILEN(opline->op2.u.constant);
4470 : function_name_type = Z_TYPE(opline->op2.u.constant);
4471 : } else {
4472 8 : function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
4473 :
4474 8 : if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
4475 1 : zend_error_noreturn(E_ERROR, "Function name must be a string");
4476 : } else {
4477 7 : function_name_strval = Z_UNIVAL_P(function_name);
4478 7 : function_name_strlen = Z_UNILEN_P(function_name);
4479 7 : function_name_type = Z_TYPE_P(function_name);
4480 : }
4481 : }
4482 :
4483 7 : if (function_name_strval.v) {
4484 7 : if (ce->get_static_method) {
4485 0 : EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
4486 : } else {
4487 7 : EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
4488 : }
4489 7 : if (!EX(fbc)) {
4490 0 : zend_error_noreturn(E_ERROR, "Call to undefined method %v::%R()", ce->name, function_name_type, function_name_strval);
4491 : }
4492 : }
4493 :
4494 : if (IS_CV != IS_CONST) {
4495 :
4496 : }
4497 : } else {
4498 : if(!ce->constructor) {
4499 : zend_error_noreturn(E_ERROR, "Cannot call constructor");
4500 : }
4501 : if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
4502 : zend_error(E_COMPILE_ERROR, "Cannot call private %v::__construct()", ce->name);
4503 : }
4504 : EX(fbc) = ce->constructor;
4505 : }
4506 :
4507 7 : if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
4508 6 : EX(object) = NULL;
4509 : } else {
4510 1 : if (EG(This) &&
4511 : Z_OBJ_HT_P(EG(This))->get_class_entry &&
4512 : !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
4513 : /* We are calling method of the other (incompatible) class,
4514 : but passing $this. This is done for compatibility with php-4. */
4515 : int severity;
4516 : char *verb;
4517 0 : if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
4518 0 : severity = E_STRICT;
4519 0 : verb = "should not";
4520 : } else {
4521 : /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
4522 0 : severity = E_ERROR;
4523 0 : verb = "cannot";
4524 : }
4525 0 : zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
4526 :
4527 : }
4528 1 : if ((EX(object) = EG(This))) {
4529 0 : Z_ADDREF_P(EX(object));
4530 0 : EX(called_scope) = Z_OBJCE_P(EX(object));
4531 : }
4532 : }
4533 :
4534 7 : ZEND_VM_NEXT_OPCODE();
4535 : }
4536 :
4537 : static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4538 0 : {
4539 0 : zend_op *opline = EX(opline);
4540 0 : int switch_expr_is_overloaded=0;
4541 :
4542 :
4543 : if (IS_CONST==IS_VAR) {
4544 : if (EX_T(opline->op1.u.var).var.ptr_ptr) {
4545 : PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
4546 : } else {
4547 : switch_expr_is_overloaded = 1;
4548 : Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
4549 : }
4550 : }
4551 0 : is_equal_function(&EX_T(opline->result.u.var).tmp_var,
4552 : &opline->op1.u.constant,
4553 : _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
4554 :
4555 0 : if (switch_expr_is_overloaded) {
4556 : /* We only free op1 if this is a string offset,
4557 : * Since if it is a TMP_VAR, it'll be reused by
4558 : * other CASE opcodes (whereas string offsets
4559 : * are allocated at each get_zval_ptr())
4560 : */
4561 :
4562 0 : EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
4563 0 : EX_T(opline->op1.u.var).var.ptr = NULL;
4564 : }
4565 0 : ZEND_VM_NEXT_OPCODE();
4566 : }
4567 :
4568 : static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4569 66 : {
4570 66 : zend_op *opline = EX(opline);
4571 :
4572 66 : zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
4573 : zval *expr_ptr;
4574 66 : zval *offset=_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
4575 :
4576 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
4577 : zval **expr_ptr_ptr = NULL;
4578 :
4579 : if (opline->extended_value) {
4580 : expr_ptr_ptr=NULL;
4581 : expr_ptr = *expr_ptr_ptr;
4582 : } else {
4583 : expr_ptr=&opline->op1.u.constant;
4584 : }
4585 : #else
4586 66 : expr_ptr=&opline->op1.u.constant;
4587 : #endif
4588 :
4589 : if (0) { /* temporary variable */
4590 : zval *new_expr;
4591 :
4592 : ALLOC_ZVAL(new_expr);
4593 : INIT_PZVAL_COPY(new_expr, expr_ptr);
4594 : expr_ptr = new_expr;
4595 : } else {
4596 : #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
4597 : if (opline->extended_value) {
4598 : SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
4599 : expr_ptr = *expr_ptr_ptr;
4600 : Z_ADDREF_P(expr_ptr);
4601 : } else
4602 : #endif
4603 : if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
4604 : zval *new_expr;
4605 :
4606 66 : ALLOC_ZVAL(new_expr);
4607 66 : |