php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
zend_vm_def.h
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 2.00 of the Zend license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.zend.com/license/2_00.txt. |
11 | If you did not receive a copy of the Zend license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@zend.com so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Andi Gutmans <andi@php.net> |
16 | Zeev Suraski <zeev@php.net> |
17 | Dmitry Stogov <dmitry@php.net> |
18 +----------------------------------------------------------------------+
19*/
20
21/* If you change this file, please regenerate the zend_vm_execute.h and
22 * zend_vm_opcodes.h files by running:
23 * php zend_vm_gen.php
24 */
25
26ZEND_VM_HELPER(zend_add_helper, ANY, ANY, zval *op_1, zval *op_2)
27{
29
31 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
32 op_1 = ZVAL_UNDEFINED_OP1();
33 }
34 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
35 op_2 = ZVAL_UNDEFINED_OP2();
36 }
37 add_function(EX_VAR(opline->result.var), op_1, op_2);
38 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
39 zval_ptr_dtor_nogc(op_1);
40 }
41 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
42 zval_ptr_dtor_nogc(op_2);
43 }
45}
46
48{
50 zval *op1, *op2, *result;
51 double d1, d2;
52
53 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
54 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
55 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
56 /* pass */
57 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
59 result = EX_VAR(opline->result.var);
60 fast_long_add_function(result, op1, op2);
62 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
63 d1 = (double)Z_LVAL_P(op1);
64 d2 = Z_DVAL_P(op2);
65 ZEND_VM_C_GOTO(add_double);
66 }
67 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
69 d1 = Z_DVAL_P(op1);
70 d2 = Z_DVAL_P(op2);
71ZEND_VM_C_LABEL(add_double):
72 result = EX_VAR(opline->result.var);
75 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
76 d1 = Z_DVAL_P(op1);
77 d2 = (double)Z_LVAL_P(op2);
78 ZEND_VM_C_GOTO(add_double);
79 }
80 }
81
82 ZEND_VM_DISPATCH_TO_HELPER(zend_add_helper, op_1, op1, op_2, op2);
83}
84
85ZEND_VM_HELPER(zend_sub_helper, ANY, ANY, zval *op_1, zval *op_2)
86{
88
90 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
91 op_1 = ZVAL_UNDEFINED_OP1();
92 }
93 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
94 op_2 = ZVAL_UNDEFINED_OP2();
95 }
96 sub_function(EX_VAR(opline->result.var), op_1, op_2);
97 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
98 zval_ptr_dtor_nogc(op_1);
99 }
100 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
101 zval_ptr_dtor_nogc(op_2);
102 }
104}
105
107{
109 zval *op1, *op2, *result;
110 double d1, d2;
111
112 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
113 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
114 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
115 /* pass */
116 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
118 result = EX_VAR(opline->result.var);
119 fast_long_sub_function(result, op1, op2);
121 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
122 d1 = (double)Z_LVAL_P(op1);
123 d2 = Z_DVAL_P(op2);
124 ZEND_VM_C_GOTO(sub_double);
125 }
126 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
128 d1 = Z_DVAL_P(op1);
129 d2 = Z_DVAL_P(op2);
130ZEND_VM_C_LABEL(sub_double):
131 result = EX_VAR(opline->result.var);
134 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
135 d1 = Z_DVAL_P(op1);
136 d2 = (double)Z_LVAL_P(op2);
137 ZEND_VM_C_GOTO(sub_double);
138 }
139 }
140
141 ZEND_VM_DISPATCH_TO_HELPER(zend_sub_helper, op_1, op1, op_2, op2);
142}
143
144ZEND_VM_HELPER(zend_mul_helper, ANY, ANY, zval *op_1, zval *op_2)
145{
147
148 SAVE_OPLINE();
149 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
150 op_1 = ZVAL_UNDEFINED_OP1();
151 }
152 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
153 op_2 = ZVAL_UNDEFINED_OP2();
154 }
155 mul_function(EX_VAR(opline->result.var), op_1, op_2);
156 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
157 zval_ptr_dtor_nogc(op_1);
158 }
159 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
160 zval_ptr_dtor_nogc(op_2);
161 }
163}
164
165ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
166{
168 zval *op1, *op2, *result;
169 double d1, d2;
170
171 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
172 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
173 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
174 /* pass */
177 zend_long overflow;
178
179 result = EX_VAR(opline->result.var);
181 Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
183 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
184 d1 = (double)Z_LVAL_P(op1);
185 d2 = Z_DVAL_P(op2);
186 ZEND_VM_C_GOTO(mul_double);
187 }
190 d1 = Z_DVAL_P(op1);
191 d2 = Z_DVAL_P(op2);
192ZEND_VM_C_LABEL(mul_double):
193 result = EX_VAR(opline->result.var);
196 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
197 d1 = Z_DVAL_P(op1);
198 d2 = (double)Z_LVAL_P(op2);
199 ZEND_VM_C_GOTO(mul_double);
200 }
201 }
202
203 ZEND_VM_DISPATCH_TO_HELPER(zend_mul_helper, op_1, op1, op_2, op2);
204}
205
207{
209 zval *op1, *op2;
210
211 SAVE_OPLINE();
212 op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
213 op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
214 div_function(EX_VAR(opline->result.var), op1, op2);
215 FREE_OP1();
216 FREE_OP2();
218}
219
220ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
221{
223
224 SAVE_OPLINE();
226 ZVAL_UNDEF(EX_VAR(opline->result.var));
228}
229
230ZEND_VM_HELPER(zend_mod_helper, ANY, ANY, zval *op_1, zval *op_2)
231{
233
234 SAVE_OPLINE();
235 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
236 op_1 = ZVAL_UNDEFINED_OP1();
237 }
238 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
239 op_2 = ZVAL_UNDEFINED_OP2();
240 }
241 mod_function(EX_VAR(opline->result.var), op_1, op_2);
242 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
243 zval_ptr_dtor_nogc(op_1);
244 }
245 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
246 zval_ptr_dtor_nogc(op_2);
247 }
249}
250
252{
254 zval *op1, *op2, *result;
255
256 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
257 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
258 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
259 /* pass */
260 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
262 result = EX_VAR(opline->result.var);
263 if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
264 ZEND_VM_DISPATCH_TO_HELPER(zend_mod_by_zero_helper);
265 } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
266 /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
267 ZVAL_LONG(result, 0);
268 } else {
270 }
272 }
273 }
274
275 ZEND_VM_DISPATCH_TO_HELPER(zend_mod_helper, op_1, op1, op_2, op2);
276}
277
278ZEND_VM_HELPER(zend_shift_left_helper, ANY, ANY, zval *op_1, zval *op_2)
279{
281
282 SAVE_OPLINE();
283 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
284 op_1 = ZVAL_UNDEFINED_OP1();
285 }
286 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
287 op_2 = ZVAL_UNDEFINED_OP2();
288 }
289 shift_left_function(EX_VAR(opline->result.var), op_1, op_2);
290 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
291 zval_ptr_dtor_nogc(op_1);
292 }
293 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
294 zval_ptr_dtor_nogc(op_2);
295 }
297}
298
300{
302 zval *op1, *op2;
303
304 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
305 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
306 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
307 /* pass */
308 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
311 /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
312 ZVAL_LONG(EX_VAR(opline->result.var),
315 }
316
317 ZEND_VM_DISPATCH_TO_HELPER(zend_shift_left_helper, op_1, op1, op_2, op2);
318}
319
320ZEND_VM_HELPER(zend_shift_right_helper, ANY, ANY, zval *op_1, zval *op_2)
321{
323
324 SAVE_OPLINE();
325 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
326 op_1 = ZVAL_UNDEFINED_OP1();
327 }
328 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
329 op_2 = ZVAL_UNDEFINED_OP2();
330 }
331 shift_right_function(EX_VAR(opline->result.var), op_1, op_2);
332 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
333 zval_ptr_dtor_nogc(op_1);
334 }
335 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
336 zval_ptr_dtor_nogc(op_2);
337 }
339}
340
342{
344 zval *op1, *op2;
345
346 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
347 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
348 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
349 /* pass */
350 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
353 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
355 }
356
357 ZEND_VM_DISPATCH_TO_HELPER(zend_shift_right_helper, op_1, op1, op_2, op2);
358}
359
361{
363 zval *op1, *op2;
364
365 SAVE_OPLINE();
366 op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
367 op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
368 pow_function(EX_VAR(opline->result.var), op1, op2);
369 FREE_OP1();
370 FREE_OP2();
372}
373
374ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_CONST))
375{
377 zval *op1, *op2;
378
379 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
380 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
381
382 if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
383 (OP2_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
384 zend_string *op1_str = Z_STR_P(op1);
385 zend_string *op2_str = Z_STR_P(op2);
386 zend_string *str;
387 uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
388
389 if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
390 if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
391 ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
392 } else {
393 ZVAL_STR(EX_VAR(opline->result.var), op2_str);
394 }
395 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
396 zend_string_release_ex(op1_str, 0);
397 }
398 } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
399 if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
400 ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
401 } else {
402 ZVAL_STR(EX_VAR(opline->result.var), op1_str);
403 }
404 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
405 zend_string_release_ex(op2_str, 0);
406 }
407 } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
408 !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
409 size_t len = ZSTR_LEN(op1_str);
410
411 if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
412 zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
413 }
414 str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
415 memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
416 GC_ADD_FLAGS(str, flags);
417 ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
418 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
419 zend_string_release_ex(op2_str, 0);
420 }
421 } else {
422 str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
423 memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
424 memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
425 GC_ADD_FLAGS(str, flags);
426 ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
427 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
428 zend_string_release_ex(op1_str, 0);
429 }
430 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
431 zend_string_release_ex(op2_str, 0);
432 }
433 }
435 } else {
436 SAVE_OPLINE();
437
438 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
440 }
441 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
443 }
444 concat_function(EX_VAR(opline->result.var), op1, op2);
448 }
449}
450
451ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
452{
454 zval *op1, *op2;
455 bool result;
456
458 op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
459 op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
460 result = fast_is_identical_function(op1, op2);
461 FREE_OP1();
462 FREE_OP2();
464}
465
467{
469 zval *op1, *op2;
470 bool result;
471
472 SAVE_OPLINE();
473 op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
474 op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
475 result = fast_is_identical_function(op1, op2);
476 FREE_OP2();
478}
479
480ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
481{
483 zval *op1, *op2;
484 bool result;
485
486 SAVE_OPLINE();
487 op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
488 op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
489 result = fast_is_not_identical_function(op1, op2);
490 FREE_OP1();
491 FREE_OP2();
493}
494
495ZEND_VM_HELPER(zend_is_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
496{
497 int ret;
499
500 SAVE_OPLINE();
501 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
502 op_1 = ZVAL_UNDEFINED_OP1();
503 }
504 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
505 op_2 = ZVAL_UNDEFINED_OP2();
506 }
507 ret = zend_compare(op_1, op_2);
508 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
509 zval_ptr_dtor_nogc(op_1);
510 }
511 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
512 zval_ptr_dtor_nogc(op_2);
513 }
514 ZEND_VM_SMART_BRANCH(ret == 0, 1);
515}
516
517ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
518{
520 zval *op1, *op2;
521 double d1, d2;
522
523 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
524 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
525 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
526 /* pass */
527 } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
528 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
529 if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
530ZEND_VM_C_LABEL(is_equal_true):
532 } else {
533ZEND_VM_C_LABEL(is_equal_false):
535 }
536 } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
537 d1 = (double)Z_LVAL_P(op1);
538 d2 = Z_DVAL_P(op2);
539 ZEND_VM_C_GOTO(is_equal_double);
540 }
541 } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
542 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
543 d1 = Z_DVAL_P(op1);
544 d2 = Z_DVAL_P(op2);
545ZEND_VM_C_LABEL(is_equal_double):
546 if (d1 == d2) {
547 ZEND_VM_C_GOTO(is_equal_true);
548 } else {
549 ZEND_VM_C_GOTO(is_equal_false);
550 }
551 } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
552 d1 = Z_DVAL_P(op1);
553 d2 = (double)Z_LVAL_P(op2);
554 ZEND_VM_C_GOTO(is_equal_double);
555 }
556 } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
557 if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
558 bool result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
559 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
560 zval_ptr_dtor_str(op1);
561 }
562 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
563 zval_ptr_dtor_str(op2);
564 }
565 if (result) {
566 ZEND_VM_C_GOTO(is_equal_true);
567 } else {
568 ZEND_VM_C_GOTO(is_equal_false);
569 }
570 }
571 }
572 ZEND_VM_DISPATCH_TO_HELPER(zend_is_equal_helper, op_1, op1, op_2, op2);
573}
574
575ZEND_VM_HELPER(zend_is_not_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
576{
577 int ret;
579
580 SAVE_OPLINE();
581 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
582 op_1 = ZVAL_UNDEFINED_OP1();
583 }
584 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
585 op_2 = ZVAL_UNDEFINED_OP2();
586 }
587 ret = zend_compare(op_1, op_2);
588 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
589 zval_ptr_dtor_nogc(op_1);
590 }
591 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
592 zval_ptr_dtor_nogc(op_2);
593 }
594 ZEND_VM_SMART_BRANCH(ret != 0, 1);
595}
596
597ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
598{
600 zval *op1, *op2;
601 double d1, d2;
602
603 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
604 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
605 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
606 /* pass */
607 } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
608 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
609 if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
610ZEND_VM_C_LABEL(is_not_equal_true):
612 } else {
613ZEND_VM_C_LABEL(is_not_equal_false):
615 }
616 } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
617 d1 = (double)Z_LVAL_P(op1);
618 d2 = Z_DVAL_P(op2);
619 ZEND_VM_C_GOTO(is_not_equal_double);
620 }
621 } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
622 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
623 d1 = Z_DVAL_P(op1);
624 d2 = Z_DVAL_P(op2);
625ZEND_VM_C_LABEL(is_not_equal_double):
626 if (d1 != d2) {
627 ZEND_VM_C_GOTO(is_not_equal_true);
628 } else {
629 ZEND_VM_C_GOTO(is_not_equal_false);
630 }
631 } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
632 d1 = Z_DVAL_P(op1);
633 d2 = (double)Z_LVAL_P(op2);
634 ZEND_VM_C_GOTO(is_not_equal_double);
635 }
636 } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
637 if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
638 bool result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
639 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
640 zval_ptr_dtor_str(op1);
641 }
642 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
643 zval_ptr_dtor_str(op2);
644 }
645 if (!result) {
646 ZEND_VM_C_GOTO(is_not_equal_true);
647 } else {
648 ZEND_VM_C_GOTO(is_not_equal_false);
649 }
650 }
651 }
652 ZEND_VM_DISPATCH_TO_HELPER(zend_is_not_equal_helper, op_1, op1, op_2, op2);
653}
654
655ZEND_VM_HELPER(zend_is_smaller_helper, ANY, ANY, zval *op_1, zval *op_2)
656{
657 int ret;
659
660 SAVE_OPLINE();
661 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
662 op_1 = ZVAL_UNDEFINED_OP1();
663 }
664 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
665 op_2 = ZVAL_UNDEFINED_OP2();
666 }
667 ret = zend_compare(op_1, op_2);
668 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
669 zval_ptr_dtor_nogc(op_1);
670 }
671 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
672 zval_ptr_dtor_nogc(op_2);
673 }
675}
676
677ZEND_VM_HOT_NOCONSTCONST_HANDLER(20, ZEND_IS_SMALLER, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
678{
680 zval *op1, *op2;
681 double d1, d2;
682
683 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
684 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
685 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
686 /* pass */
687 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
689 if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
690ZEND_VM_C_LABEL(is_smaller_true):
692 } else {
693ZEND_VM_C_LABEL(is_smaller_false):
695 }
696 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
697 d1 = (double)Z_LVAL_P(op1);
698 d2 = Z_DVAL_P(op2);
699 ZEND_VM_C_GOTO(is_smaller_double);
700 }
701 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
703 d1 = Z_DVAL_P(op1);
704 d2 = Z_DVAL_P(op2);
705ZEND_VM_C_LABEL(is_smaller_double):
706 if (d1 < d2) {
707 ZEND_VM_C_GOTO(is_smaller_true);
708 } else {
709 ZEND_VM_C_GOTO(is_smaller_false);
710 }
711 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
712 d1 = Z_DVAL_P(op1);
713 d2 = (double)Z_LVAL_P(op2);
714 ZEND_VM_C_GOTO(is_smaller_double);
715 }
716 }
717 ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_helper, op_1, op1, op_2, op2);
718}
719
720ZEND_VM_HELPER(zend_is_smaller_or_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
721{
722 int ret;
724
725 SAVE_OPLINE();
726 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
727 op_1 = ZVAL_UNDEFINED_OP1();
728 }
729 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
730 op_2 = ZVAL_UNDEFINED_OP2();
731 }
732 ret = zend_compare(op_1, op_2);
733 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
734 zval_ptr_dtor_nogc(op_1);
735 }
736 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
737 zval_ptr_dtor_nogc(op_2);
738 }
739 ZEND_VM_SMART_BRANCH(ret <= 0, 1);
740}
741
742ZEND_VM_HOT_NOCONSTCONST_HANDLER(21, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
743{
745 zval *op1, *op2;
746 double d1, d2;
747
748 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
749 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
750 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
751 /* pass */
752 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
754 if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
755ZEND_VM_C_LABEL(is_smaller_or_equal_true):
757 ZVAL_TRUE(EX_VAR(opline->result.var));
759 } else {
760ZEND_VM_C_LABEL(is_smaller_or_equal_false):
762 ZVAL_FALSE(EX_VAR(opline->result.var));
764 }
765 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
766 d1 = (double)Z_LVAL_P(op1);
767 d2 = Z_DVAL_P(op2);
768 ZEND_VM_C_GOTO(is_smaller_or_equal_double);
769 }
770 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
772 d1 = Z_DVAL_P(op1);
773 d2 = Z_DVAL_P(op2);
774ZEND_VM_C_LABEL(is_smaller_or_equal_double):
775 if (d1 <= d2) {
776 ZEND_VM_C_GOTO(is_smaller_or_equal_true);
777 } else {
778 ZEND_VM_C_GOTO(is_smaller_or_equal_false);
779 }
780 } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
781 d1 = Z_DVAL_P(op1);
782 d2 = (double)Z_LVAL_P(op2);
783 ZEND_VM_C_GOTO(is_smaller_or_equal_double);
784 }
785 }
786 ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_or_equal_helper, op_1, op1, op_2, op2);
787}
788
790{
792 zval *op1, *op2;
793
794 SAVE_OPLINE();
795 op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
796 op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
797 compare_function(EX_VAR(opline->result.var), op1, op2);
798 FREE_OP1();
799 FREE_OP2();
801}
802
803ZEND_VM_HELPER(zend_bw_or_helper, ANY, ANY, zval *op_1, zval *op_2)
804{
806
807 SAVE_OPLINE();
808 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
809 op_1 = ZVAL_UNDEFINED_OP1();
810 }
811 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
812 op_2 = ZVAL_UNDEFINED_OP2();
813 }
814 bitwise_or_function(EX_VAR(opline->result.var), op_1, op_2);
815 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
816 zval_ptr_dtor_nogc(op_1);
817 }
818 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
819 zval_ptr_dtor_nogc(op_2);
820 }
822}
823
824ZEND_VM_HOT_NOCONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
825{
827 zval *op1, *op2;
828
829 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
830 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
831 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
832 /* pass */
835 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
837 }
838
839 ZEND_VM_DISPATCH_TO_HELPER(zend_bw_or_helper, op_1, op1, op_2, op2);
840}
841
842ZEND_VM_HELPER(zend_bw_and_helper, ANY, ANY, zval *op_1, zval *op_2)
843{
845
846 SAVE_OPLINE();
847 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
848 op_1 = ZVAL_UNDEFINED_OP1();
849 }
850 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
851 op_2 = ZVAL_UNDEFINED_OP2();
852 }
853 bitwise_and_function(EX_VAR(opline->result.var), op_1, op_2);
854 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
855 zval_ptr_dtor_nogc(op_1);
856 }
857 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
858 zval_ptr_dtor_nogc(op_2);
859 }
861}
862
863ZEND_VM_HOT_NOCONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
864{
866 zval *op1, *op2;
867
868 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
869 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
870 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
871 /* pass */
872 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
874 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
876 }
877
878 ZEND_VM_DISPATCH_TO_HELPER(zend_bw_and_helper, op_1, op1, op_2, op2);
879}
880
881ZEND_VM_HELPER(zend_bw_xor_helper, ANY, ANY, zval *op_1, zval *op_2)
882{
884
885 SAVE_OPLINE();
886 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
887 op_1 = ZVAL_UNDEFINED_OP1();
888 }
889 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
890 op_2 = ZVAL_UNDEFINED_OP2();
891 }
892 bitwise_xor_function(EX_VAR(opline->result.var), op_1, op_2);
893 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
894 zval_ptr_dtor_nogc(op_1);
895 }
896 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
897 zval_ptr_dtor_nogc(op_2);
898 }
900}
901
902ZEND_VM_HOT_NOCONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
903{
905 zval *op1, *op2;
906
907 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
908 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
909 if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
910 /* pass */
911 } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
913 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
915 }
916
917 ZEND_VM_DISPATCH_TO_HELPER(zend_bw_xor_helper, op_1, op1, op_2, op2);
918}
919
920ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
921{
923 zval *op1, *op2;
924
925 SAVE_OPLINE();
926 op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
927 op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
928 boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
929 FREE_OP1();
930 FREE_OP2();
932}
933
934ZEND_VM_HELPER(zend_bw_not_helper, ANY, ANY, zval *op_1)
935{
937
938 SAVE_OPLINE();
939 if (UNEXPECTED(Z_TYPE_P(op_1) == IS_UNDEF)) {
940 op_1 = ZVAL_UNDEFINED_OP1();
941 }
942 bitwise_not_function(EX_VAR(opline->result.var), op_1);
943 FREE_OP1();
945}
946
948{
950 zval *op1;
951
952 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
954 ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
956 }
957
958 ZEND_VM_DISPATCH_TO_HELPER(zend_bw_not_helper, op_1, op1);
959}
960
962{
964 zval *val;
965
966 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
967 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
968 ZVAL_FALSE(EX_VAR(opline->result.var));
969 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
970 /* The result and op1 can be the same cv zval */
971 const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
972 ZVAL_TRUE(EX_VAR(opline->result.var));
973 if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
974 SAVE_OPLINE();
977 }
978 } else {
979 SAVE_OPLINE();
980 ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val));
981 FREE_OP1();
983 }
985}
986
987ZEND_VM_COLD_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
988{
990
991 SAVE_OPLINE();
992 zend_throw_error(NULL, "Using $this when not in object context");
993 UNDEF_RESULT();
995}
996
997ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
998{
1000 zval *function_name;
1001
1002 SAVE_OPLINE();
1003 function_name = RT_CONSTANT(opline, opline->op2);
1004 zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
1006}
1007
1009{
1011 zval *object;
1012 zval *property;
1013 zval *value;
1014 zval *zptr;
1015 void *_cache_slot[3] = {0};
1016 void **cache_slot;
1020
1021 SAVE_OPLINE();
1022 object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1023 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
1024
1025 do {
1026 value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
1027
1028 if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1029 if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
1030 object = Z_REFVAL_P(object);
1031 ZEND_VM_C_GOTO(assign_op_object);
1032 }
1033 if (OP1_TYPE == IS_CV
1034 && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1036 }
1037 zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
1038 break;
1039 }
1040
1041ZEND_VM_C_LABEL(assign_op_object):
1042 /* here we are sure we are dealing with an object */
1043 zobj = Z_OBJ_P(object);
1044 if (OP2_TYPE == IS_CONST) {
1046 } else {
1047 name = zval_try_get_tmp_string(property, &tmp_name);
1048 if (UNEXPECTED(!name)) {
1049 UNDEF_RESULT();
1050 break;
1051 }
1052 }
1053 cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
1054 if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
1055 if (UNEXPECTED(Z_ISERROR_P(zptr))) {
1056 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1057 ZVAL_NULL(EX_VAR(opline->result.var));
1058 }
1059 } else {
1060 zend_reference *ref;
1061
1062 do {
1063 if (UNEXPECTED(Z_ISREF_P(zptr))) {
1064 ref = Z_REF_P(zptr);
1065 zptr = Z_REFVAL_P(zptr);
1067 zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
1068 break;
1069 }
1070 }
1071
1072 prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
1073 if (prop_info) {
1074 /* special case for typed properties */
1075 zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
1076 } else {
1077 zend_binary_op(zptr, zptr, value OPLINE_CC);
1078 }
1079 } while (0);
1080
1081 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1082 ZVAL_COPY(EX_VAR(opline->result.var), zptr);
1083 }
1084 }
1085 } else {
1086 zend_assign_op_overloaded_property(zobj, name, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
1087 }
1088 if (OP2_TYPE != IS_CONST) {
1089 zend_tmp_string_release(tmp_name);
1090 }
1091 } while (0);
1092
1093 FREE_OP_DATA();
1094 FREE_OP2();
1095 FREE_OP1();
1096 /* assign_obj has two opcodes! */
1098}
1099
1100/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
1102{
1103 /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */
1104
1106 zval *prop, *value;
1108 zend_reference *ref;
1109
1110 SAVE_OPLINE();
1111
1112 if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
1113 UNDEF_RESULT();
1114 FREE_OP_DATA();
1116 }
1117
1118 value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
1119
1120 do {
1121 if (UNEXPECTED(Z_ISREF_P(prop))) {
1122 ref = Z_REF_P(prop);
1123 prop = Z_REFVAL_P(prop);
1125 zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
1126 break;
1127 }
1128 }
1129
1130 if (ZEND_TYPE_IS_SET(prop_info->type)) {
1131 /* special case for typed properties */
1132 zend_binary_assign_op_typed_prop(prop_info, prop, value OPLINE_CC EXECUTE_DATA_CC);
1133 } else {
1134 zend_binary_op(prop, prop, value OPLINE_CC);
1135 }
1136 } while (0);
1137
1138 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1139 ZVAL_COPY(EX_VAR(opline->result.var), prop);
1140 }
1141
1142 FREE_OP_DATA();
1143 /* assign_static_prop has two opcodes! */
1145}
1146
1148{
1150 zval *var_ptr;
1151 zval *value, *container, *dim;
1152 HashTable *ht;
1153
1154 SAVE_OPLINE();
1155 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1156
1158ZEND_VM_C_LABEL(assign_dim_op_array):
1161ZEND_VM_C_LABEL(assign_dim_op_new_array):
1162 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1163 if (OP2_TYPE == IS_UNUSED) {
1164 var_ptr = zend_hash_next_index_insert(ht, &EG(uninitialized_zval));
1165 if (UNEXPECTED(!var_ptr)) {
1167 ZEND_VM_C_GOTO(assign_dim_op_ret_null);
1168 }
1169 } else {
1170 if (OP2_TYPE == IS_CONST) {
1171 var_ptr = zend_fetch_dimension_address_inner_RW_CONST(ht, dim EXECUTE_DATA_CC);
1172 } else {
1173 var_ptr = zend_fetch_dimension_address_inner_RW(ht, dim EXECUTE_DATA_CC);
1174 }
1175 if (UNEXPECTED(!var_ptr)) {
1176 ZEND_VM_C_GOTO(assign_dim_op_ret_null);
1177 }
1178 }
1179
1180 value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1);
1181
1182 do {
1183 if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
1187 zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
1188 break;
1189 }
1190 }
1191 zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
1192 } while (0);
1193
1194 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1195 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1196 }
1197 FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
1198 } else {
1202 ZEND_VM_C_GOTO(assign_dim_op_array);
1203 }
1204 }
1205
1208
1209 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1210 if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
1211 dim++;
1212 }
1213 zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
1214 } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
1215 uint8_t old_type;
1216
1217 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
1219 }
1220 ht = zend_new_array(8);
1223 if (UNEXPECTED(old_type == IS_FALSE)) {
1224 GC_ADDREF(ht);
1226 if (UNEXPECTED(GC_DELREF(ht) == 0)) {
1228 ZEND_VM_C_GOTO(assign_dim_op_ret_null);
1229 }
1230 }
1231 ZEND_VM_C_GOTO(assign_dim_op_new_array);
1232 } else {
1233 dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
1234 zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
1235ZEND_VM_C_LABEL(assign_dim_op_ret_null):
1236 FREE_OP_DATA();
1237 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1238 ZVAL_NULL(EX_VAR(opline->result.var));
1239 }
1240 }
1241 }
1242
1243 FREE_OP2();
1244 FREE_OP1();
1246}
1247
1249{
1251 zval *var_ptr;
1252 zval *value;
1253
1254 SAVE_OPLINE();
1255 value = GET_OP2_ZVAL_PTR(BP_VAR_R);
1256 var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
1257
1258 do {
1263 zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
1264 break;
1265 }
1266 }
1267 zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
1268 } while (0);
1269
1270 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1271 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1272 }
1273
1274 FREE_OP2();
1275 FREE_OP1();
1277}
1278
1279ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
1280{
1282 zval *object;
1283 zval *property;
1284 zval *zptr;
1285 void *_cache_slot[3] = {0};
1286 void **cache_slot;
1290
1291 SAVE_OPLINE();
1292 object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1293 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
1294
1295 do {
1296 if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1297 if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
1298 object = Z_REFVAL_P(object);
1299 ZEND_VM_C_GOTO(pre_incdec_object);
1300 }
1301 if (OP1_TYPE == IS_CV
1302 && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1304 }
1305 zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
1306 break;
1307 }
1308
1309ZEND_VM_C_LABEL(pre_incdec_object):
1310 /* here we are sure we are dealing with an object */
1311 zobj = Z_OBJ_P(object);
1312 if (OP2_TYPE == IS_CONST) {
1314 } else {
1315 name = zval_try_get_tmp_string(property, &tmp_name);
1316 if (UNEXPECTED(!name)) {
1317 UNDEF_RESULT();
1318 break;
1319 }
1320 }
1321 cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
1322 if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
1323 if (UNEXPECTED(Z_ISERROR_P(zptr))) {
1324 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1325 ZVAL_NULL(EX_VAR(opline->result.var));
1326 }
1327 } else {
1328 prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
1329 zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1330 }
1331 } else {
1332 zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
1333 }
1334 if (OP2_TYPE != IS_CONST) {
1335 zend_tmp_string_release(tmp_name);
1336 }
1337 } while (0);
1338
1339 FREE_OP2();
1340 FREE_OP1();
1342}
1343
1344ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
1345{
1346 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_OBJ);
1347}
1348
1349ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
1350{
1352 zval *object;
1353 zval *property;
1354 zval *zptr;
1355 void *_cache_slot[3] = {0};
1356 void **cache_slot;
1360
1361 SAVE_OPLINE();
1362 object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1363 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
1364
1365 do {
1366 if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1367 if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
1368 object = Z_REFVAL_P(object);
1369 ZEND_VM_C_GOTO(post_incdec_object);
1370 }
1371 if (OP1_TYPE == IS_CV
1372 && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1374 }
1375 zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
1376 break;
1377 }
1378
1379ZEND_VM_C_LABEL(post_incdec_object):
1380 /* here we are sure we are dealing with an object */
1381 zobj = Z_OBJ_P(object);
1382 if (OP2_TYPE == IS_CONST) {
1384 } else {
1385 name = zval_try_get_tmp_string(property, &tmp_name);
1386 if (UNEXPECTED(!name)) {
1387 ZVAL_UNDEF(EX_VAR(opline->result.var));
1388 break;
1389 }
1390 }
1391 cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
1392 if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
1393 if (UNEXPECTED(Z_ISERROR_P(zptr))) {
1394 ZVAL_NULL(EX_VAR(opline->result.var));
1395 } else {
1396 prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
1397 zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1398 }
1399 } else {
1400 zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
1401 }
1402 if (OP2_TYPE != IS_CONST) {
1403 zend_tmp_string_release(tmp_name);
1404 }
1405 } while (0);
1406
1407 FREE_OP2();
1408 FREE_OP1();
1410}
1411
1412ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
1413{
1414 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_OBJ);
1415}
1416
1417/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
1419{
1421 zval *prop;
1423
1424 SAVE_OPLINE();
1425
1426 if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
1427 UNDEF_RESULT();
1429 }
1430
1431 zend_pre_incdec_property_zval(prop,
1433
1435}
1436
1437/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
1439{
1440 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_STATIC_PROP);
1441}
1442
1443/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
1445{
1447 zval *prop;
1449
1450 SAVE_OPLINE();
1451
1452 if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
1453 UNDEF_RESULT();
1455 }
1456
1457 zend_post_incdec_property_zval(prop,
1459
1461}
1462
1463/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
1465{
1466 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_STATIC_PROP);
1467}
1468
1469ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
1470{
1472 zval *var_ptr;
1473
1474 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1475
1476 SAVE_OPLINE();
1477 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1480 }
1481
1482 do {
1487 zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
1488 break;
1489 }
1490 }
1492 } while (0);
1493
1494 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1495 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1496 }
1497
1498 FREE_OP1();
1500}
1501
1502ZEND_VM_HOT_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
1503{
1505 zval *var_ptr;
1506
1507 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1508
1511 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1512 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
1513 }
1515 }
1516
1517 ZEND_VM_DISPATCH_TO_HELPER(zend_pre_inc_helper);
1518}
1519
1520ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
1521{
1523 zval *var_ptr;
1524
1525 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1526
1527 SAVE_OPLINE();
1528 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1531 }
1532
1533 do {
1537
1539 zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
1540 break;
1541 }
1542 }
1544 } while (0);
1545
1546 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1547 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1548 }
1549
1550 FREE_OP1();
1552}
1553
1554ZEND_VM_HOT_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
1555{
1557 zval *var_ptr;
1558
1559 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1560
1561 if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1563 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1564 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
1565 }
1567 }
1568
1569 ZEND_VM_DISPATCH_TO_HELPER(zend_pre_dec_helper);
1570}
1571
1572ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
1573{
1575 zval *var_ptr;
1576
1577 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1578
1579 SAVE_OPLINE();
1580 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1583 }
1584
1585 do {
1589
1591 zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
1592 break;
1593 }
1594 }
1595 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1596
1598 } while (0);
1599
1600 FREE_OP1();
1602}
1603
1605{
1607 zval *var_ptr;
1608
1609 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1610
1611 if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1612 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
1615 }
1616
1617 ZEND_VM_DISPATCH_TO_HELPER(zend_post_inc_helper);
1618}
1619
1620ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
1621{
1623 zval *var_ptr;
1624
1625 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1626
1627 SAVE_OPLINE();
1628 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1631 }
1632
1633 do {
1637
1639 zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
1640 break;
1641 }
1642 }
1643 ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
1644
1646 } while (0);
1647
1648 FREE_OP1();
1650}
1651
1653{
1655 zval *var_ptr;
1656
1657 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1658
1659 if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1660 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
1663 }
1664
1665 ZEND_VM_DISPATCH_TO_HELPER(zend_post_dec_helper);
1666}
1667
1668ZEND_VM_HANDLER(136, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
1669{
1671 zval *z;
1672
1673 SAVE_OPLINE();
1674 z = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
1675
1676 if (Z_TYPE_P(z) == IS_STRING) {
1677 zend_string *str = Z_STR_P(z);
1678
1679 if (ZSTR_LEN(str) != 0) {
1680 zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
1681 }
1682 } else {
1684
1685 if (ZSTR_LEN(str) != 0) {
1686 zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
1687 } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
1689 }
1690 zend_string_release_ex(str, 0);
1691 }
1692
1693 FREE_OP1();
1695}
1696
1697ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
1698{
1700 zval *varname;
1701 zval *retval;
1703 HashTable *target_symbol_table;
1704
1705 SAVE_OPLINE();
1706 varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
1707
1708 if (OP1_TYPE == IS_CONST) {
1709 name = Z_STR_P(varname);
1710 } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
1711 name = Z_STR_P(varname);
1712 tmp_name = NULL;
1713 } else {
1714 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
1716 }
1717 name = zval_try_get_tmp_string(varname, &tmp_name);
1718 if (UNEXPECTED(!name)) {
1719 if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
1720 FREE_OP1();
1721 }
1722 ZVAL_UNDEF(EX_VAR(opline->result.var));
1724 }
1725 }
1726
1727 target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
1728 retval = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
1729 if (retval == NULL) {
1730 if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
1731ZEND_VM_C_LABEL(fetch_this):
1732 zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
1733 if (OP1_TYPE != IS_CONST) {
1734 zend_tmp_string_release(tmp_name);
1735 }
1737 }
1738 if (type == BP_VAR_W) {
1739 retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
1740 } else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
1741 retval = &EG(uninitialized_zval);
1742 } else {
1743 if (OP1_TYPE == IS_CV) {
1744 /* Keep name alive in case an error handler tries to free it. */
1745 zend_string_addref(name);
1746 }
1747 zend_error_unchecked(E_WARNING, "Undefined %svariable $%S",
1748 (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), name);
1749 if (type == BP_VAR_RW && !EG(exception)) {
1750 retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
1751 } else {
1752 retval = &EG(uninitialized_zval);
1753 }
1754 if (OP1_TYPE == IS_CV) {
1755 zend_string_release(name);
1756 }
1757 }
1758 /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
1759 } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
1761 if (Z_TYPE_P(retval) == IS_UNDEF) {
1762 if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
1763 ZEND_VM_C_GOTO(fetch_this);
1764 }
1765 if (type == BP_VAR_W) {
1767 } else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
1768 retval = &EG(uninitialized_zval);
1769 } else {
1770 zend_error_unchecked(E_WARNING, "Undefined %svariable $%S",
1771 (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), name);
1772 if (type == BP_VAR_RW && !EG(exception)) {
1774 } else {
1775 retval = &EG(uninitialized_zval);
1776 }
1777 }
1778 }
1779 }
1780
1781 if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
1782 FREE_OP1();
1783 }
1784
1785 if (OP1_TYPE != IS_CONST) {
1786 zend_tmp_string_release(tmp_name);
1787 }
1788
1790 if (type == BP_VAR_R || type == BP_VAR_IS) {
1791 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
1792 } else {
1793 ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
1794 }
1796}
1797
1798ZEND_VM_HANDLER(80, ZEND_FETCH_R, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
1799{
1800 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_R);
1801}
1802
1803ZEND_VM_HANDLER(83, ZEND_FETCH_W, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
1804{
1805 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_W);
1806}
1807
1808ZEND_VM_HANDLER(86, ZEND_FETCH_RW, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
1809{
1810 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_RW);
1811}
1812
1814{
1815 int fetch_type =
1818 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, fetch_type);
1819}
1820
1822{
1823 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_UNSET);
1824}
1825
1826ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
1827{
1828 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_IS);
1829}
1830
1831/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
1832ZEND_VM_HELPER(zend_fetch_static_prop_helper, ANY, ANY, int type)
1833{
1835 zval *prop;
1836
1837 SAVE_OPLINE();
1838
1839 if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
1841 prop = &EG(uninitialized_zval);
1842 }
1843
1844 if (type == BP_VAR_R || type == BP_VAR_IS) {
1845 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop);
1846 } else {
1847 ZVAL_INDIRECT(EX_VAR(opline->result.var), prop);
1848 }
1850}
1851
1852/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1853ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, ANY, CLASS_FETCH, CACHE_SLOT)
1854{
1855 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R);
1856}
1857
1858/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1859ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, ANY, CLASS_FETCH, FETCH_REF|DIM_WRITE|CACHE_SLOT)
1860{
1861 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W);
1862}
1863
1864/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1865ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, ANY, CLASS_FETCH, CACHE_SLOT)
1866{
1867 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_RW);
1868}
1869
1870/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1871ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, ANY, CLASS_FETCH, FETCH_REF|CACHE_SLOT)
1872{
1873 int fetch_type =
1876 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, fetch_type);
1877}
1878
1879/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1880ZEND_VM_HANDLER(178, ZEND_FETCH_STATIC_PROP_UNSET, ANY, CLASS_FETCH, CACHE_SLOT)
1881{
1882 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_UNSET);
1883}
1884
1885/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
1886ZEND_VM_HANDLER(176, ZEND_FETCH_STATIC_PROP_IS, ANY, CLASS_FETCH, CACHE_SLOT)
1887{
1888 ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_IS);
1889}
1890
1892{
1894 zval *container, *dim, *value;
1895
1896 SAVE_OPLINE();
1897 container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
1898 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1899 if (OP1_TYPE != IS_CONST) {
1901ZEND_VM_C_LABEL(fetch_dim_r_array):
1902 value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, OP2_TYPE, BP_VAR_R EXECUTE_DATA_CC);
1903 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
1904 } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
1907 ZEND_VM_C_GOTO(fetch_dim_r_array);
1908 } else {
1909 ZEND_VM_C_GOTO(fetch_dim_r_slow);
1910 }
1911 } else {
1912ZEND_VM_C_LABEL(fetch_dim_r_slow):
1913 if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
1914 dim++;
1915 }
1916 zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
1917 }
1918 } else {
1919 zend_fetch_dimension_address_read_R(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1920 }
1921 FREE_OP2();
1922 FREE_OP1();
1924}
1925
1927{
1929 zval *container;
1930
1931 SAVE_OPLINE();
1932 container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
1933 zend_fetch_dimension_address_W(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1934 FREE_OP2();
1935 if (OP1_TYPE == IS_VAR) {
1937 }
1939}
1940
1942{
1944 zval *container;
1945
1946 SAVE_OPLINE();
1947 container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1948 zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1949 FREE_OP2();
1950 if (OP1_TYPE == IS_VAR) {
1952 }
1954}
1955
1957{
1959 zval *container;
1960
1961 SAVE_OPLINE();
1962 container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_IS);
1963 zend_fetch_dimension_address_read_IS(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1964 FREE_OP2();
1965 FREE_OP1();
1967}
1968
1969ZEND_VM_COLD_HELPER(zend_use_tmp_in_write_context_helper, ANY, ANY)
1970{
1972
1973 SAVE_OPLINE();
1974 zend_throw_error(NULL, "Cannot use temporary expression in write context");
1975 FREE_OP2();
1976 FREE_OP1();
1977 ZVAL_UNDEF(EX_VAR(opline->result.var));
1979}
1980
1981ZEND_VM_COLD_HELPER(zend_use_undef_in_read_context_helper, ANY, ANY)
1982{
1984
1985 SAVE_OPLINE();
1986 zend_throw_error(NULL, "Cannot use [] for reading");
1987 FREE_OP2();
1988 FREE_OP1();
1989 ZVAL_UNDEF(EX_VAR(opline->result.var));
1991}
1992
1994{
1995#if !ZEND_VM_SPEC
1997#endif
1998
2000 if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
2001 ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
2002 }
2003 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_W);
2004 } else {
2005 if (OP2_TYPE == IS_UNUSED) {
2006 ZEND_VM_DISPATCH_TO_HELPER(zend_use_undef_in_read_context_helper);
2007 }
2008 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_R);
2009 }
2010}
2011
2013{
2015 zval *container;
2016
2017 SAVE_OPLINE();
2018 container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
2019 zend_fetch_dimension_address_UNSET(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
2020 FREE_OP2();
2021 if (OP1_TYPE == IS_VAR) {
2023 }
2025}
2026
2027ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
2028{
2030 zval *container;
2031 void **cache_slot = NULL;
2032
2033 SAVE_OPLINE();
2034 container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
2035
2036 if (OP1_TYPE == IS_CONST ||
2037 (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
2038 do {
2039 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
2042 break;
2043 }
2044 }
2045 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
2047 }
2048 zend_wrong_property_read(container, GET_OP2_ZVAL_PTR(BP_VAR_R));
2049 ZVAL_NULL(EX_VAR(opline->result.var));
2050 ZEND_VM_C_GOTO(fetch_obj_r_finish);
2051 } while (0);
2052 }
2053
2054 /* here we are sure we are dealing with an object */
2055 do {
2058 zval *retval;
2059
2060 if (OP2_TYPE == IS_CONST) {
2061 cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
2062
2063 if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
2064 uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
2065
2066 if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
2067ZEND_VM_C_LABEL(fetch_obj_r_simple):
2068 retval = OBJ_PROP(zobj, prop_offset);
2070 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2071 ZEND_VM_C_GOTO(fetch_obj_r_copy);
2072 } else {
2073ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
2074 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
2076 }
2077 }
2078 } else if (UNEXPECTED(IS_HOOKED_PROPERTY_OFFSET(prop_offset))) {
2079 zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
2080 if (ZEND_IS_PROPERTY_HOOK_SIMPLE_READ(prop_offset)) {
2081 prop_offset = prop_info->offset;
2082 ZEND_VM_C_GOTO(fetch_obj_r_simple);
2083 } else if (EXPECTED(ZEND_IS_PROPERTY_HOOK_SIMPLE_GET(prop_offset))) {
2087
2089 if (OP1_TYPE & IS_CV) {
2090 GC_ADDREF(zobj);
2091 }
2092 if (OP1_TYPE & (IS_CV|IS_VAR|IS_TMP_VAR)) {
2094 }
2095 zend_execute_data *call = zend_vm_stack_push_call_frame(call_info, hook, 0, zobj);
2096 call->prev_execute_data = execute_data;
2097 call->call = NULL;
2098 call->return_value = EX_VAR(opline->result.var);
2099 call->run_time_cache = RUN_TIME_CACHE(&hook->op_array);
2100
2102 EG(current_execute_data) = execute_data;
2103 zend_init_cvs(0, hook->op_array.last_var EXECUTE_DATA_CC);
2104
2105#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
2106 opline = hook->op_array.opcodes;
2107#else
2108 EX(opline) = hook->op_array.opcodes;
2109#endif
2113
2115 }
2116 /* Fall through to read_property for hooks. */
2117 } else if (EXPECTED(zobj->properties != NULL)) {
2119 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2120 if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
2121 uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
2122
2123 if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
2124 Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
2125
2126 if (EXPECTED(p->key == name) ||
2127 (EXPECTED(p->h == ZSTR_H(name)) &&
2128 EXPECTED(p->key != NULL) &&
2129 EXPECTED(zend_string_equal_content(p->key, name)))) {
2130 retval = &p->val;
2131 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2132 ZEND_VM_C_GOTO(fetch_obj_r_copy);
2133 } else {
2134 ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
2135 }
2136 }
2137 }
2138 CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
2139 }
2140 retval = zend_hash_find_known_hash(zobj->properties, name);
2141 if (EXPECTED(retval)) {
2142 uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
2143 CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
2144 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2145 ZEND_VM_C_GOTO(fetch_obj_r_copy);
2146 } else {
2147 ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
2148 }
2149 }
2150 }
2151 }
2152 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2153 } else {
2154 name = zval_try_get_tmp_string(GET_OP2_ZVAL_PTR(BP_VAR_R), &tmp_name);
2155 if (UNEXPECTED(!name)) {
2156 ZVAL_UNDEF(EX_VAR(opline->result.var));
2157 break;
2158 }
2159 }
2160
2161#if ZEND_DEBUG
2162 /* For non-standard object handlers, verify a declared property type in debug builds.
2163 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
2165 if (zobj->handlers->read_property != zend_std_read_property) {
2166 prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
2167 }
2168#endif
2169 retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
2170#if ZEND_DEBUG
2172 && ZEND_TYPE_IS_SET(prop_info->type)) {
2174 zend_verify_property_type(prop_info, retval, /* strict */ true);
2175 }
2176#endif
2177
2178 if (OP2_TYPE != IS_CONST) {
2179 zend_tmp_string_release(tmp_name);
2180 }
2181
2182 if (retval != EX_VAR(opline->result.var)) {
2183ZEND_VM_C_LABEL(fetch_obj_r_copy):
2184 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
2185 } else if (UNEXPECTED(Z_ISREF_P(retval))) {
2186 zend_unwrap_reference(retval);
2187 }
2188 } while (0);
2189
2190ZEND_VM_C_LABEL(fetch_obj_r_finish):
2191 FREE_OP2();
2192 FREE_OP1();
2194}
2195
2196ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_WRITE|CACHE_SLOT)
2197{
2200
2201 SAVE_OPLINE();
2202
2203 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2204 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
2205 result = EX_VAR(opline->result.var);
2206 zend_fetch_property_address(
2207 result, container, OP1_TYPE, property, OP2_TYPE,
2208 ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
2209 BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
2210 FREE_OP2();
2211 if (OP1_TYPE == IS_VAR) {
2213 }
2215}
2216
2217ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
2218{
2221
2222 SAVE_OPLINE();
2223 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
2224 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
2225 result = EX_VAR(opline->result.var);
2226 zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
2227 FREE_OP2();
2228 if (OP1_TYPE == IS_VAR) {
2230 }
2232}
2233
2234ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
2235{
2237 zval *container;
2238 void **cache_slot = NULL;
2239
2240 SAVE_OPLINE();
2241 container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
2242
2243 if (OP1_TYPE == IS_CONST ||
2244 (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
2245 do {
2246 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
2249 break;
2250 }
2251 }
2252 if (OP2_TYPE == IS_CV && Z_TYPE_P(EX_VAR(opline->op2.var)) == IS_UNDEF) {
2254 }
2255 ZVAL_NULL(EX_VAR(opline->result.var));
2256 ZEND_VM_C_GOTO(fetch_obj_is_finish);
2257 } while (0);
2258 }
2259
2260 /* here we are sure we are dealing with an object */
2261 do {
2264 zval *retval;
2265
2266 if (OP2_TYPE == IS_CONST) {
2267 cache_slot = CACHE_ADDR(opline->extended_value);
2268
2269 if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
2270 uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
2271
2272 if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
2273ZEND_VM_C_LABEL(fetch_obj_is_simple):
2274 retval = OBJ_PROP(zobj, prop_offset);
2275 if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
2276 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2277 ZEND_VM_C_GOTO(fetch_obj_is_copy);
2278 } else {
2279ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
2280 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
2282 }
2283 }
2284 } else if (UNEXPECTED(IS_HOOKED_PROPERTY_OFFSET(prop_offset))) {
2285 if (ZEND_IS_PROPERTY_HOOK_SIMPLE_READ(prop_offset)) {
2286 zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
2287 prop_offset = prop_info->offset;
2288 ZEND_VM_C_GOTO(fetch_obj_is_simple);
2289 }
2290 /* Fall through to read_property for hooks. */
2291 } else if (EXPECTED(zobj->properties != NULL)) {
2293 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2294 if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
2295 uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
2296
2297 if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
2298 Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
2299
2300 if (EXPECTED(p->key == name) ||
2301 (EXPECTED(p->h == ZSTR_H(name)) &&
2302 EXPECTED(p->key != NULL) &&
2303 EXPECTED(zend_string_equal_content(p->key, name)))) {
2304 retval = &p->val;
2305 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2306 ZEND_VM_C_GOTO(fetch_obj_is_copy);
2307 } else {
2308 ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
2309 }
2310 }
2311 }
2312 CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
2313 }
2314 retval = zend_hash_find_known_hash(zobj->properties, name);
2315 if (EXPECTED(retval)) {
2316 uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
2317 CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
2318 if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
2319 ZEND_VM_C_GOTO(fetch_obj_is_copy);
2320 } else {
2321 ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
2322 }
2323 }
2324 }
2325 }
2326 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2327 } else {
2328 name = zval_try_get_tmp_string(GET_OP2_ZVAL_PTR(BP_VAR_R), &tmp_name);
2329 if (UNEXPECTED(!name)) {
2330 ZVAL_UNDEF(EX_VAR(opline->result.var));
2331 break;
2332 }
2333 }
2334
2335 retval = zobj->handlers->read_property(zobj, name, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
2336
2337 if (OP2_TYPE != IS_CONST) {
2338 zend_tmp_string_release(tmp_name);
2339 }
2340
2341 if (retval != EX_VAR(opline->result.var)) {
2342ZEND_VM_C_LABEL(fetch_obj_is_copy):
2343 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
2344 } else if (UNEXPECTED(Z_ISREF_P(retval))) {
2345 zend_unwrap_reference(retval);
2346 }
2347 } while (0);
2348
2349ZEND_VM_C_LABEL(fetch_obj_is_finish):
2350 FREE_OP2();
2351 FREE_OP1();
2353}
2354
2355ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT)
2356{
2357#if !ZEND_VM_SPEC
2359#endif
2360
2362 /* Behave like FETCH_OBJ_W */
2363 if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
2364 ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
2365 }
2366 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W);
2367 } else {
2368 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R);
2369 }
2370}
2371
2372ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
2373{
2376
2377 SAVE_OPLINE();
2378 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
2379 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
2380 result = EX_VAR(opline->result.var);
2381 zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
2382 FREE_OP2();
2383 if (OP1_TYPE == IS_VAR) {
2385 }
2387}
2388
2390{
2392 zval *container;
2393
2394 SAVE_OPLINE();
2395 container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
2396 zend_fetch_dimension_address_LIST_r(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
2397 FREE_OP2();
2399}
2400
2402{
2404 zval *container, *dim;
2405
2406 SAVE_OPLINE();
2407 container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2408 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
2409
2410 if (OP1_TYPE == IS_VAR
2411 && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
2413 ) {
2414 zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
2415 zend_fetch_dimension_address_LIST_r(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
2416 } else {
2417 zend_fetch_dimension_address_W(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
2418 }
2419
2420 FREE_OP2();
2422}
2423
2424ZEND_VM_HANDLER(24, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
2425{
2427 zval *object, *value, tmp;
2431
2432 SAVE_OPLINE();
2433 object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2434 value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2435
2436 if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
2437 if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
2438 object = Z_REFVAL_P(object);
2439 ZEND_VM_C_GOTO(assign_object);
2440 }
2441 zend_throw_non_object_error(object, GET_OP2_ZVAL_PTR(BP_VAR_R) OPLINE_CC EXECUTE_DATA_CC);
2442 value = &EG(uninitialized_zval);
2443 ZEND_VM_C_GOTO(free_and_exit_assign_obj);
2444 }
2445
2446ZEND_VM_C_LABEL(assign_object):
2447 zobj = Z_OBJ_P(object);
2448 if (OP2_TYPE == IS_CONST) {
2449 if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
2450 void **cache_slot = CACHE_ADDR(opline->extended_value);
2451 uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
2452 zval *property_val;
2454
2455 if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
2456 prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
2457
2458ZEND_VM_C_LABEL(assign_obj_simple):
2459 property_val = OBJ_PROP(zobj, prop_offset);
2460 if (Z_TYPE_P(property_val) != IS_UNDEF) {
2461 if (prop_info != NULL) {
2462 value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
2463 ZEND_VM_C_GOTO(free_and_exit_assign_obj);
2464 } else {
2465ZEND_VM_C_LABEL(fast_assign_obj):
2466 value = zend_assign_to_variable_ex(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
2467 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2468 ZVAL_COPY(EX_VAR(opline->result.var), value);
2469 }
2470 ZEND_VM_C_GOTO(exit_assign_obj);
2471 }
2472 }
2473 } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(prop_offset))) {
2474 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2475 if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
2477 if (!zobj) {
2478 value = &EG(uninitialized_zval);
2479 ZEND_VM_C_GOTO(free_and_exit_assign_obj);
2480 }
2481 }
2482 if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
2484 }
2485 if (EXPECTED(zobj->properties != NULL)) {
2486 if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
2487 if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
2488 GC_DELREF(zobj->properties);
2489 }
2490 zobj->properties = zend_array_dup(zobj->properties);
2491 }
2492 property_val = zend_hash_find_known_hash(zobj->properties, name);
2493 if (property_val) {
2494 ZEND_VM_C_GOTO(fast_assign_obj);
2495 }
2496 }
2497
2498 if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
2499 if (OP_DATA_TYPE == IS_CONST) {
2502 }
2503 } else if (OP_DATA_TYPE != IS_TMP_VAR) {
2504 if (Z_ISREF_P(value)) {
2505 if (OP_DATA_TYPE == IS_VAR) {
2507 if (GC_DELREF(ref) == 0) {
2509 efree_size(ref, sizeof(zend_reference));
2510 value = &tmp;
2511 } else {
2514 }
2515 } else {
2518 }
2519 } else if (OP_DATA_TYPE == IS_CV) {
2521 }
2522 }
2523 zend_hash_add_new(zobj->properties, name, value);
2524 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2525 ZVAL_COPY(EX_VAR(opline->result.var), value);
2526 }
2527 ZEND_VM_C_GOTO(exit_assign_obj);
2528 }
2529 } else {
2531 if (ZEND_IS_PROPERTY_HOOK_SIMPLE_WRITE(prop_offset)) {
2532 prop_info = CACHED_PTR_EX(cache_slot + 2);
2533 prop_offset = prop_info->offset;
2534 if (!ZEND_TYPE_IS_SET(prop_info->type)) {
2535 prop_info = NULL;
2536 }
2537 ZEND_VM_C_GOTO(assign_obj_simple);
2538 }
2539 /* Fall through to write_property for hooks. */
2540 }
2541 }
2542 name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
2543 } else {
2544 name = zval_try_get_tmp_string(GET_OP2_ZVAL_PTR(BP_VAR_R), &tmp_name);
2546 FREE_OP_DATA();
2547 UNDEF_RESULT();
2548 ZEND_VM_C_GOTO(exit_assign_obj);
2549 }
2550 }
2551
2552 if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
2554 }
2555
2556 value = zobj->handlers->write_property(zobj, name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
2557
2558 if (OP2_TYPE != IS_CONST) {
2559 zend_tmp_string_release(tmp_name);
2560 }
2561
2562ZEND_VM_C_LABEL(free_and_exit_assign_obj):
2563 if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
2564 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
2565 }
2567ZEND_VM_C_LABEL(exit_assign_obj):
2568 if (garbage) {
2570 }
2571 FREE_OP2();
2572 FREE_OP1();
2573 /* assign_obj has two opcodes! */
2575}
2576
2577/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
2578ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
2579{
2581 zval *prop, *value;
2584
2585 SAVE_OPLINE();
2586
2587 if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
2588 FREE_OP_DATA();
2589 UNDEF_RESULT();
2591 }
2592
2593 value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2594
2596 value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
2597 FREE_OP_DATA();
2598 } else {
2599 value = zend_assign_to_variable_ex(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
2600 }
2601
2603 ZVAL_COPY(EX_VAR(opline->result.var), value);
2604 }
2605
2606 if (garbage) {
2608 }
2609
2610 /* assign_static_prop has two opcodes! */
2612}
2613
2614ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV))
2615{
2617 zval *object_ptr, *orig_object_ptr;
2618 zval *value;
2622
2623 SAVE_OPLINE();
2624 orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2625
2626 if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
2627ZEND_VM_C_LABEL(try_assign_dim_array):
2628 SEPARATE_ARRAY(object_ptr);
2629 if (OP2_TYPE == IS_UNUSED) {
2630 value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R);
2631 if (OP_DATA_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
2632 HashTable *ht = Z_ARRVAL_P(object_ptr);
2633 if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
2634 GC_ADDREF(ht);
2635 }
2636 value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC);
2637 if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
2639 ZEND_VM_C_GOTO(assign_dim_error);
2640 }
2641 }
2642 if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
2644 }
2646 if (UNEXPECTED(value == NULL)) {
2648 ZEND_VM_C_GOTO(assign_dim_error);
2649 } else if (OP_DATA_TYPE == IS_CV) {
2650 if (Z_REFCOUNTED_P(value)) {
2652 }
2653 } else if (OP_DATA_TYPE == IS_VAR) {
2654 zval *free_op_data = EX_VAR((opline+1)->op1.var);
2655 if (Z_ISREF_P(free_op_data)) {
2656 if (Z_REFCOUNTED_P(value)) {
2658 }
2659 zval_ptr_dtor_nogc(free_op_data);
2660 }
2661 } else if (OP_DATA_TYPE == IS_CONST) {
2664 }
2665 }
2666 } else {
2667 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
2668 if (OP2_TYPE == IS_CONST) {
2669 variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
2670 } else {
2671 variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
2672 }
2673 if (UNEXPECTED(variable_ptr == NULL)) {
2674 ZEND_VM_C_GOTO(assign_dim_error);
2675 }
2676 value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2677 value = zend_assign_to_variable_ex(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
2678 }
2679 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2680 ZVAL_COPY(EX_VAR(opline->result.var), value);
2681 }
2682 if (garbage) {
2684 }
2685 } else {
2686 if (EXPECTED(Z_ISREF_P(object_ptr))) {
2687 object_ptr = Z_REFVAL_P(object_ptr);
2688 if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
2689 ZEND_VM_C_GOTO(try_assign_dim_array);
2690 }
2691 }
2692 if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
2693 zend_object *obj = Z_OBJ_P(object_ptr);
2694
2695 GC_ADDREF(obj);
2696 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
2697 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
2699 } else if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2700 dim++;
2701 }
2702
2703 value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R);
2704 if (OP_DATA_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(value))) {
2705 value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC);
2706 } else if (OP_DATA_TYPE & (IS_CV|IS_VAR)) {
2708 }
2709
2710 zend_assign_to_object_dim(obj, dim, value OPLINE_CC EXECUTE_DATA_CC);
2711
2712 FREE_OP_DATA();
2713 if (UNEXPECTED(GC_DELREF(obj) == 0)) {
2715 }
2716 } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
2717 if (OP2_TYPE == IS_UNUSED) {
2718 zend_use_new_element_for_string();
2719 FREE_OP_DATA();
2720 UNDEF_RESULT();
2721 } else {
2722 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
2723 value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R);
2724 zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
2725 FREE_OP_DATA();
2726 }
2727 } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
2731 dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
2732 FREE_OP_DATA();
2733 UNDEF_RESULT();
2734 } else {
2736 uint8_t old_type = Z_TYPE_P(object_ptr);
2737
2738 ZVAL_ARR(object_ptr, ht);
2739 if (UNEXPECTED(old_type == IS_FALSE)) {
2740 GC_ADDREF(ht);
2742 if (UNEXPECTED(GC_DELREF(ht) == 0)) {
2744 ZEND_VM_C_GOTO(assign_dim_error);
2745 }
2746 }
2747 ZEND_VM_C_GOTO(try_assign_dim_array);
2748 }
2749 } else {
2750 zend_use_scalar_as_array();
2751 dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
2752ZEND_VM_C_LABEL(assign_dim_error):
2753 FREE_OP_DATA();
2754 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2755 ZVAL_NULL(EX_VAR(opline->result.var));
2756 }
2757 }
2758 }
2759 if (OP2_TYPE != IS_UNUSED) {
2760 FREE_OP2();
2761 }
2762 FREE_OP1();
2763 /* assign_dim has two opcodes! */
2765}
2766
2767ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
2768{
2770 zval *value;
2772
2773 SAVE_OPLINE();
2774 value = GET_OP2_ZVAL_PTR(BP_VAR_R);
2775 variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2776
2779
2780 value = zend_assign_to_variable_ex(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES(), &garbage);
2781 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2782 ZVAL_COPY(EX_VAR(opline->result.var), value);
2783 }
2784 if (garbage) {
2786 }
2787 } else {
2788 value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES());
2789 }
2790 FREE_OP1();
2791 /* zend_assign_to_variable() always takes care of op2, never free it! */
2792
2794}
2795
2797{
2800 zval *value_ptr;
2802
2803 SAVE_OPLINE();
2804 value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W);
2805 variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2806
2807 if (OP1_TYPE == IS_VAR &&
2808 UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
2809
2810 zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
2811 variable_ptr = &EG(uninitialized_zval);
2812 } else if (OP2_TYPE == IS_VAR &&
2813 opline->extended_value == ZEND_RETURNS_FUNCTION &&
2815
2816 variable_ptr = zend_wrong_assign_to_variable_reference(
2818 } else {
2819 zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
2820 }
2821
2822 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2823 ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
2824 }
2825
2826 if (garbage) {
2828 }
2829
2830 FREE_OP2();
2831 FREE_OP1();
2833}
2834
2835ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV))
2836{
2839
2840 SAVE_OPLINE();
2841
2842 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
2843 property = GET_OP2_ZVAL_PTR(BP_VAR_R);
2844
2845 value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
2846
2848 if (OP1_TYPE == IS_UNUSED) {
2849 if (OP2_TYPE == IS_CONST) {
2850 zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
2851 } else {
2852 zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
2853 }
2854 } else {
2855 if (OP2_TYPE == IS_CONST) {
2856 zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
2857 } else {
2858 zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
2859 }
2860 }
2861 } else {
2862 zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
2863 }
2864
2865 FREE_OP1();
2866 FREE_OP2();
2867 FREE_OP_DATA();
2869}
2870
2871/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
2872ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
2873{
2875 zval *prop, *value_ptr;
2878
2879 SAVE_OPLINE();
2880
2881 if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
2882 FREE_OP_DATA();
2883 UNDEF_RESULT();
2885 }
2886
2887 value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
2888
2889 if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) {
2890 if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC))) {
2891 prop = &EG(uninitialized_zval);
2892 }
2893 } else if (ZEND_TYPE_IS_SET(prop_info->type)) {
2894 prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr, &garbage EXECUTE_DATA_CC);
2895 } else {
2896 zend_assign_to_variable_reference(prop, value_ptr, &garbage);
2897 }
2898
2899 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
2900 ZVAL_COPY(EX_VAR(opline->result.var), prop);
2901 }
2902
2903 if (garbage) {
2905 }
2906
2907 FREE_OP_DATA();
2909}
2910
2911ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
2912{
2913 zend_execute_data *old_execute_data;
2914 uint32_t call_info = EX_CALL_INFO();
2915 SAVE_OPLINE();
2916
2918 EG(current_execute_data) = EX(prev_execute_data);
2919 i_free_compiled_variables(execute_data);
2920
2921#ifdef ZEND_PREFER_RELOAD
2923#endif
2926 } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
2928 }
2929 EG(vm_stack_top) = (zval*)execute_data;
2931
2932 if (UNEXPECTED(EG(exception) != NULL)) {
2933 zend_rethrow_exception(execute_data);
2935 }
2936
2938 ZEND_VM_LEAVE();
2939 } else if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP)) == 0)) {
2940 EG(current_execute_data) = EX(prev_execute_data);
2941 i_free_compiled_variables(execute_data);
2942
2943#ifdef ZEND_PREFER_RELOAD
2945#endif
2948 }
2949
2951 zend_free_extra_named_params(EX(extra_named_params));
2952 }
2953
2954 /* Free extra args before releasing the closure,
2955 * as that may free the op_array. */
2956 zend_vm_stack_free_extra_args_ex(call_info, execute_data);
2957
2960 } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
2962 }
2963
2964 old_execute_data = execute_data;
2966 zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
2967
2968 if (UNEXPECTED(EG(exception) != NULL)) {
2969 zend_rethrow_exception(execute_data);
2971 }
2972
2974 ZEND_VM_LEAVE();
2975 } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
2976 if (EX(func)->op_array.last_var > 0) {
2979 }
2980 zend_destroy_static_vars(&EX(func)->op_array);
2981 destroy_op_array(&EX(func)->op_array);
2982 efree_size(EX(func), sizeof(zend_op_array));
2983 old_execute_data = execute_data;
2984 execute_data = EG(current_execute_data) = EX(prev_execute_data);
2985 zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
2986
2988 if (EX(func)->op_array.last_var > 0) {
2990 } else {
2992 }
2993 }
2994 if (UNEXPECTED(EG(exception) != NULL)) {
2995 zend_rethrow_exception(execute_data);
2997 }
2998
3000 ZEND_VM_LEAVE();
3001 } else {
3002 if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
3003 EG(current_execute_data) = EX(prev_execute_data);
3004 i_free_compiled_variables(execute_data);
3005#ifdef ZEND_PREFER_RELOAD
3007#endif
3011 }
3012 zend_vm_stack_free_extra_args_ex(call_info, execute_data);
3014 zend_free_extra_named_params(EX(extra_named_params));
3015 }
3016 }
3019 }
3021 } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
3022 zend_array *symbol_table = EX(symbol_table);
3023
3024 if (EX(func)->op_array.last_var > 0) {
3027 }
3029 old_execute_data = EX(prev_execute_data);
3030 while (old_execute_data) {
3031 if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
3032 if (old_execute_data->symbol_table == symbol_table) {
3033 if (old_execute_data->func->op_array.last_var > 0) {
3034 zend_attach_symbol_table(old_execute_data);
3035 } else {
3037 }
3038 }
3039 break;
3040 }
3041 old_execute_data = old_execute_data->prev_execute_data;
3042 }
3043 }
3044 EG(current_execute_data) = EX(prev_execute_data);
3046 }
3047 }
3048}
3049
3051{
3053
3054 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
3055}
3056
3058{
3060 zval *val;
3061 uint8_t op1_type;
3062
3063 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
3064
3065 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3067 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3068 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3069 SAVE_OPLINE();
3071 if (UNEXPECTED(EG(exception))) {
3073 }
3074 }
3075 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
3076 }
3077
3078 SAVE_OPLINE();
3079 op1_type = OP1_TYPE;
3080 if (i_zend_is_true(val)) {
3081 opline++;
3082 } else {
3083 opline = OP_JMP_ADDR(opline, opline->op2);
3084 }
3085 if (op1_type & (IS_TMP_VAR|IS_VAR)) {
3086 zval_ptr_dtor_nogc(val);
3087 }
3088 ZEND_VM_JMP(opline);
3089}
3090
3092{
3094 zval *val;
3095 uint8_t op1_type;
3096
3097 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
3098
3099 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3100 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
3101 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3102 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3103 SAVE_OPLINE();
3105 if (UNEXPECTED(EG(exception))) {
3107 }
3108 }
3110 }
3111
3112 SAVE_OPLINE();
3113 op1_type = OP1_TYPE;
3114 if (i_zend_is_true(val)) {
3115 opline = OP_JMP_ADDR(opline, opline->op2);
3116 } else {
3117 opline++;
3118 }
3119 if (op1_type & (IS_TMP_VAR|IS_VAR)) {
3120 zval_ptr_dtor_nogc(val);
3121 }
3122 ZEND_VM_JMP(opline);
3123}
3124
3126{
3128 zval *val;
3129 bool ret;
3130
3131 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
3132
3133 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3134 ZVAL_TRUE(EX_VAR(opline->result.var));
3136 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3137 ZVAL_FALSE(EX_VAR(opline->result.var));
3138 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3139 SAVE_OPLINE();
3141 if (UNEXPECTED(EG(exception))) {
3143 }
3144 }
3145 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
3146 }
3147
3148 SAVE_OPLINE();
3149 ret = i_zend_is_true(val);
3150 FREE_OP1();
3151 if (ret) {
3152 ZVAL_TRUE(EX_VAR(opline->result.var));
3153 opline++;
3154 } else {
3155 ZVAL_FALSE(EX_VAR(opline->result.var));
3156 opline = OP_JMP_ADDR(opline, opline->op2);
3157 }
3158 ZEND_VM_JMP(opline);
3159}
3160
3162{
3164 zval *val;
3165 bool ret;
3166
3167 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
3168
3169 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3170 ZVAL_TRUE(EX_VAR(opline->result.var));
3171 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
3172 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3173 ZVAL_FALSE(EX_VAR(opline->result.var));
3174 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3175 SAVE_OPLINE();
3178 } else {
3180 }
3181 }
3182
3183 SAVE_OPLINE();
3184 ret = i_zend_is_true(val);
3185 FREE_OP1();
3186 if (ret) {
3187 ZVAL_TRUE(EX_VAR(opline->result.var));
3188 opline = OP_JMP_ADDR(opline, opline->op2);
3189 } else {
3190 ZVAL_FALSE(EX_VAR(opline->result.var));
3191 opline++;
3192 }
3193 ZEND_VM_JMP(opline);
3194}
3195
3197{
3199
3200 SAVE_OPLINE();
3201 zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
3203}
3204
3206{
3207 zval *var;
3209
3210 var = EX_VAR(opline->op1.var);
3211 if (Z_TYPE_P(var) != IS_ARRAY) {
3212 SAVE_OPLINE();
3213 if (Z_FE_ITER_P(var) != (uint32_t)-1) {
3215 }
3216 zval_ptr_dtor_nogc(var);
3218 }
3219
3220 /* This is freeing an array. Use an inlined version of zval_ptr_dtor_nogc. */
3221 /* PHP only needs to save the opline and check for an exception if the last reference to the array was garbage collected (destructors of elements in the array could throw an exception) */
3222 if (Z_REFCOUNTED_P(var) && !Z_DELREF_P(var)) {
3223 SAVE_OPLINE();
3226 }
3228}
3229
3231{
3233 zval *op1, *op2;
3234 zend_string *op1_str, *op2_str, *str;
3235
3236
3237 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
3238 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3239 if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
3240 (OP2_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
3241 zend_string *op1_str = Z_STR_P(op1);
3242 zend_string *op2_str = Z_STR_P(op2);
3243 zend_string *str;
3244 uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
3245
3246 if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
3247 if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
3248 ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
3249 } else {
3250 ZVAL_STR(EX_VAR(opline->result.var), op2_str);
3251 }
3252 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
3253 zend_string_release_ex(op1_str, 0);
3254 }
3255 } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
3256 if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
3257 ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
3258 } else {
3259 ZVAL_STR(EX_VAR(opline->result.var), op1_str);
3260 }
3261 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
3262 zend_string_release_ex(op2_str, 0);
3263 }
3264 } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
3265 !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
3266 size_t len = ZSTR_LEN(op1_str);
3267
3268 str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
3269 memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
3270 GC_ADD_FLAGS(str, flags);
3271 ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
3272 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
3273 zend_string_release_ex(op2_str, 0);
3274 }
3275 } else {
3276 str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
3277 memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
3278 memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
3279 GC_ADD_FLAGS(str, flags);
3280 ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
3281 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
3282 zend_string_release_ex(op1_str, 0);
3283 }
3284 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
3285 zend_string_release_ex(op2_str, 0);
3286 }
3287 }
3289 }
3290
3291 SAVE_OPLINE();
3292 if (OP1_TYPE == IS_CONST) {
3293 op1_str = Z_STR_P(op1);
3294 } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
3295 op1_str = zend_string_copy(Z_STR_P(op1));
3296 } else {
3297 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
3299 }
3300 op1_str = zval_get_string_func(op1);
3301 }
3302 if (OP2_TYPE == IS_CONST) {
3303 op2_str = Z_STR_P(op2);
3304 } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
3305 op2_str = zend_string_copy(Z_STR_P(op2));
3306 } else {
3307 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
3309 }
3310 op2_str = zval_get_string_func(op2);
3311 }
3312 do {
3313 if (OP1_TYPE != IS_CONST) {
3314 if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
3315 if (OP2_TYPE == IS_CONST) {
3317 GC_ADDREF(op2_str);
3318 }
3319 }
3320 ZVAL_STR(EX_VAR(opline->result.var), op2_str);
3321 zend_string_release_ex(op1_str, 0);
3322 break;
3323 }
3324 }
3325 if (OP2_TYPE != IS_CONST) {
3326 if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
3327 if (OP1_TYPE == IS_CONST) {
3329 GC_ADDREF(op1_str);
3330 }
3331 }
3332 ZVAL_STR(EX_VAR(opline->result.var), op1_str);
3333 zend_string_release_ex(op2_str, 0);
3334 break;
3335 }
3336 }
3337 str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
3338 memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
3339 memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
3340
3341 ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
3342 ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
3343 if (OP1_TYPE != IS_CONST) {
3344 zend_string_release_ex(op1_str, 0);
3345 }
3346 if (OP2_TYPE != IS_CONST) {
3347 zend_string_release_ex(op2_str, 0);
3348 }
3349 } while (0);
3350 FREE_OP1();
3351 FREE_OP2();
3353}
3354
3356{
3358 zend_string **rope;
3359 zval *var;
3360
3361 /* Compiler allocates the necessary number of zval slots to keep the rope */
3362 rope = (zend_string**)EX_VAR(opline->result.var);
3363 if (OP2_TYPE == IS_CONST) {
3364 var = GET_OP2_ZVAL_PTR(BP_VAR_R);
3365 rope[0] = Z_STR_P(var);
3366 if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
3367 Z_ADDREF_P(var);
3368 }
3369 } else {
3370 var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3371 if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
3372 if (OP2_TYPE == IS_CV) {
3373 rope[0] = zend_string_copy(Z_STR_P(var));
3374 } else {
3375 rope[0] = Z_STR_P(var);
3376 }
3377 } else {
3378 SAVE_OPLINE();
3379 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
3381 }
3382 rope[0] = zval_get_string_func(var);
3383 FREE_OP2();
3385 }
3386 }
3388}
3389
3391{
3393 zend_string **rope;
3394 zval *var;
3395
3396 /* op1 and result are the same */
3397 rope = (zend_string**)EX_VAR(opline->op1.var);
3398 if (OP2_TYPE == IS_CONST) {
3399 var = GET_OP2_ZVAL_PTR(BP_VAR_R);
3400 rope[opline->extended_value] = Z_STR_P(var);
3401 if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
3402 Z_ADDREF_P(var);
3403 }
3404 } else {
3405 var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3406 if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
3407 if (OP2_TYPE == IS_CV) {
3408 rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
3409 } else {
3410 rope[opline->extended_value] = Z_STR_P(var);
3411 }
3412 } else {
3413 SAVE_OPLINE();
3414 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
3416 }
3417 rope[opline->extended_value] = zval_get_string_func(var);
3418 FREE_OP2();
3420 }
3421 }
3423}
3424
3426{
3428 zend_string **rope;
3429 zval *var, *ret;
3430 uint32_t i;
3431
3432 rope = (zend_string**)EX_VAR(opline->op1.var);
3433 if (OP2_TYPE == IS_CONST) {
3434 var = GET_OP2_ZVAL_PTR(BP_VAR_R);
3435 rope[opline->extended_value] = Z_STR_P(var);
3436 if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
3437 Z_ADDREF_P(var);
3438 }
3439 } else {
3440 var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3441 if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
3442 if (OP2_TYPE == IS_CV) {
3443 rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
3444 } else {
3445 rope[opline->extended_value] = Z_STR_P(var);
3446 }
3447 } else {
3448 SAVE_OPLINE();
3449 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
3451 }
3452 rope[opline->extended_value] = zval_get_string_func(var);
3453 FREE_OP2();
3454 if (UNEXPECTED(EG(exception))) {
3455 for (i = 0; i <= opline->extended_value; i++) {
3456 zend_string_release_ex(rope[i], 0);
3457 }
3458 ZVAL_UNDEF(EX_VAR(opline->result.var));
3460 }
3461 }
3462 }
3463
3464 size_t len = 0;
3466 for (i = 0; i <= opline->extended_value; i++) {
3468 len += ZSTR_LEN(rope[i]);
3469 }
3470 ret = EX_VAR(opline->result.var);
3471 ZVAL_STR(ret, zend_string_alloc(len, 0));
3473
3474 char *target = Z_STRVAL_P(ret);
3475 for (i = 0; i <= opline->extended_value; i++) {
3476 memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
3477 target += ZSTR_LEN(rope[i]);
3478 zend_string_release_ex(rope[i], 0);
3479 }
3480 *target = '\0';
3481
3483}
3484
3485ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, UNUSED|CLASS_FETCH, CONST|TMPVAR|UNUSED|CV, CACHE_SLOT)
3486{
3487 zval *class_name;
3489
3490 SAVE_OPLINE();
3491 if (OP2_TYPE == IS_UNUSED) {
3492 Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
3494 } else if (OP2_TYPE == IS_CONST) {
3495 zend_class_entry *ce = CACHED_PTR(opline->extended_value);
3496
3497 if (UNEXPECTED(ce == NULL)) {
3498 class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3499 ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
3500 CACHE_PTR(opline->extended_value, ce);
3501 }
3502 Z_CE_P(EX_VAR(opline->result.var)) = ce;
3503 } else {
3504 class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3505ZEND_VM_C_LABEL(try_class_name):
3506 if (Z_TYPE_P(class_name) == IS_OBJECT) {
3507 Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
3508 } else if (Z_TYPE_P(class_name) == IS_STRING) {
3509 Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
3510 } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
3511 class_name = Z_REFVAL_P(class_name);
3512 ZEND_VM_C_GOTO(try_class_name);
3513 } else {
3514 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
3516 if (UNEXPECTED(EG(exception) != NULL)) {
3518 }
3519 }
3520 zend_throw_error(NULL, "Class name must be a valid object or a string");
3521 }
3522 }
3523
3524 FREE_OP2();
3526}
3527
3528ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|CACHE_SLOT)
3529{
3531 zval *function_name;
3532 zval *object;
3534 zend_class_entry *called_scope;
3535 zend_object *obj;
3537 uint32_t call_info;
3538
3539 SAVE_OPLINE();
3540
3541 object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
3542
3543 if (OP2_TYPE != IS_CONST) {
3544 function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3545 }
3546
3547 if (OP2_TYPE != IS_CONST &&
3548 UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
3549 do {
3550 if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
3551 function_name = Z_REFVAL_P(function_name);
3552 if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
3553 break;
3554 }
3555 } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
3557 if (UNEXPECTED(EG(exception) != NULL)) {
3558 FREE_OP1();
3560 }
3561 }
3562 zend_throw_error(NULL, "Method name must be a string");
3563 FREE_OP2();
3564 FREE_OP1();
3566 } while (0);
3567 }
3568
3569 if (OP1_TYPE == IS_UNUSED) {
3570 obj = Z_OBJ_P(object);
3571 } else {
3572 do {
3573 if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
3574 obj = Z_OBJ_P(object);
3575 } else {
3576 if ((OP1_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
3577 zend_reference *ref = Z_REF_P(object);
3578
3579 object = &ref->val;
3580 if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
3581 obj = Z_OBJ_P(object);
3582 if (OP1_TYPE & IS_VAR) {
3583 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
3584 efree_size(ref, sizeof(zend_reference));
3585 } else {
3586 Z_ADDREF_P(object);
3587 }
3588 }
3589 break;
3590 }
3591 }
3592 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
3593 object = ZVAL_UNDEFINED_OP1();
3594 if (UNEXPECTED(EG(exception) != NULL)) {
3595 if (OP2_TYPE != IS_CONST) {
3596 FREE_OP2();
3597 }
3599 }
3600 }
3601 if (OP2_TYPE == IS_CONST) {
3602 function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3603 }
3604 zend_invalid_method_call(object, function_name);
3605 FREE_OP2();
3606 FREE_OP1();
3608 }
3609 } while (0);
3610 }
3611
3612 called_scope = obj->ce;
3613
3614 if (OP2_TYPE == IS_CONST &&
3615 EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
3616 fbc = CACHED_PTR(opline->result.num + sizeof(void*));
3617 } else {
3618 zend_object *orig_obj = obj;
3619
3620 if (OP2_TYPE == IS_CONST) {
3621 function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3622 }
3623
3624 /* First, locate the function. */
3625 fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
3626 if (UNEXPECTED(fbc == NULL)) {
3627 if (EXPECTED(!EG(exception))) {
3628 zend_undefined_method(orig_obj->ce, Z_STR_P(function_name));
3629 }
3630 FREE_OP2();
3631 if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
3632 zend_objects_store_del(orig_obj);
3633 }
3635 }
3636 if (OP2_TYPE == IS_CONST &&
3638 EXPECTED(obj == orig_obj)) {
3639 CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
3640 }
3641 if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
3642 GC_ADDREF(obj); /* For $this pointer */
3643 if (GC_DELREF(orig_obj) == 0) {
3644 zend_objects_store_del(orig_obj);
3645 }
3646 }
3647 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3648 init_func_run_time_cache(&fbc->op_array);
3649 }
3650 }
3651
3652 if (OP2_TYPE != IS_CONST) {
3653 FREE_OP2();
3654 }
3655
3657 if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
3658 if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
3660 if (UNEXPECTED(EG(exception))) {
3662 }
3663 }
3664 /* call static method */
3665 obj = (zend_object*)called_scope;
3667 } else if (OP1_TYPE & (IS_VAR|IS_TMP_VAR|IS_CV)) {
3668 if (OP1_TYPE == IS_CV) {
3669 GC_ADDREF(obj); /* For $this pointer */
3670 }
3671 /* CV may be changed indirectly (e.g. when it's a reference) */
3673 }
3674
3675 call = zend_vm_stack_push_call_frame(call_info,
3676 fbc, opline->extended_value, obj);
3677 call->prev_execute_data = EX(call);
3678 EX(call) = call;
3679
3681}
3682
3683ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM|CACHE_SLOT)
3684{
3686 zval *function_name;
3687 zend_class_entry *ce;
3688 uint32_t call_info;
3691
3692 SAVE_OPLINE();
3693
3694 if (OP1_TYPE == IS_CONST) {
3695 /* no function found. try a static method in class */
3696 ce = CACHED_PTR(opline->result.num);
3697 if (UNEXPECTED(ce == NULL)) {
3699 if (UNEXPECTED(ce == NULL)) {
3700 FREE_OP2();
3702 }
3703 if (OP2_TYPE != IS_CONST) {
3704 CACHE_PTR(opline->result.num, ce);
3705 }
3706 }
3707 } else if (OP1_TYPE == IS_UNUSED) {
3708 ce = zend_fetch_class(NULL, opline->op1.num);
3709 if (UNEXPECTED(ce == NULL)) {
3710 FREE_OP2();
3712 }
3713 } else {
3714 ce = Z_CE_P(EX_VAR(opline->op1.var));
3715 }
3716
3717 if (OP1_TYPE == IS_CONST &&
3718 OP2_TYPE == IS_CONST &&
3719 EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
3720 /* nothing to do */
3721 } else if (OP1_TYPE != IS_CONST &&
3722 OP2_TYPE == IS_CONST &&
3723 EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
3724 fbc = CACHED_PTR(opline->result.num + sizeof(void*));
3725 } else if (OP2_TYPE != IS_UNUSED) {
3726 function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3727 if (OP2_TYPE != IS_CONST) {
3728 if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
3729 do {
3730 if (OP2_TYPE & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
3731 function_name = Z_REFVAL_P(function_name);
3732 if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
3733 break;
3734 }
3735 } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
3737 if (UNEXPECTED(EG(exception) != NULL)) {
3739 }
3740 }
3741 zend_throw_error(NULL, "Method name must be a string");
3742 FREE_OP2();
3744 } while (0);
3745 }
3746 }
3747
3748 if (ce->get_static_method) {
3749 fbc = ce->get_static_method(ce, Z_STR_P(function_name));
3750 } else {
3751 fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
3752 }
3753 if (UNEXPECTED(fbc == NULL)) {
3754 if (EXPECTED(!EG(exception))) {
3755 zend_undefined_method(ce, Z_STR_P(function_name));
3756 }
3757 FREE_OP2();
3759 }
3760 if (OP2_TYPE == IS_CONST &&
3762 EXPECTED(!(fbc->common.scope->ce_flags & ZEND_ACC_TRAIT))) {
3763 CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
3764 }
3765 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3766 init_func_run_time_cache(&fbc->op_array);
3767 }
3768 if (OP2_TYPE != IS_CONST) {
3769 FREE_OP2();
3770 }
3771 } else {
3772 if (UNEXPECTED(ce->constructor == NULL)) {
3773 zend_throw_error(NULL, "Cannot call constructor");
3775 }
3776 if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
3777 zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
3779 }
3780 fbc = ce->constructor;
3781 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3782 init_func_run_time_cache(&fbc->op_array);
3783 }
3784 }
3785
3786 if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
3787 if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
3788 ce = (zend_class_entry*)Z_OBJ(EX(This));
3790 } else {
3791 zend_non_static_method_call(fbc);
3793 }
3794 } else {
3795 /* previous opcode is ZEND_FETCH_CLASS */
3796 if (OP1_TYPE == IS_UNUSED
3797 && ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
3798 (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF)) {
3799 if (Z_TYPE(EX(This)) == IS_OBJECT) {
3800 ce = Z_OBJCE(EX(This));
3801 } else {
3802 ce = Z_CE(EX(This));
3803 }
3804 }
3806 }
3807
3808 call = zend_vm_stack_push_call_frame(call_info,
3809 fbc, opline->extended_value, ce);
3810 call->prev_execute_data = EX(call);
3811 EX(call) = call;
3812
3814}
3815
3817{
3820 zval *function_name, *func;
3822
3823 fbc = CACHED_PTR(opline->result.num);
3824 if (UNEXPECTED(fbc == NULL)) {
3825 function_name = (zval*)RT_CONSTANT(opline, opline->op2);
3826 func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(function_name+1));
3827 if (UNEXPECTED(func == NULL)) {
3828 ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
3829 }
3830 fbc = Z_FUNC_P(func);
3831 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3832 init_func_run_time_cache(&fbc->op_array);
3833 }
3834 CACHE_PTR(opline->result.num, fbc);
3835 }
3837 fbc, opline->extended_value, NULL);
3838 call->prev_execute_data = EX(call);
3839 EX(call) = call;
3840
3842}
3843
3845{
3847 zval *function_name;
3849
3850 SAVE_OPLINE();
3851 function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
3852
3853ZEND_VM_C_LABEL(try_function_name):
3854 if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
3855 call = zend_init_dynamic_call_string(Z_STR_P(function_name), opline->extended_value);
3856 } else if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
3857 call = zend_init_dynamic_call_object(Z_OBJ_P(function_name), opline->extended_value);
3858 } else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY)) {
3859 call = zend_init_dynamic_call_array(Z_ARRVAL_P(function_name), opline->extended_value);
3860 } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
3861 function_name = Z_REFVAL_P(function_name);
3862 ZEND_VM_C_GOTO(try_function_name);
3863 } else {
3864 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
3865 function_name = ZVAL_UNDEFINED_OP2();
3866 if (UNEXPECTED(EG(exception) != NULL)) {
3868 }
3869 }
3870 zend_throw_error(NULL, "Value of type %s is not callable",
3871 zend_zval_type_name(function_name));
3872 call = NULL;
3873 }
3874
3875 if (OP2_TYPE & (IS_VAR|IS_TMP_VAR)) {
3876 FREE_OP2();
3877 if (UNEXPECTED(EG(exception))) {
3878 if (call) {
3879 if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
3880 zend_string_release_ex(call->func->common.function_name, 0);
3882 }
3884 }
3886 }
3887 } else if (!call) {
3889 }
3890
3891 call->prev_execute_data = EX(call);
3892 EX(call) = call;
3893
3895}
3896
3898{
3900 zval *function_name;
3902 char *error = NULL;
3904 void *object_or_called_scope;
3907
3908 SAVE_OPLINE();
3909 function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
3910 if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
3912
3913 /* Deprecation can be emitted from zend_is_callable_ex(), which can
3914 * invoke a user error handler and throw an exception.
3915 * For the CONST and CV case we reuse the same exception block below
3916 * to make sure we don't increase VM size too much. */
3917 if (!(OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
3918 FREE_OP2();
3920 }
3921
3922 func = fcc.function_handler;
3923 object_or_called_scope = fcc.called_scope;
3924 if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
3925 /* Delay closure destruction until its invocation */
3928 if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
3930 }
3931 if (fcc.object) {
3932 object_or_called_scope = fcc.object;
3934 }
3935 } else if (fcc.object) {
3936 GC_ADDREF(fcc.object); /* For $this pointer */
3937 object_or_called_scope = fcc.object;
3939 }
3940
3941 FREE_OP2();
3942 if ((OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
3944 zend_object_release(ZEND_CLOSURE_OBJECT(func));
3945 } else if (call_info & ZEND_CALL_RELEASE_THIS) {
3946 zend_object_release(fcc.object);
3947 }
3949 }
3950
3951 if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
3952 init_func_run_time_cache(&func->op_array);
3953 }
3954 } else {
3955 zend_type_error("%s(): Argument #1 ($callback) must be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
3956 efree(error);
3957 FREE_OP2();
3959 }
3960
3961 call = zend_vm_stack_push_call_frame(call_info,
3962 func, opline->extended_value, object_or_called_scope);
3963 call->prev_execute_data = EX(call);
3964 EX(call) = call;
3965
3967}
3968
3970{
3972 zval *func_name;
3973 zval *func;
3976
3977 fbc = CACHED_PTR(opline->result.num);
3978 if (UNEXPECTED(fbc == NULL)) {
3979 func_name = (zval *)RT_CONSTANT(opline, opline->op2);
3980 func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(func_name + 1));
3981 if (func == NULL) {
3982 func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(func_name + 2));
3983 if (UNEXPECTED(func == NULL)) {
3984 ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
3985 }
3986 }
3987 fbc = Z_FUNC_P(func);
3988 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3989 init_func_run_time_cache(&fbc->op_array);
3990 }
3991 CACHE_PTR(opline->result.num, fbc);
3992 }
3993
3995 fbc, opline->extended_value, NULL);
3996 call->prev_execute_data = EX(call);
3997 EX(call) = call;
3998
4000}
4001
4003{
4005 zval *fname;
4006 zval *func;
4009
4010 fbc = CACHED_PTR(opline->result.num);
4011 if (UNEXPECTED(fbc == NULL)) {
4012 fname = (zval*)RT_CONSTANT(opline, opline->op2);
4013 func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(fname));
4014 ZEND_ASSERT(func != NULL && "Function existence must be checked at compile time");
4015 fbc = Z_FUNC_P(func);
4016 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
4017 init_func_run_time_cache(&fbc->op_array);
4018 }
4019 CACHE_PTR(opline->result.num, fbc);
4020 }
4021
4023 opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
4024 fbc, opline->extended_value, NULL);
4025 call->prev_execute_data = EX(call);
4026 EX(call) = call;
4027
4029}
4030
4031ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_EXTRA_P(RT_CONSTANT(op, op->op2)) != 0, ZEND_INIT_FCALL_OFFSET, NUM, CONST, NUM|CACHE_SLOT)
4032{
4036 fbc = CACHED_PTR(opline->result.num);
4037 if (UNEXPECTED(fbc == NULL)) {
4038 fbc = Z_PTR(EG(function_table)->arData[Z_EXTRA_P(RT_CONSTANT(opline, opline->op2))].val);
4039 CACHE_PTR(opline->result.num, fbc);
4040 }
4042 opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
4043 fbc, opline->extended_value, NULL);
4044 call->prev_execute_data = EX(call);
4045 EX(call) = call;
4047}
4048
4049ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
4050{
4056
4057 SAVE_OPLINE();
4058 EX(call) = call->prev_execute_data;
4059
4060 call->prev_execute_data = execute_data;
4061 EG(current_execute_data) = call;
4062
4063#if ZEND_DEBUG
4064 bool should_throw = zend_internal_call_should_throw(fbc, call);
4065#endif
4066
4067 ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
4069
4071 fbc->internal_function.handler(call, ret);
4072
4073#if ZEND_DEBUG
4074 if (!EG(exception) && call->func) {
4075 if (should_throw) {
4076 zend_internal_call_arginfo_violation(call->func);
4077 }
4078 ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
4079 zend_verify_internal_return_type(call->func, ret));
4080 ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
4081 ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
4082 zend_verify_internal_func_info(call->func, ret);
4083 }
4084#endif
4087
4088 EG(current_execute_data) = execute_data;
4090
4094 zend_free_extra_named_params(call->extra_named_params);
4095 }
4096 zend_vm_stack_free_call_frame_ex(call_info, call);
4097 } else {
4098 EG(vm_stack_top) = (zval*)call;
4099 }
4100
4101 if (!RETURN_VALUE_USED(opline)) {
4102 i_zval_ptr_dtor(ret);
4103 }
4104
4106 zend_rethrow_exception(execute_data);
4108 }
4109
4112}
4113
4114ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
4115{
4118 zend_function *fbc = call->func;
4119 zval *ret;
4120
4121 SAVE_OPLINE();
4122 EX(call) = call->prev_execute_data;
4123
4124 ret = NULL;
4125 if (RETURN_VALUE_USED(opline)) {
4126 ret = EX_VAR(opline->result.var);
4127 }
4128
4129 call->prev_execute_data = execute_data;
4131 i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
4135
4137}
4138
4139ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
4140{
4143 zend_function *fbc = call->func;
4144 zval *ret;
4145 zval retval;
4146
4147 SAVE_OPLINE();
4148 EX(call) = call->prev_execute_data;
4149
4150 if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
4152 if (UNEXPECTED(EG(exception) != NULL)) {
4153 UNDEF_RESULT();
4154 if (!RETURN_VALUE_USED(opline)) {
4155 ret = &retval;
4156 ZVAL_UNDEF(ret);
4157 }
4158 ZEND_VM_C_GOTO(fcall_by_name_end);
4159 }
4160 }
4161
4163 ret = NULL;
4164 if (RETURN_VALUE_USED(opline)) {
4165 ret = EX_VAR(opline->result.var);
4166 }
4167
4168 call->prev_execute_data = execute_data;
4170 i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
4174
4176 } else {
4179 ret = NULL;
4180 }
4181
4182 call->prev_execute_data = execute_data;
4183 EG(current_execute_data) = call;
4184
4185#if ZEND_DEBUG
4186 bool should_throw = zend_internal_call_should_throw(fbc, call);
4187#endif
4188
4189 ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
4190 ZVAL_NULL(ret);
4191
4193 fbc->internal_function.handler(call, ret);
4194
4195#if ZEND_DEBUG
4196 if (!EG(exception) && call->func) {
4197 if (should_throw) {
4198 zend_internal_call_arginfo_violation(call->func);
4199 }
4200 ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
4201 zend_verify_internal_return_type(call->func, ret));
4202 ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
4203 ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
4204 zend_verify_internal_func_info(call->func, ret);
4205 }
4206#endif
4209
4210 EG(current_execute_data) = execute_data;
4211
4212 ZEND_VM_C_GOTO(fcall_by_name_end);
4213 }
4214
4215 if (0) {
4216ZEND_VM_C_LABEL(fcall_by_name_end):
4217
4219
4220 uint32_t call_info = ZEND_CALL_INFO(call);
4223 zend_free_extra_named_params(call->extra_named_params);
4224 }
4225 zend_vm_stack_free_call_frame_ex(call_info, call);
4226 } else {
4227 EG(vm_stack_top) = (zval*)call;
4228 }
4229
4230 if (!RETURN_VALUE_USED(opline)) {
4231 i_zval_ptr_dtor(ret);
4232 }
4233 }
4234
4235 if (UNEXPECTED(EG(exception) != NULL)) {
4236 zend_rethrow_exception(execute_data);
4238 }
4241}
4242
4243ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
4244{
4247 zend_function *fbc = call->func;
4248 zval *ret;
4249 zval retval;
4250
4251 SAVE_OPLINE();
4252 EX(call) = call->prev_execute_data;
4253
4254 if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
4256 if (UNEXPECTED(EG(exception) != NULL)) {
4259 }
4260 UNDEF_RESULT();
4261 if (!RETURN_VALUE_USED(opline)) {
4262 ret = &retval;
4263 ZVAL_UNDEF(ret);
4264 }
4265 ZEND_VM_C_GOTO(fcall_end);
4266 }
4267 }
4268
4269 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
4270 ret = NULL;
4271 if (RETURN_VALUE_USED(opline)) {
4272 ret = EX_VAR(opline->result.var);
4273 }
4274
4275 call->prev_execute_data = execute_data;
4277 i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
4278
4284 } else {
4288 LOAD_OPLINE();
4291 }
4292 } else {
4295 ret = NULL;
4296 }
4297
4298 call->prev_execute_data = execute_data;
4299 EG(current_execute_data) = call;
4300
4301#if ZEND_DEBUG
4302 bool should_throw = zend_internal_call_should_throw(fbc, call);
4303#endif
4304
4305 ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
4306 ZVAL_NULL(ret);
4307
4310 /* saves one function call if zend_execute_internal is not used */
4311 fbc->internal_function.handler(call, ret);
4312 } else {
4314 }
4315
4316#if ZEND_DEBUG
4317 if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
4318 if (should_throw) {
4319 zend_internal_call_arginfo_violation(call->func);
4320 }
4321 ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
4322 zend_verify_internal_return_type(call->func, ret));
4323 ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
4324 ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
4325 zend_verify_internal_func_info(call->func, ret);
4326 }
4327#endif
4330
4331 EG(current_execute_data) = execute_data;
4332
4333 ZEND_VM_C_GOTO(fcall_end);
4334 }
4335
4336 if (0) {
4337ZEND_VM_C_LABEL(fcall_end):
4338
4339 zend_vm_stack_free_args(call);
4341 zend_free_extra_named_params(call->extra_named_params);
4342 }
4343
4344 if (!RETURN_VALUE_USED(opline)) {
4345 i_zval_ptr_dtor(ret);
4346 }
4347 }
4348
4352
4354 if (UNEXPECTED(EG(exception) != NULL)) {
4355 zend_rethrow_exception(execute_data);
4357 }
4360}
4361
4363{
4364 if (OP1_TYPE == IS_UNUSED) {
4365 SAVE_OPLINE();
4366 zend_verify_missing_return_type(EX(func));
4368 } else {
4369/* prevents "undefined variable opline" errors */
4370#if !ZEND_VM_SPEC || (OP1_TYPE != IS_UNUSED)
4372 zval *retval_ref, *retval_ptr;
4373 zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
4374 retval_ref = retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
4375
4376 if (OP1_TYPE == IS_CONST) {
4377 ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
4378 retval_ref = retval_ptr = EX_VAR(opline->result.var);
4379 } else if (OP1_TYPE == IS_VAR) {
4381 retval_ref = retval_ptr = Z_INDIRECT_P(retval_ptr);
4382 }
4384 } else if (OP1_TYPE == IS_CV) {
4386 }
4387
4390 }
4391
4392 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
4393 SAVE_OPLINE();
4394 retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
4395 if (UNEXPECTED(EG(exception))) {
4397 }
4398 if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
4400 }
4401 }
4402
4403 zend_reference *ref = NULL;
4404 void *cache_slot = CACHE_ADDR(opline->op2.num);
4405 if (UNEXPECTED(retval_ref != retval_ptr)) {
4406 if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
4407 ref = Z_REF_P(retval_ref);
4408 } else {
4409 /* A cast might happen - unwrap the reference if this is a by-value return */
4410 if (Z_REFCOUNT_P(retval_ref) == 1) {
4411 ZVAL_UNREF(retval_ref);
4412 } else {
4413 Z_DELREF_P(retval_ref);
4414 ZVAL_COPY(retval_ref, retval_ptr);
4415 }
4416 retval_ptr = retval_ref;
4417 }
4418 }
4419
4420 SAVE_OPLINE();
4421 if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, 1, 0))) {
4424 }
4426#endif
4427 }
4428}
4429
4436
4437ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4438{
4443
4444 retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
4447 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
4448 SAVE_OPLINE();
4450 if (return_value) {
4452 }
4453 } else if (!return_value) {
4454 if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
4456 SAVE_OPLINE();
4458 }
4459 }
4460 } else {
4461 if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
4463 if (OP1_TYPE == IS_CONST) {
4466 }
4467 }
4468 } else if (OP1_TYPE == IS_CV) {
4469 do {
4475 if (GC_MAY_LEAK(ref)) {
4476 SAVE_OPLINE();
4477 gc_possible_root(ref);
4478 }
4480 break;
4481 } else {
4483 }
4484 } else {
4488 }
4489 }
4490 }
4492 } while (0);
4493 } else /* if (OP1_TYPE == IS_VAR) */ {
4496
4499 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
4500 efree_size(ref, sizeof(zend_reference));
4501 } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
4503 }
4504 } else {
4506 }
4507 }
4508 }
4512 ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
4513}
4514
4515ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, SPEC(OBSERVER))
4516{
4521
4522 SAVE_OPLINE();
4523
4526 do {
4527 if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR)) ||
4528 (OP1_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
4529 /* Not supposed to happen, but we'll allow it */
4530 zend_error(E_NOTICE, "Only variable references should be returned by reference");
4531
4532 retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4533 if (!return_value) {
4534 FREE_OP1();
4535 } else {
4536 if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
4538 break;
4539 }
4540
4542 if (OP1_TYPE == IS_CONST) {
4544 }
4545 }
4546 break;
4547 }
4548
4549 retval_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
4550
4551 if (OP1_TYPE == IS_VAR) {
4552 ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
4553 if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
4554 zend_error(E_NOTICE, "Only variable references should be returned by reference");
4555 if (return_value) {
4557 } else {
4558 FREE_OP1();
4559 }
4560 break;
4561 }
4562 }
4563
4565 if (Z_ISREF_P(retval_ptr)) {
4567 } else {
4569 }
4571 }
4572
4573 FREE_OP1();
4574 } while (0);
4575
4578 ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
4579}
4580
4582{
4584
4585 if (EXPECTED(return_value)) {
4588 zend_execute_data *gen_execute_data;
4589 uint32_t num_args, used_stack, call_info;
4590
4591 SAVE_OPLINE();
4593
4594 /*
4595 * Normally the execute_data is allocated on the VM stack (because it does
4596 * not actually do any allocation and thus is faster). For generators
4597 * though this behavior would be suboptimal, because the (rather large)
4598 * structure would have to be copied back and forth every time execution is
4599 * suspended or resumed. That's why for generators the execution context
4600 * is allocated on heap.
4601 */
4603 if (EXPECTED(num_args <= EX(func)->op_array.num_args)) {
4604 used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
4605 gen_execute_data = (zend_execute_data*)emalloc(used_stack);
4606 used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
4607 } else {
4608 used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
4609 gen_execute_data = (zend_execute_data*)emalloc(used_stack);
4610 }
4611 memcpy(gen_execute_data, execute_data, used_stack);
4612
4613 /* Save execution context in generator object. */
4615 generator->func = gen_execute_data->func;
4616 generator->execute_data = gen_execute_data;
4617 generator->frozen_call_stack = NULL;
4618 generator->execute_fake.opline = NULL;
4619 generator->execute_fake.func = NULL;
4620 generator->execute_fake.prev_execute_data = NULL;
4621 ZVAL_OBJ(&generator->execute_fake.This, (zend_object *) generator);
4622
4623 gen_execute_data->opline = opline;
4624 /* EX(return_value) keeps pointer to zend_object (not a real zval) */
4625 gen_execute_data->return_value = (zval*)generator;
4626 call_info = Z_TYPE_INFO(EX(This));
4629 /* Bug #72523 */
4632 Z_ADDREF(gen_execute_data->This);
4633 }
4635 Z_TYPE_INFO(gen_execute_data->This) = call_info;
4636 gen_execute_data->prev_execute_data = NULL;
4637
4639 EG(current_execute_data) = EX(prev_execute_data);
4641 EG(vm_stack_top) = (zval*)execute_data;
4644 ZEND_VM_LEAVE();
4645 } else if (EXPECTED(!(call_info & ZEND_CALL_TOP))) {
4646 zend_execute_data *old_execute_data = execute_data;
4648 zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
4650 ZEND_VM_LEAVE();
4651 } else {
4653 }
4654 } else {
4655 ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
4656 }
4657}
4658
4659ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4660{
4662 zval *retval;
4663
4664 zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
4665
4666 SAVE_OPLINE();
4667 retval = GET_OP1_ZVAL_PTR(BP_VAR_R);
4668
4669 /* Copy return value into generator->retval */
4670 if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
4671 ZVAL_COPY_VALUE(&generator->retval, retval);
4672 if (OP1_TYPE == IS_CONST) {
4673 if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
4674 Z_ADDREF(generator->retval);
4675 }
4676 }
4677 } else if (OP1_TYPE == IS_CV) {
4678 ZVAL_COPY_DEREF(&generator->retval, retval);
4679 } else /* if (OP1_TYPE == IS_VAR) */ {
4680 if (UNEXPECTED(Z_ISREF_P(retval))) {
4682
4684 ZVAL_COPY_VALUE(&generator->retval, retval);
4685 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
4686 efree_size(ref, sizeof(zend_reference));
4687 } else if (Z_OPT_REFCOUNTED_P(retval)) {
4689 }
4690 } else {
4691 ZVAL_COPY_VALUE(&generator->retval, retval);
4692 }
4693 }
4694
4695 ZEND_OBSERVER_FCALL_END(generator->execute_data, &generator->retval);
4696
4697 EG(current_execute_data) = EX(prev_execute_data);
4698
4699 /* Close the generator to free up resources */
4701
4702 /* Pass execution back to handling code */
4704}
4705
4707{
4709 zval *value;
4710
4711 SAVE_OPLINE();
4712 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
4713
4714 do {
4715 if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
4716 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
4718 if (EXPECTED(Z_TYPE_P(value) == IS_OBJECT)) {
4719 break;
4720 }
4721 }
4722 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
4724 if (UNEXPECTED(EG(exception) != NULL)) {
4726 }
4727 }
4728 zend_throw_error(NULL, "Can only throw objects");
4729 FREE_OP1();
4731 }
4732 } while (0);
4733
4738 FREE_OP1();
4740}
4741
4742ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
4743{
4745 zend_class_entry *ce, *catch_ce;
4747
4748 SAVE_OPLINE();
4749 /* Check whether an exception has been thrown, if not, jump over code */
4751 if (EG(exception) == NULL) {
4752 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
4753 }
4754 catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
4755 if (UNEXPECTED(catch_ce == NULL)) {
4756 catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
4757
4758 CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
4759 }
4760 ce = EG(exception)->ce;
4761
4762#ifdef HAVE_DTRACE
4763 if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
4764 DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
4765 }
4766#endif /* HAVE_DTRACE */
4767
4768 if (ce != catch_ce) {
4769 if (!catch_ce || !instanceof_function(ce, catch_ce)) {
4770 if (opline->extended_value & ZEND_LAST_CATCH) {
4771 zend_rethrow_exception(execute_data);
4773 }
4774 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
4775 }
4776 }
4777
4779 EG(exception) = NULL;
4780 if (RETURN_VALUE_USED(opline)) {
4781 /* Always perform a strict assignment. There is a reasonable expectation that if you
4782 * write "catch (Exception $e)" then $e will actually be instanceof Exception. As such,
4783 * we should not permit coercion to string here. */
4784 zval tmp;
4785 ZVAL_OBJ(&tmp, exception);
4786 zend_assign_to_variable(EX_VAR(opline->result.var), &tmp, IS_TMP_VAR, /* strict */ 1);
4787 } else {
4789 }
4791}
4792
4794{
4796 zval *value, *arg;
4797
4798 if (OP2_TYPE == IS_CONST) {
4799 SAVE_OPLINE();
4800 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4801 uint32_t arg_num;
4802 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4803 if (UNEXPECTED(!arg)) {
4804 FREE_OP1();
4806 }
4807 } else {
4808 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
4809 }
4810
4811 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
4813 if (OP1_TYPE == IS_CONST) {
4815 Z_ADDREF_P(arg);
4816 }
4817 }
4819}
4820
4821ZEND_VM_COLD_HELPER(zend_cannot_pass_by_ref_helper, ANY, ANY, uint32_t _arg_num, zval *_arg)
4822{
4824
4825 SAVE_OPLINE();
4826
4828 FREE_OP1();
4829 ZVAL_UNDEF(_arg);
4831}
4832
4833ZEND_VM_HOT_SEND_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, CONST|UNUSED|NUM, SPEC(QUICK_ARG))
4834{
4836 zval *value, *arg;
4837 uint32_t arg_num;
4838
4839 if (OP2_TYPE == IS_CONST) {
4840 SAVE_OPLINE();
4841 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4842 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4843 if (UNEXPECTED(!arg)) {
4844 FREE_OP1();
4846 }
4847 } else {
4848 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
4849 arg_num = opline->op2.num;
4850 }
4851
4857ZEND_VM_C_LABEL(send_val_by_ref):
4858 ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper, _arg_num, arg_num, _arg, arg);
4859 }
4860 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
4862 if (OP1_TYPE == IS_CONST) {
4864 Z_ADDREF_P(arg);
4865 }
4866 }
4868}
4869
4871{
4873 zval *varptr, *arg;
4874
4875 if (OP2_TYPE == IS_CONST) {
4876 SAVE_OPLINE();
4877 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4878 uint32_t arg_num;
4879 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4880 if (UNEXPECTED(!arg)) {
4881 FREE_OP1();
4883 }
4884 } else {
4885 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
4886 }
4887
4888 varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
4889 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
4890 SAVE_OPLINE();
4892 ZVAL_NULL(arg);
4894 }
4895
4896 if (OP1_TYPE == IS_CV) {
4898 } else /* if (OP1_TYPE == IS_VAR) */ {
4899 if (UNEXPECTED(Z_ISREF_P(varptr))) {
4901
4904 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
4905 efree_size(ref, sizeof(zend_reference));
4906 } else if (Z_OPT_REFCOUNTED_P(arg)) {
4907 Z_ADDREF_P(arg);
4908 }
4909 } else {
4911 }
4912 }
4913
4915}
4916
4918{
4920 zval *varptr, *arg;
4921
4922 if (OP2_TYPE == IS_CONST) {
4923 SAVE_OPLINE();
4924 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4925 uint32_t arg_num;
4926 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4927 if (UNEXPECTED(!arg)) {
4928 FREE_OP1();
4930 }
4931 } else {
4932 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
4933 }
4934
4935 varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4937
4938 if (EXPECTED(Z_ISREF_P(varptr))) {
4940 }
4941
4942 SAVE_OPLINE();
4944 zend_error(E_NOTICE, "Only variables should be passed by reference");
4946}
4947
4948ZEND_VM_HOT_SEND_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, CONST|UNUSED|NUM, SPEC(QUICK_ARG))
4949{
4951 zval *varptr, *arg;
4952 uint32_t arg_num;
4953
4954 if (OP2_TYPE == IS_CONST) {
4955 SAVE_OPLINE();
4956 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4957 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4958 if (UNEXPECTED(!arg)) {
4959 FREE_OP1();
4961 }
4962 } else {
4963 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
4964 arg_num = opline->op2.num;
4965 }
4966
4969 ZEND_VM_C_GOTO(send_var);
4970 }
4971
4972 varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4974
4975 if (EXPECTED(Z_ISREF_P(varptr) ||
4978 }
4979 } else {
4981 ZEND_VM_C_GOTO(send_var);
4982 }
4983
4984 varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4986
4991 }
4992
4993 SAVE_OPLINE();
4995 zend_error(E_NOTICE, "Only variables should be passed by reference");
4997
4998ZEND_VM_C_LABEL(send_var):
4999 varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
5002
5005 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
5006 efree_size(ref, sizeof(zend_reference));
5007 } else if (Z_OPT_REFCOUNTED_P(arg)) {
5008 Z_ADDREF_P(arg);
5009 }
5010 } else {
5012 }
5014}
5015
5017{
5019 zval *varptr, *arg;
5020
5021 SAVE_OPLINE();
5022 if (OP2_TYPE == IS_CONST) {
5023 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
5024 uint32_t arg_num;
5025 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
5026 if (UNEXPECTED(!arg)) {
5027 FREE_OP1();
5029 }
5030 } else {
5031 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
5032 }
5033
5034 varptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
5035 if (Z_ISREF_P(varptr)) {
5037 } else {
5039 }
5041
5042 FREE_OP1();
5044}
5045
5046ZEND_VM_HOT_SEND_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, CONST|UNUSED|NUM, SPEC(QUICK_ARG))
5047{
5049 zval *varptr, *arg;
5050 uint32_t arg_num;
5051
5052 if (OP2_TYPE == IS_CONST) {
5053 SAVE_OPLINE();
5054 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
5055 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
5056 if (UNEXPECTED(!arg)) {
5057 FREE_OP1();
5059 }
5060 } else {
5061 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
5062 arg_num = opline->op2.num;
5063 }
5064
5067 ZEND_VM_C_GOTO(send_var_by_ref);
5068 }
5070ZEND_VM_C_LABEL(send_var_by_ref):
5071 varptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
5072 if (Z_ISREF_P(varptr)) {
5074 } else {
5076 }
5078
5079 FREE_OP1();
5081 }
5082
5083 varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
5084 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
5085 SAVE_OPLINE();
5087 ZVAL_NULL(arg);
5089 }
5090
5091 if (OP1_TYPE == IS_CV) {
5093 } else /* if (OP1_TYPE == IS_VAR) */ {
5094 if (UNEXPECTED(Z_ISREF_P(varptr))) {
5096
5099 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
5100 efree_size(ref, sizeof(zend_reference));
5101 } else if (Z_OPT_REFCOUNTED_P(arg)) {
5102 Z_ADDREF_P(arg);
5103 }
5104 } else {
5106 }
5107 }
5108
5110}
5111
5112ZEND_VM_HOT_SEND_HANDLER(100, ZEND_CHECK_FUNC_ARG, UNUSED, CONST|UNUSED|NUM, SPEC(QUICK_ARG))
5113{
5115 uint32_t arg_num;
5116
5117 if (OP2_TYPE == IS_CONST) {
5118 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
5119 arg_num = zend_get_arg_offset_by_name(
5120 EX(call)->func, arg_name, CACHE_ADDR(opline->result.num)) + 1;
5121 if (UNEXPECTED(arg_num == 0)) {
5122 /* Treat this as a by-value argument, and throw an error during SEND. */
5125 }
5126 } else {
5127 arg_num = opline->op2.num;
5128 }
5129
5133 } else {
5135 }
5136 } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
5138 } else {
5140 }
5142}
5143
5145{
5147 zval *varptr, *arg;
5148
5149 if (OP2_TYPE == IS_CONST) {
5150 // TODO: Would it make sense to share the cache slot with CHECK_FUNC_ARG?
5151 SAVE_OPLINE();
5152 zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
5153 uint32_t arg_num;
5154 arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
5155 if (UNEXPECTED(!arg)) {
5156 FREE_OP1();
5158 }
5159 } else {
5160 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
5161 }
5162
5164 varptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
5165 if (Z_ISREF_P(varptr)) {
5167 } else {
5169 }
5171
5172 FREE_OP1();
5174 }
5175
5176 varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
5177
5178 if (UNEXPECTED(Z_ISREF_P(varptr))) {
5180
5183 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
5184 efree_size(ref, sizeof(zend_reference));
5185 } else if (Z_OPT_REFCOUNTED_P(arg)) {
5186 Z_ADDREF_P(arg);
5187 }
5188 } else {
5190 }
5191
5193}
5194
5196{
5198 zval *args;
5199 uint32_t arg_num;
5200
5201 SAVE_OPLINE();
5202 args = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
5204
5205ZEND_VM_C_LABEL(send_again):
5206 if (EXPECTED(Z_TYPE_P(args) == IS_ARRAY)) {
5208 zval *arg, *top;
5210 bool have_named_params = 0;
5211
5212 zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, zend_hash_num_elements(ht));
5213
5214 // TODO: Speed this up using a flag that specifies whether there are any ref parameters.
5215 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_REFCOUNT_P(args) > 1) {
5216 uint32_t tmp_arg_num = arg_num;
5217 bool separate = 0;
5218
5219 /* check if any of arguments are going to be passed by reference */
5221 if (UNEXPECTED(name)) {
5222 void *cache_slot[2] = {NULL, NULL};
5223 tmp_arg_num = zend_get_arg_offset_by_name(
5224 EX(call)->func, name, cache_slot) + 1;
5225 }
5226 if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, tmp_arg_num)) {
5227 separate = 1;
5228 break;
5229 }
5230 tmp_arg_num++;
5232 if (separate) {
5234 ht = Z_ARRVAL_P(args);
5235 }
5236 }
5237
5239 if (UNEXPECTED(name)) {
5240 void *cache_slot[2] = {NULL, NULL};
5241 have_named_params = 1;
5242 top = zend_handle_named_arg(&EX(call), name, &arg_num, cache_slot);
5243 if (UNEXPECTED(!top)) {
5244 FREE_OP1();
5246 }
5247 } else {
5248 if (have_named_params) {
5250 "Cannot use positional argument after named argument during unpacking");
5251 FREE_OP1();
5253 }
5254
5257 }
5258
5260 if (Z_ISREF_P(arg)) {
5261 Z_ADDREF_P(arg);
5263 } else if (OP1_TYPE & (IS_VAR|IS_CV)) {
5264 /* array is already separated above */
5267 } else {
5270 }
5271 } else {
5273 }
5274
5275 arg_num++;
5277
5278 } else if (EXPECTED(Z_TYPE_P(args) == IS_OBJECT)) {
5281 bool have_named_params = 0;
5282
5283 if (!ce || !ce->get_iterator) {
5284 zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
5285 } else {
5286
5287 iter = ce->get_iterator(ce, args, 0);
5288 if (UNEXPECTED(!iter)) {
5289 FREE_OP1();
5290 if (!EG(exception)) {
5292 NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name)
5293 );
5294 }
5296 }
5297
5298 const zend_object_iterator_funcs *funcs = iter->funcs;
5299 if (funcs->rewind) {
5300 funcs->rewind(iter);
5301 }
5302
5303 for (; funcs->valid(iter) == SUCCESS; ++arg_num) {
5304 zval *arg, *top;
5305
5306 if (UNEXPECTED(EG(exception) != NULL)) {
5307 break;
5308 }
5309
5310 arg = funcs->get_current_data(iter);
5311 if (UNEXPECTED(EG(exception) != NULL)) {
5312 break;
5313 }
5314
5316 if (funcs->get_current_key) {
5317 zval key;
5318 funcs->get_current_key(iter, &key);
5319 if (UNEXPECTED(EG(exception) != NULL)) {
5320 break;
5321 }
5322
5323 if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
5324 if (UNEXPECTED(Z_TYPE(key) != IS_STRING)) {
5326 "Keys must be of type int|string during argument unpacking");
5328 break;
5329 }
5330
5331 name = Z_STR_P(&key);
5332 }
5333 }
5334
5335 if (UNEXPECTED(name)) {
5336 void *cache_slot[2] = {NULL, NULL};
5337 have_named_params = 1;
5338 top = zend_handle_named_arg(&EX(call), name, &arg_num, cache_slot);
5339 if (UNEXPECTED(!top)) {
5340 zend_string_release(name);
5341 break;
5342 }
5343
5344 ZVAL_DEREF(arg);
5346
5348 zend_error(
5349 E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
5350 " by unpacking a Traversable, passing by-value instead", arg_num,
5351 EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
5352 EX(call)->func->common.scope ? "::" : "",
5353 ZSTR_VAL(EX(call)->func->common.function_name)
5354 );
5356 } else {
5358 }
5359
5360 zend_string_release(name);
5361 } else {
5362 if (have_named_params) {
5364 "Cannot use positional argument after named argument during unpacking");
5365 break;
5366 }
5367
5368 zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
5370 ZVAL_DEREF(arg);
5372
5374 zend_error(
5375 E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
5376 " by unpacking a Traversable, passing by-value instead", arg_num,
5377 EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
5378 EX(call)->func->common.scope ? "::" : "",
5379 ZSTR_VAL(EX(call)->func->common.function_name)
5380 );
5382 } else {
5384 }
5385
5387 }
5388
5389 funcs->move_forward(iter);
5390 }
5391
5392 zend_iterator_dtor(iter);
5393 }
5394 } else if (EXPECTED(Z_ISREF_P(args))) {
5395 args = Z_REFVAL_P(args);
5396 ZEND_VM_C_GOTO(send_again);
5397 } else {
5398 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
5400 }
5401 zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
5402 }
5403
5404 FREE_OP1();
5406}
5407
5409{
5411 zval *args;
5412
5413 SAVE_OPLINE();
5414 args = GET_OP1_ZVAL_PTR(BP_VAR_R);
5415
5416 if (UNEXPECTED(Z_TYPE_P(args) != IS_ARRAY)) {
5417 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(args)) {
5418 args = Z_REFVAL_P(args);
5419 if (EXPECTED(Z_TYPE_P(args) == IS_ARRAY)) {
5420 ZEND_VM_C_GOTO(send_array);
5421 }
5422 }
5423 zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_value_name(args));
5424 FREE_OP2();
5425 FREE_OP1();
5427 } else {
5428 uint32_t arg_num;
5429 HashTable *ht;
5430 zval *arg, *param;
5431
5432ZEND_VM_C_LABEL(send_array):
5433 ht = Z_ARRVAL_P(args);
5434 if (OP2_TYPE != IS_UNUSED) {
5435 /* We don't need to handle named params in this case,
5436 * because array_slice() is called with $preserve_keys == false. */
5437 zval *op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
5438 uint32_t skip = opline->extended_value;
5439 uint32_t count = zend_hash_num_elements(ht);
5440 zend_long len;
5441 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
5442 len = Z_LVAL_P(op2);
5443 } else if (Z_TYPE_P(op2) == IS_NULL) {
5444 len = count - skip;
5445 } else if (EX_USES_STRICT_TYPES()
5446 || !zend_parse_arg_long_weak(op2, &len, /* arg_num */ 3)) {
5448 "array_slice(): Argument #3 ($length) must be of type ?int, %s given",
5450 FREE_OP2();
5451 FREE_OP1();
5453 }
5454
5455 if (len < 0) {
5456 len += (zend_long)(count - skip);
5457 }
5458 if (skip < count && len > 0) {
5459 if (len > (zend_long)(count - skip)) {
5460 len = (zend_long)(count - skip);
5461 }
5462 zend_vm_stack_extend_call_frame(&EX(call), 0, len);
5463 arg_num = 1;
5464 param = ZEND_CALL_ARG(EX(call), 1);
5466 bool must_wrap = 0;
5467 if (skip > 0) {
5468 skip--;
5469 continue;
5470 } else if ((zend_long)(arg_num - 1) >= len) {
5471 break;
5472 } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
5473 if (UNEXPECTED(!Z_ISREF_P(arg))) {
5475 /* By-value send is not allowed -- emit a warning,
5476 * but still perform the call. */
5478 must_wrap = 1;
5479 }
5480 }
5481 } else {
5482 if (Z_ISREF_P(arg) &&
5483 !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
5484 /* don't separate references for __call */
5485 arg = Z_REFVAL_P(arg);
5486 }
5487 }
5488 if (EXPECTED(!must_wrap)) {
5489 ZVAL_COPY(param, arg);
5490 } else {
5492 ZVAL_NEW_REF(param, arg);
5493 }
5495 arg_num++;
5496 param++;
5498 }
5499 FREE_OP2();
5500 } else {
5502 bool have_named_params;
5503 zend_vm_stack_extend_call_frame(&EX(call), 0, zend_hash_num_elements(ht));
5504 arg_num = 1;
5505 param = ZEND_CALL_ARG(EX(call), 1);
5506 have_named_params = 0;
5508 if (name) {
5509 void *cache_slot[2] = {NULL, NULL};
5510 have_named_params = 1;
5511 param = zend_handle_named_arg(&EX(call), name, &arg_num, cache_slot);
5512 if (!param) {
5513 FREE_OP1();
5515 }
5516 } else if (have_named_params) {
5518 "Cannot use positional argument after named argument");
5519 FREE_OP1();
5521 }
5522
5523 bool must_wrap = 0;
5525 if (UNEXPECTED(!Z_ISREF_P(arg))) {
5527 /* By-value send is not allowed -- emit a warning,
5528 * but still perform the call. */
5530 must_wrap = 1;
5531 }
5532 }
5533 } else {
5534 if (Z_ISREF_P(arg) &&
5535 !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
5536 /* don't separate references for __call */
5537 arg = Z_REFVAL_P(arg);
5538 }
5539 }
5540
5541 if (EXPECTED(!must_wrap)) {
5542 ZVAL_COPY(param, arg);
5543 } else {
5545 ZVAL_NEW_REF(param, arg);
5546 }
5547 if (!name) {
5549 arg_num++;
5550 param++;
5551 }
5553 }
5554 }
5555 FREE_OP1();
5557}
5558
5560{
5562 zval *arg, *param;
5563
5564 SAVE_OPLINE();
5565
5566 arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
5567 param = ZEND_CALL_VAR(EX(call), opline->result.var);
5568 if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
5569 zend_param_must_be_ref(EX(call)->func, opline->op2.num);
5571 ZVAL_NEW_REF(param, arg);
5572 } else {
5573 ZVAL_COPY(param, arg);
5574 }
5575
5576 FREE_OP1();
5578}
5579
5593
5594ZEND_VM_COLD_HELPER(zend_missing_arg_helper, ANY, ANY)
5595{
5596#ifdef ZEND_VM_IP_GLOBAL_REG
5598
5599 SAVE_OPLINE();
5600#endif
5603}
5604
5605ZEND_VM_HELPER(zend_verify_recv_arg_type_helper, ANY, ANY, zval *op_1)
5606{
5608
5609 SAVE_OPLINE();
5610 if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), opline->op1.num, op_1, CACHE_ADDR(opline->extended_value)))) {
5612 }
5613
5615}
5616
5618{
5620 uint32_t arg_num = opline->op1.num;
5621 zval *param;
5622
5623 if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
5624 ZEND_VM_DISPATCH_TO_HELPER(zend_missing_arg_helper);
5625 }
5626
5627 param = EX_VAR(opline->result.var);
5628
5629 if (UNEXPECTED(!(opline->op2.num & (1u << Z_TYPE_P(param))))) {
5630 ZEND_VM_DISPATCH_TO_HELPER(zend_verify_recv_arg_type_helper, op_1, param);
5631 }
5632
5634}
5635
5636ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_RECV, op->op2.num == MAY_BE_ANY, ZEND_RECV_NOTYPE, NUM, NUM, CACHE_SLOT)
5637{
5639 uint32_t arg_num = opline->op1.num;
5640
5641 if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
5642 ZEND_VM_DISPATCH_TO_HELPER(zend_missing_arg_helper);
5643 }
5644
5646}
5647
5649{
5651 uint32_t arg_num;
5652 zval *param;
5653
5655
5656 arg_num = opline->op1.num;
5657 param = EX_VAR(opline->result.var);
5658 if (arg_num > EX_NUM_ARGS()) {
5659 zval *default_value = RT_CONSTANT(opline, opline->op2);
5660
5661 if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
5662 zval *cache_val = (zval*)CACHE_ADDR(Z_CACHE_SLOT_P(default_value));
5663
5664 /* we keep in cache only not refcounted values */
5665 if (Z_TYPE_P(cache_val) != IS_UNDEF) {
5666 ZVAL_COPY_VALUE(param, cache_val);
5667 } else {
5668 SAVE_OPLINE();
5669 ZVAL_COPY(param, default_value);
5670 zend_ast_evaluate_ctx ctx = {0};
5671 if (UNEXPECTED(zval_update_constant_with_ctx(param, EX(func)->op_array.scope, &ctx) != SUCCESS)) {
5672 zval_ptr_dtor_nogc(param);
5673 ZVAL_UNDEF(param);
5675 }
5676 if (!Z_REFCOUNTED_P(param) && !ctx.had_side_effects) {
5677 ZVAL_COPY_VALUE(cache_val, param);
5678 }
5679 }
5680 ZEND_VM_C_GOTO(recv_init_check_type);
5681 } else {
5682 ZVAL_COPY(param, default_value);
5683 }
5684 } else {
5685ZEND_VM_C_LABEL(recv_init_check_type):
5686 if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0) {
5687 SAVE_OPLINE();
5688 if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
5690 }
5691 }
5692 }
5693
5696}
5697
5699{
5701 uint32_t arg_num = opline->op1.num;
5702 uint32_t arg_count = EX_NUM_ARGS();
5703 zval *params;
5704
5705 SAVE_OPLINE();
5706
5707 params = EX_VAR(opline->result.var);
5708
5709 if (arg_num <= arg_count) {
5710 ZEND_ASSERT(EX(func)->common.fn_flags & ZEND_ACC_VARIADIC);
5711 ZEND_ASSERT(EX(func)->common.num_args == arg_num - 1);
5712 zend_arg_info *arg_info = &EX(func)->common.arg_info[arg_num - 1];
5713
5714 array_init_size(params, arg_count - arg_num + 1);
5717 zval *param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
5718 if (ZEND_TYPE_IS_SET(arg_info->type)) {
5720 do {
5721 if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
5724 }
5725
5726 if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
5727 ZEND_HASH_FILL_ADD(param);
5728 param++;
5729 } while (++arg_num <= arg_count);
5730 } else {
5731 do {
5732 if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
5733 ZEND_HASH_FILL_ADD(param);
5734 param++;
5735 } while (++arg_num <= arg_count);
5736 }
5738 } else {
5739 ZVAL_EMPTY_ARRAY(params);
5740 }
5741
5744 zval *param;
5745 zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args];
5746 if (ZEND_TYPE_IS_SET(arg_info->type)) {
5747 SEPARATE_ARRAY(params);
5748 ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
5749 if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
5751 }
5752 Z_TRY_ADDREF_P(param);
5753 zend_hash_add_new(Z_ARRVAL_P(params), name, param);
5755 } else if (zend_hash_num_elements(Z_ARRVAL_P(params)) == 0) {
5756 GC_ADDREF(EX(extra_named_params));
5757 ZVAL_ARR(params, EX(extra_named_params));
5758 } else {
5759 SEPARATE_ARRAY(params);
5760 ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
5761 Z_TRY_ADDREF_P(param);
5762 zend_hash_add_new(Z_ARRVAL_P(params), name, param);
5764 }
5765 }
5766
5768}
5769
5771{
5773 zval *val;
5774
5775 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
5776 if (Z_TYPE_INFO_P(val) == IS_TRUE) {
5777 ZVAL_TRUE(EX_VAR(opline->result.var));
5778 } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
5779 /* The result and op1 can be the same cv zval */
5780 const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
5781 ZVAL_FALSE(EX_VAR(opline->result.var));
5782 if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
5783 SAVE_OPLINE();
5786 }
5787 } else {
5788 SAVE_OPLINE();
5789 ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val));
5790 FREE_OP1();
5792 }
5794}
5795
5796ZEND_VM_HELPER(zend_case_helper, ANY, ANY, zval *op_1, zval *op_2)
5797{
5798 int ret;
5800
5801 SAVE_OPLINE();
5802 if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
5803 op_1 = ZVAL_UNDEFINED_OP1();
5804 }
5805 if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
5806 op_2 = ZVAL_UNDEFINED_OP2();
5807 }
5808 ret = zend_compare(op_1, op_2);
5809 if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
5810 zval_ptr_dtor_nogc(op_2);
5811 }
5812 ZEND_VM_SMART_BRANCH(ret == 0, 1);
5813}
5814
5815ZEND_VM_HANDLER(48, ZEND_CASE, TMPVAR, CONST|TMPVAR|CV)
5816{
5818 zval *op1, *op2;
5819 double d1, d2;
5820
5821 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
5822 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
5823 if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
5824 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
5825 if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
5826ZEND_VM_C_LABEL(case_true):
5828 } else {
5829ZEND_VM_C_LABEL(case_false):
5831 }
5832 } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
5833 d1 = (double)Z_LVAL_P(op1);
5834 d2 = Z_DVAL_P(op2);
5835 ZEND_VM_C_GOTO(case_double);
5836 }
5837 } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
5838 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
5839 d1 = Z_DVAL_P(op1);
5840 d2 = Z_DVAL_P(op2);
5841ZEND_VM_C_LABEL(case_double):
5842 if (d1 == d2) {
5843 ZEND_VM_C_GOTO(case_true);
5844 } else {
5845 ZEND_VM_C_GOTO(case_false);
5846 }
5847 } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
5848 d1 = Z_DVAL_P(op1);
5849 d2 = (double)Z_LVAL_P(op2);
5850 ZEND_VM_C_GOTO(case_double);
5851 }
5852 } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
5853 if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
5854 bool result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
5855 FREE_OP2();
5856 if (result) {
5857 ZEND_VM_C_GOTO(case_true);
5858 } else {
5859 ZEND_VM_C_GOTO(case_false);
5860 }
5861 }
5862 }
5863 ZEND_VM_DISPATCH_TO_HELPER(zend_case_helper, op_1, op1, op_2, op2);
5864}
5865
5866ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
5867{
5869 zval *result;
5870 zend_function *constructor;
5871 zend_class_entry *ce;
5873
5874 SAVE_OPLINE();
5875 if (OP1_TYPE == IS_CONST) {
5876 ce = CACHED_PTR(opline->op2.num);
5877 if (UNEXPECTED(ce == NULL)) {
5879 if (UNEXPECTED(ce == NULL)) {
5880 ZVAL_UNDEF(EX_VAR(opline->result.var));
5882 }
5883 CACHE_PTR(opline->op2.num, ce);
5884 }
5885 } else if (OP1_TYPE == IS_UNUSED) {
5886 ce = zend_fetch_class(NULL, opline->op1.num);
5887 if (UNEXPECTED(ce == NULL)) {
5888 ZVAL_UNDEF(EX_VAR(opline->result.var));
5890 }
5891 } else {
5892 ce = Z_CE_P(EX_VAR(opline->op1.var));
5893 }
5894
5895 result = EX_VAR(opline->result.var);
5896 if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
5899 }
5900
5901 constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
5902 if (constructor == NULL) {
5903 if (UNEXPECTED(EG(exception))) {
5905 }
5906
5907 /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
5908 * opcode is DO_FCALL in case EXT instructions are used. */
5909 if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
5911 }
5912
5913 /* Perform a dummy function call */
5914 call = zend_vm_stack_push_call_frame(
5916 opline->extended_value, NULL);
5917 } else {
5918 if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
5919 init_func_run_time_cache(&constructor->op_array);
5920 }
5921 /* We are not handling overloaded classes right now */
5922 call = zend_vm_stack_push_call_frame(
5924 constructor,
5925 opline->extended_value,
5926 Z_OBJ_P(result));
5928 }
5929
5930 call->prev_execute_data = EX(call);
5931 EX(call) = call;
5933}
5934
5936{
5938 zval *obj;
5940 zend_class_entry *ce, *scope;
5941 zend_function *clone;
5942 zend_object_clone_obj_t clone_call;
5943
5944 SAVE_OPLINE();
5945 obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
5946
5947 do {
5948 if (OP1_TYPE == IS_CONST ||
5949 (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
5950 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
5951 obj = Z_REFVAL_P(obj);
5952 if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
5953 break;
5954 }
5955 }
5956 ZVAL_UNDEF(EX_VAR(opline->result.var));
5957 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
5959 if (UNEXPECTED(EG(exception) != NULL)) {
5961 }
5962 }
5963 zend_throw_error(NULL, "__clone method called on non-object");
5964 FREE_OP1();
5966 }
5967 } while (0);
5968
5969 zobj = Z_OBJ_P(obj);
5970 ce = zobj->ce;
5971 clone = ce->clone;
5972 clone_call = zobj->handlers->clone_obj;
5973 if (UNEXPECTED(clone_call == NULL)) {
5974 zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
5975 FREE_OP1();
5976 ZVAL_UNDEF(EX_VAR(opline->result.var));
5978 }
5979
5980 if (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
5981 scope = EX(func)->op_array.scope;
5982 if (clone->common.scope != scope) {
5985 zend_wrong_clone_call(clone, scope);
5986 FREE_OP1();
5987 ZVAL_UNDEF(EX_VAR(opline->result.var));
5989 }
5990 }
5991 }
5992
5993 ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(zobj));
5994
5995 FREE_OP1();
5997}
5998
6000{
6002 zend_constant *c;
6003
6004 c = CACHED_PTR(opline->extended_value);
6005 if (EXPECTED(c != NULL) && EXPECTED(!IS_SPECIAL_CACHE_VAL(c))) {
6006 ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value);
6008 }
6009
6010 SAVE_OPLINE();
6011 zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC);
6013}
6014
6015ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST|TMPVARCV, CACHE_SLOT)
6016{
6017 zend_class_entry *ce, *scope;
6019 zval *value, *zv, *constant_zv;
6020 zend_string *constant_name;
6022
6023 SAVE_OPLINE();
6024
6025 do {
6026 if (OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
6027 if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
6028 value = CACHED_PTR(opline->extended_value + sizeof(void*));
6029 break;
6030 }
6031 }
6032 if (OP1_TYPE == IS_CONST) {
6033 if (EXPECTED(CACHED_PTR(opline->extended_value))) {
6034 ce = CACHED_PTR(opline->extended_value);
6035 } else {
6037 if (UNEXPECTED(ce == NULL)) {
6038 ZVAL_UNDEF(EX_VAR(opline->result.var));
6039 FREE_OP2();
6041 }
6042 CACHE_PTR(opline->extended_value, ce);
6043 }
6044 } else if (OP1_TYPE == IS_UNUSED) {
6045 ce = zend_fetch_class(NULL, opline->op1.num);
6046 if (UNEXPECTED(ce == NULL)) {
6047 ZVAL_UNDEF(EX_VAR(opline->result.var));
6048 FREE_OP2();
6050 }
6051 } else {
6052 ce = Z_CE_P(EX_VAR(opline->op1.var));
6053 }
6054 if (OP1_TYPE != IS_CONST
6055 && OP2_TYPE == IS_CONST
6056 && EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
6057 value = CACHED_PTR(opline->extended_value + sizeof(void*));
6058 break;
6059 }
6060
6061 constant_zv = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
6062 if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
6064 ZVAL_UNDEF(EX_VAR(opline->result.var));
6065 FREE_OP2();
6067 }
6068 constant_name = Z_STR_P(constant_zv);
6069 /* Magic 'class' for constant OP2 is caught at compile-time */
6070 if (OP2_TYPE != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
6071 ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
6072 FREE_OP2();
6074 }
6075 zv = OP2_TYPE == IS_CONST
6076 ? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
6077 : zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
6078
6079 if (EXPECTED(zv != NULL)) {
6080 c = Z_PTR_P(zv);
6081 scope = EX(func)->op_array.scope;
6083 zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
6084 ZVAL_UNDEF(EX_VAR(opline->result.var));
6085 FREE_OP2();
6087 }
6088
6089 if (ce->ce_flags & ZEND_ACC_TRAIT) {
6090 zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
6091 ZVAL_UNDEF(EX_VAR(opline->result.var));
6092 FREE_OP2();
6094 }
6095
6096 bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
6097 if (UNEXPECTED(is_constant_deprecated)) {
6098 zend_deprecated_class_constant(c, constant_name);
6099
6100 if (EG(exception)) {
6101 ZVAL_UNDEF(EX_VAR(opline->result.var));
6102 FREE_OP2();
6104 }
6105 }
6106
6107 value = &c->value;
6108 // Enums require loading of all class constants to build the backed enum table
6111 ZVAL_UNDEF(EX_VAR(opline->result.var));
6112 FREE_OP2();
6114 }
6115 }
6116 if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
6117 if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
6118 ZVAL_UNDEF(EX_VAR(opline->result.var));
6119 FREE_OP2();
6121 }
6122 }
6123 if (OP2_TYPE == IS_CONST && !is_constant_deprecated) {
6124 CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
6125 }
6126 } else {
6127 zend_throw_error(NULL, "Undefined constant %s::%s",
6128 ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
6129 ZVAL_UNDEF(EX_VAR(opline->result.var));
6130 FREE_OP2();
6132 }
6133 } while (0);
6134
6135 ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
6136
6137 FREE_OP2();
6139}
6140
6142{
6144 zval *expr_ptr, new_expr;
6145
6146 SAVE_OPLINE();
6147 if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) &&
6148 UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
6149 expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
6150 if (Z_ISREF_P(expr_ptr)) {
6151 Z_ADDREF_P(expr_ptr);
6152 } else {
6153 ZVAL_MAKE_REF_EX(expr_ptr, 2);
6154 }
6155 FREE_OP1();
6156 } else {
6157 expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
6158 if (OP1_TYPE == IS_TMP_VAR) {
6159 /* pass */
6160 } else if (OP1_TYPE == IS_CONST) {
6161 Z_TRY_ADDREF_P(expr_ptr);
6162 } else if (OP1_TYPE == IS_CV) {
6163 ZVAL_DEREF(expr_ptr);
6164 Z_TRY_ADDREF_P(expr_ptr);
6165 } else /* if (OP1_TYPE == IS_VAR) */ {
6166 if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
6167 zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
6168
6169 expr_ptr = Z_REFVAL_P(expr_ptr);
6170 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
6171 ZVAL_COPY_VALUE(&new_expr, expr_ptr);
6172 expr_ptr = &new_expr;
6173 efree_size(ref, sizeof(zend_reference));
6174 } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
6175 Z_ADDREF_P(expr_ptr);
6176 }
6177 }
6178 }
6179 }
6180
6181 if (OP2_TYPE != IS_UNUSED) {
6182 zval *offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
6183 zend_string *str;
6184 zend_ulong hval;
6185
6186ZEND_VM_C_LABEL(add_again):
6187 if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
6188 str = Z_STR_P(offset);
6189 if (OP2_TYPE != IS_CONST) {
6190 if (ZEND_HANDLE_NUMERIC(str, hval)) {
6191 ZEND_VM_C_GOTO(num_index);
6192 }
6193 }
6194ZEND_VM_C_LABEL(str_index):
6195 zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
6196 } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
6197 hval = Z_LVAL_P(offset);
6198ZEND_VM_C_LABEL(num_index):
6199 zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
6200 } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
6202 ZEND_VM_C_GOTO(add_again);
6203 } else if (Z_TYPE_P(offset) == IS_NULL) {
6204 str = ZSTR_EMPTY_ALLOC();
6205 ZEND_VM_C_GOTO(str_index);
6206 } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
6207 hval = zend_dval_to_lval_safe(Z_DVAL_P(offset));
6208 ZEND_VM_C_GOTO(num_index);
6209 } else if (Z_TYPE_P(offset) == IS_FALSE) {
6210 hval = 0;
6211 ZEND_VM_C_GOTO(num_index);
6212 } else if (Z_TYPE_P(offset) == IS_TRUE) {
6213 hval = 1;
6214 ZEND_VM_C_GOTO(num_index);
6215 } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
6217 hval = Z_RES_HANDLE_P(offset);
6218 ZEND_VM_C_GOTO(num_index);
6219 } else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
6221 str = ZSTR_EMPTY_ALLOC();
6222 ZEND_VM_C_GOTO(str_index);
6223 } else {
6224 zend_illegal_array_offset_access(offset);
6225 zval_ptr_dtor_nogc(expr_ptr);
6226 }
6227 FREE_OP2();
6228 } else {
6229 if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
6231 zval_ptr_dtor_nogc(expr_ptr);
6232 }
6233 }
6235}
6236
6238{
6240 zval *op1;
6241 HashTable *result_ht;
6242
6243 SAVE_OPLINE();
6244 op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
6245 result_ht = Z_ARRVAL_P(EX_VAR(opline->result.var));
6246
6247ZEND_VM_C_LABEL(add_unpack_again):
6248 if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
6250 zval *val;
6251
6252 if (HT_IS_PACKED(ht) && (zend_hash_num_elements(result_ht) == 0 || HT_IS_PACKED(result_ht))) {
6253 zend_hash_extend(result_ht, result_ht->nNumUsed + zend_hash_num_elements(ht), 1);
6254 ZEND_HASH_FILL_PACKED(result_ht) {
6256 if (UNEXPECTED(Z_ISREF_P(val)) &&
6257 UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
6258 val = Z_REFVAL_P(val);
6259 }
6264 } else {
6266
6268 if (UNEXPECTED(Z_ISREF_P(val)) &&
6269 UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
6270 val = Z_REFVAL_P(val);
6271 }
6273 if (key) {
6274 zend_hash_update(result_ht, key, val);
6275 } else {
6276 if (!zend_hash_next_index_insert(result_ht, val)) {
6278 zval_ptr_dtor_nogc(val);
6279 break;
6280 }
6281 }
6283 }
6284 } else if (EXPECTED(Z_TYPE_P(op1) == IS_OBJECT)) {
6287
6288 if (!ce || !ce->get_iterator) {
6289 zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
6290 } else {
6291 iter = ce->get_iterator(ce, op1, 0);
6292 if (UNEXPECTED(!iter)) {
6293 FREE_OP1();
6294 if (!EG(exception)) {
6296 NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name)
6297 );
6298 }
6300 }
6301
6302 const zend_object_iterator_funcs *funcs = iter->funcs;
6303 if (funcs->rewind) {
6304 funcs->rewind(iter);
6305 }
6306
6307 for (; funcs->valid(iter) == SUCCESS; ) {
6308 zval *val;
6309
6310 if (UNEXPECTED(EG(exception) != NULL)) {
6311 break;
6312 }
6313
6314 val = funcs->get_current_data(iter);
6315 if (UNEXPECTED(EG(exception) != NULL)) {
6316 break;
6317 }
6318
6319 zval key;
6320 if (funcs->get_current_key) {
6321 funcs->get_current_key(iter, &key);
6322 if (UNEXPECTED(EG(exception) != NULL)) {
6323 break;
6324 }
6325
6326 if (UNEXPECTED(Z_TYPE(key) != IS_LONG && Z_TYPE(key) != IS_STRING)) {
6328 "Keys must be of type int|string during array unpacking");
6330 break;
6331 }
6332 } else {
6333 ZVAL_UNDEF(&key);
6334 }
6335
6336 ZVAL_DEREF(val);
6338
6339 zend_ulong num_key;
6340 if (Z_TYPE(key) == IS_STRING && !ZEND_HANDLE_NUMERIC(Z_STR(key), num_key)) {
6341 zend_hash_update(result_ht, Z_STR(key), val);
6342 zval_ptr_dtor_str(&key);
6343 } else {
6345 if (!zend_hash_next_index_insert(result_ht, val)) {
6347 zval_ptr_dtor_nogc(val);
6348 break;
6349 }
6350 }
6351
6352 funcs->move_forward(iter);
6353 if (UNEXPECTED(EG(exception))) {
6354 break;
6355 }
6356 }
6357
6358 zend_iterator_dtor(iter);
6359 }
6360 } else if (EXPECTED(Z_ISREF_P(op1))) {
6361 op1 = Z_REFVAL_P(op1);
6362 ZEND_VM_C_GOTO(add_unpack_again);
6363 } else {
6364 zend_throw_error(NULL, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
6365 }
6366
6367 FREE_OP1();
6369}
6370
6371ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV|UNUSED, CONST|TMPVAR|UNUSED|NEXT|CV, ARRAY_INIT|REF)
6372{
6373 zval *array;
6374 uint32_t size;
6376
6377 SAVE_OPLINE();
6378 array = EX_VAR(opline->result.var);
6379 if (OP1_TYPE != IS_UNUSED) {
6380 size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
6381 ZVAL_ARR(array, zend_new_array(size));
6382 /* Explicitly initialize array as not-packed if flag is set */
6383 if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
6385 }
6386 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
6387 } else {
6388 ZVAL_ARR(array, zend_new_array(0));
6390 }
6391}
6392
6394{
6396 zval *expr;
6397 zval *result = EX_VAR(opline->result.var);
6398 HashTable *ht;
6399
6400 SAVE_OPLINE();
6401 expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
6402
6403 switch (opline->extended_value) {
6404 case IS_LONG:
6405 ZVAL_LONG(result, zval_get_long(expr));
6406 break;
6407 case IS_DOUBLE:
6408 ZVAL_DOUBLE(result, zval_get_double(expr));
6409 break;
6410 case IS_STRING:
6411 ZVAL_STR(result, zval_get_string(expr));
6412 break;
6413 default:
6414 ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
6415 if (OP1_TYPE & (IS_VAR|IS_CV)) {
6416 ZVAL_DEREF(expr);
6417 }
6418 /* If value is already of correct type, return it directly */
6419 if (Z_TYPE_P(expr) == opline->extended_value) {
6420 ZVAL_COPY_VALUE(result, expr);
6421 if (OP1_TYPE == IS_CONST) {
6423 } else if (OP1_TYPE != IS_TMP_VAR) {
6425 }
6426
6427 FREE_OP1_IF_VAR();
6429 }
6430
6431 if (opline->extended_value == IS_ARRAY) {
6432 if (OP1_TYPE == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
6433 if (Z_TYPE_P(expr) != IS_NULL) {
6435 expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
6436 if (OP1_TYPE == IS_CONST) {
6437 if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
6438 } else {
6439 if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
6440 }
6441 } else {
6443 }
6445 /* Optimized version without rebuilding properties HashTable */
6447 } else {
6449 if (obj_ht) {
6450 /* fast copy */
6452 (Z_OBJCE_P(expr)->default_properties_count ||
6454 GC_IS_RECURSIVE(obj_ht))));
6456 } else {
6458 }
6459 }
6460 } else {
6461 ZEND_ASSERT(opline->extended_value == IS_OBJECT);
6463 if (Z_TYPE_P(expr) == IS_ARRAY) {
6466 /* TODO: try not to duplicate immutable arrays as well ??? */
6467 ht = zend_array_dup(ht);
6468 }
6469 Z_OBJ_P(result)->properties = ht;
6470 } else if (Z_TYPE_P(expr) != IS_NULL) {
6471 Z_OBJ_P(result)->properties = ht = zend_new_array(1);
6472 expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
6473 if (OP1_TYPE == IS_CONST) {
6474 if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
6475 } else {
6476 if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
6477 }
6478 }
6479 }
6480 }
6481
6482 FREE_OP1();
6484}
6485
6486ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSERVER))
6487{
6491
6492 SAVE_OPLINE();
6493 inc_filename = GET_OP1_ZVAL_PTR(BP_VAR_R);
6494 new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
6495 if (UNEXPECTED(EG(exception) != NULL)) {
6496 FREE_OP1();
6500 }
6501 UNDEF_RESULT();
6504 if (RETURN_VALUE_USED(opline)) {
6505 ZVAL_TRUE(EX_VAR(opline->result.var));
6506 }
6507 } else if (UNEXPECTED(new_op_array == NULL)) {
6508 if (RETURN_VALUE_USED(opline)) {
6509 ZVAL_FALSE(EX_VAR(opline->result.var));
6510 }
6511 } else if (new_op_array->last == 1
6512 && new_op_array->opcodes[0].opcode == ZEND_RETURN
6513 && new_op_array->opcodes[0].op1_type == IS_CONST
6515 if (RETURN_VALUE_USED(opline)) {
6516 const zend_op *op = new_op_array->opcodes;
6517
6518 ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
6519 }
6523 } else {
6526 if (RETURN_VALUE_USED(opline)) {
6527 return_value = EX_VAR(opline->result.var);
6528 }
6529
6530 new_op_array->scope = EX(func)->op_array.scope;
6531
6532 call = zend_vm_stack_push_call_frame(
6535 Z_PTR(EX(This)));
6536
6538 call->symbol_table = EX(symbol_table);
6539 } else {
6540 call->symbol_table = zend_rebuild_symbol_table();
6541 }
6542
6543 call->prev_execute_data = execute_data;
6547 FREE_OP1();
6548 ZEND_VM_ENTER();
6549 } else {
6553 }
6554
6558 if (UNEXPECTED(EG(exception) != NULL)) {
6559 zend_rethrow_exception(execute_data);
6560 FREE_OP1();
6561 UNDEF_RESULT();
6563 }
6564 }
6565 FREE_OP1();
6567}
6568
6570{
6572 zval *var = EX_VAR(opline->op1.var);
6573
6574 if (Z_REFCOUNTED_P(var)) {
6576
6577 ZVAL_UNDEF(var);
6578 SAVE_OPLINE();
6581 } else {
6582 ZVAL_UNDEF(var);
6583 }
6585}
6586
6587ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
6588{
6590 zval *varname;
6592 HashTable *target_symbol_table;
6593
6594 SAVE_OPLINE();
6595
6596 varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
6597
6598 if (OP1_TYPE == IS_CONST) {
6599 name = Z_STR_P(varname);
6600 } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
6601 name = Z_STR_P(varname);
6602 tmp_name = NULL;
6603 } else {
6604 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
6605 varname = ZVAL_UNDEFINED_OP1();
6606 }
6607 name = zval_try_get_tmp_string(varname, &tmp_name);
6608 if (UNEXPECTED(!name)) {
6609 FREE_OP1();
6611 }
6612 }
6613
6614 target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
6615 zend_hash_del_ind(target_symbol_table, name);
6616
6617 if (OP1_TYPE != IS_CONST) {
6618 zend_tmp_string_release(tmp_name);
6619 }
6620 FREE_OP1();
6622}
6623
6624/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
6626{
6628 zval *varname;
6630 zend_class_entry *ce;
6631
6632 SAVE_OPLINE();
6633
6634 if (OP2_TYPE == IS_CONST) {
6635 ce = CACHED_PTR(opline->extended_value);
6636 if (UNEXPECTED(ce == NULL)) {
6638 if (UNEXPECTED(ce == NULL)) {
6639 FREE_OP1();
6641 }
6642 /*CACHE_PTR(opline->extended_value, ce);*/
6643 }
6644 } else if (OP2_TYPE == IS_UNUSED) {
6645 ce = zend_fetch_class(NULL, opline->op2.num);
6646 if (UNEXPECTED(ce == NULL)) {
6647 FREE_OP1();
6649 }
6650 } else {
6651 ce = Z_CE_P(EX_VAR(opline->op2.var));
6652 }
6653
6654 varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
6655 if (OP1_TYPE == IS_CONST) {
6656 name = Z_STR_P(varname);
6657 } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
6658 name = Z_STR_P(varname);
6659 } else {
6660 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
6661 varname = ZVAL_UNDEFINED_OP1();
6662 }
6663 name = zval_try_get_tmp_string(varname, &tmp_name);
6664 if (UNEXPECTED(!name)) {
6665 FREE_OP1();
6667 }
6668 }
6669
6671
6672 zend_tmp_string_release(tmp_name);
6673 FREE_OP1();
6675}
6676
6678{
6680 zval *container;
6681 zval *offset;
6682 zend_ulong hval;
6684
6685 SAVE_OPLINE();
6686 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
6687 offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
6688
6689 do {
6691 HashTable *ht;
6692
6693ZEND_VM_C_LABEL(unset_dim_array):
6696ZEND_VM_C_LABEL(offset_again):
6697 if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
6698 key = Z_STR_P(offset);
6699 if (OP2_TYPE != IS_CONST) {
6700 if (ZEND_HANDLE_NUMERIC(key, hval)) {
6701 ZEND_VM_C_GOTO(num_index_dim);
6702 }
6703 }
6704ZEND_VM_C_LABEL(str_index_dim):
6705 ZEND_ASSERT(ht != &EG(symbol_table));
6707 } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
6708 hval = Z_LVAL_P(offset);
6709ZEND_VM_C_LABEL(num_index_dim):
6710 zend_hash_index_del(ht, hval);
6711 } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
6713 ZEND_VM_C_GOTO(offset_again);
6714 } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
6715 hval = zend_dval_to_lval_safe(Z_DVAL_P(offset));
6716 ZEND_VM_C_GOTO(num_index_dim);
6717 } else if (Z_TYPE_P(offset) == IS_NULL) {
6719 ZEND_VM_C_GOTO(str_index_dim);
6720 } else if (Z_TYPE_P(offset) == IS_FALSE) {
6721 hval = 0;
6722 ZEND_VM_C_GOTO(num_index_dim);
6723 } else if (Z_TYPE_P(offset) == IS_TRUE) {
6724 hval = 1;
6725 ZEND_VM_C_GOTO(num_index_dim);
6726 } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
6728 hval = Z_RES_HANDLE_P(offset);
6729 ZEND_VM_C_GOTO(num_index_dim);
6730 } else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
6733 ZEND_VM_C_GOTO(str_index_dim);
6734 } else {
6735 zend_illegal_array_offset_unset(offset);
6736 }
6737 break;
6738 } else if (Z_ISREF_P(container)) {
6741 ZEND_VM_C_GOTO(unset_dim_array);
6742 }
6743 }
6744 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
6746 }
6747 if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
6749 }
6751 if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
6752 offset++;
6753 }
6754 Z_OBJ_HT_P(container)->unset_dimension(Z_OBJ_P(container), offset);
6755 } else if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
6756 zend_throw_error(NULL, "Cannot unset string offsets");
6757 } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) {
6758 zend_throw_error(NULL, "Cannot unset offset in a non-array variable");
6759 } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) {
6761 }
6762 } while (0);
6763
6764 FREE_OP2();
6765 FREE_OP1();
6767}
6768
6769ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
6770{
6772 zval *container;
6773 zval *offset;
6775
6776 SAVE_OPLINE();
6777 container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
6778 offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
6779
6780 do {
6781 if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
6782 if (Z_ISREF_P(container)) {
6784 if (Z_TYPE_P(container) != IS_OBJECT) {
6785 if (OP1_TYPE == IS_CV
6788 }
6789 break;
6790 }
6791 } else {
6792 break;
6793 }
6794 }
6795 if (OP2_TYPE == IS_CONST) {
6796 name = Z_STR_P(offset);
6797 } else {
6798 name = zval_try_get_tmp_string(offset, &tmp_name);
6799 if (UNEXPECTED(!name)) {
6800 break;
6801 }
6802 }
6803 Z_OBJ_HT_P(container)->unset_property(Z_OBJ_P(container), name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
6804 if (OP2_TYPE != IS_CONST) {
6805 zend_tmp_string_release(tmp_name);
6806 }
6807 } while (0);
6808
6809 FREE_OP2();
6810 FREE_OP1();
6812}
6813
6815{
6817 zval *array_ptr, *result;
6818
6819 SAVE_OPLINE();
6820
6821 array_ptr = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
6822 if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
6823 result = EX_VAR(opline->result.var);
6824 ZVAL_COPY_VALUE(result, array_ptr);
6825 if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(result)) {
6826 Z_ADDREF_P(array_ptr);
6827 }
6828 Z_FE_POS_P(result) = 0;
6829
6830 FREE_OP1_IF_VAR();
6832 } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
6833 zend_object *zobj = Z_OBJ_P(array_ptr);
6834 if (!zobj->ce->get_iterator) {
6835 if (UNEXPECTED(zend_object_is_lazy(zobj))) {
6837 if (UNEXPECTED(EG(exception))) {
6838 UNDEF_RESULT();
6839 FREE_OP1_IF_VAR();
6841 }
6842 }
6843 HashTable *properties = zobj->properties;
6844 if (properties) {
6845 if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
6846 if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
6847 GC_DELREF(properties);
6848 }
6849 properties = zobj->properties = zend_array_dup(properties);
6850 }
6851 } else {
6852 properties = zobj->handlers->get_properties(zobj);
6853 }
6854
6855 result = EX_VAR(opline->result.var);
6856 ZVAL_COPY_VALUE(result, array_ptr);
6857 if (OP1_TYPE != IS_TMP_VAR) {
6858 Z_ADDREF_P(array_ptr);
6859 }
6860
6861 if (zend_hash_num_elements(properties) == 0) {
6862 Z_FE_ITER_P(result) = (uint32_t) -1;
6863 FREE_OP1_IF_VAR();
6864 ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
6865 }
6866
6867 Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
6868 FREE_OP1_IF_VAR();
6870 } else {
6871 bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
6872
6873 FREE_OP1();
6874 if (UNEXPECTED(EG(exception))) {
6876 } else if (is_empty) {
6877 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
6878 } else {
6880 }
6881 }
6882 } else {
6883 zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
6884 ZVAL_UNDEF(EX_VAR(opline->result.var));
6885 Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
6886 FREE_OP1();
6887 ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
6888 }
6889}
6890
6892{
6894 zval *array_ptr, *array_ref;
6895
6896 SAVE_OPLINE();
6897
6898 if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
6899 array_ref = array_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
6900 if (Z_ISREF_P(array_ref)) {
6901 array_ptr = Z_REFVAL_P(array_ref);
6902 }
6903 } else {
6904 array_ref = array_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
6905 }
6906
6907 if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
6908 if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
6909 if (array_ptr == array_ref) {
6910 ZVAL_NEW_REF(array_ref, array_ref);
6911 array_ptr = Z_REFVAL_P(array_ref);
6912 }
6913 Z_ADDREF_P(array_ref);
6914 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), array_ref);
6915 } else {
6916 array_ref = EX_VAR(opline->result.var);
6917 ZVAL_NEW_REF(array_ref, array_ptr);
6918 array_ptr = Z_REFVAL_P(array_ref);
6919 }
6920 if (OP1_TYPE == IS_CONST) {
6921 ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
6922 } else {
6923 SEPARATE_ARRAY(array_ptr);
6924 }
6925 Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
6926
6927 FREE_OP1_IF_VAR();
6929 } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
6930 if (!Z_OBJCE_P(array_ptr)->get_iterator) {
6931 zend_object *zobj = Z_OBJ_P(array_ptr);
6932 HashTable *properties;
6933 if (UNEXPECTED(zend_object_is_lazy(zobj))) {
6935 if (UNEXPECTED(EG(exception))) {
6936 UNDEF_RESULT();
6937 FREE_OP1_IF_VAR();
6939 }
6940 }
6941 if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
6942 if (array_ptr == array_ref) {
6943 ZVAL_NEW_REF(array_ref, array_ref);
6944 array_ptr = Z_REFVAL_P(array_ref);
6945 }
6946 Z_ADDREF_P(array_ref);
6947 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), array_ref);
6948 } else {
6949 array_ptr = EX_VAR(opline->result.var);
6950 ZVAL_COPY_VALUE(array_ptr, array_ref);
6951 }
6952 if (Z_OBJ_P(array_ptr)->properties
6953 && UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
6954 if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
6955 GC_DELREF(Z_OBJ_P(array_ptr)->properties);
6956 }
6957 Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
6958 }
6959
6960 properties = Z_OBJPROP_P(array_ptr);
6961 if (zend_hash_num_elements(properties) == 0) {
6962 Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
6963 FREE_OP1_IF_VAR();
6964 ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
6965 }
6966
6967 Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
6968 FREE_OP1_IF_VAR();
6970 } else {
6971 bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
6972 FREE_OP1();
6973 if (UNEXPECTED(EG(exception))) {
6975 } else if (is_empty) {
6976 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
6977 } else {
6979 }
6980 }
6981 } else {
6982 zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
6983 ZVAL_UNDEF(EX_VAR(opline->result.var));
6984 Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
6985 FREE_OP1();
6986 ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
6987 }
6988}
6989
6990ZEND_VM_HELPER(zend_fe_fetch_object_helper, ANY, ANY)
6991{
6993 zval *array;
6994 zval *value;
6995 uint32_t value_type;
6996 HashTable *fe_ht;
6998 Bucket *p;
7000
7001 array = EX_VAR(opline->op1.var);
7002 SAVE_OPLINE();
7003
7004 ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
7005 if ((iter = zend_iterator_unwrap(array)) == NULL) {
7006 /* plain object */
7007
7008 fe_ht = Z_OBJPROP_P(array);
7009 pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
7010 p = fe_ht->arData + pos;
7011 while (1) {
7012 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7013 /* reached end of iteration */
7014 ZEND_VM_C_GOTO(fe_fetch_r_exit);
7015 }
7016 pos++;
7017 value = &p->val;
7018 value_type = Z_TYPE_INFO_P(value);
7019 if (EXPECTED(value_type != IS_UNDEF)) {
7020 if (UNEXPECTED(value_type == IS_INDIRECT)) {
7022 value_type = Z_TYPE_INFO_P(value);
7023 if (EXPECTED(value_type != IS_UNDEF)
7024 && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
7025 break;
7026 }
7027 } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
7028 || !p->key
7029 || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
7030 break;
7031 }
7032 }
7033 p++;
7034 }
7035 EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
7036 if (RETURN_VALUE_USED(opline)) {
7037 if (UNEXPECTED(!p->key)) {
7038 ZVAL_LONG(EX_VAR(opline->result.var), p->h);
7039 } else if (ZSTR_VAL(p->key)[0]) {
7040 ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
7041 } else {
7042 const char *class_name, *prop_name;
7043 size_t prop_name_len;
7045 p->key, &class_name, &prop_name, &prop_name_len);
7046 ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
7047 }
7048 }
7049 } else {
7050 const zend_object_iterator_funcs *funcs = iter->funcs;
7051 if (EXPECTED(++iter->index > 0)) {
7052 /* This could cause an endless loop if index becomes zero again.
7053 * In case that ever happens we need an additional flag. */
7054 funcs->move_forward(iter);
7055 if (UNEXPECTED(EG(exception) != NULL)) {
7056 UNDEF_RESULT();
7058 }
7059 if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
7060 /* reached end of iteration */
7061 if (UNEXPECTED(EG(exception) != NULL)) {
7062 UNDEF_RESULT();
7064 }
7065ZEND_VM_C_LABEL(fe_fetch_r_exit):
7066 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7068 }
7069 }
7070 value = funcs->get_current_data(iter);
7071 if (UNEXPECTED(EG(exception) != NULL)) {
7072 UNDEF_RESULT();
7074 }
7075 if (!value) {
7076 /* failure in get_current_data */
7077 ZEND_VM_C_GOTO(fe_fetch_r_exit);
7078 }
7079 if (RETURN_VALUE_USED(opline)) {
7080 if (funcs->get_current_key) {
7081 funcs->get_current_key(iter, EX_VAR(opline->result.var));
7082 if (UNEXPECTED(EG(exception) != NULL)) {
7083 UNDEF_RESULT();
7085 }
7086 } else {
7087 ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
7088 }
7089 }
7090 value_type = Z_TYPE_INFO_P(value);
7091 }
7092
7093 if (EXPECTED(OP2_TYPE == IS_CV)) {
7094 zval *variable_ptr = EX_VAR(opline->op2.var);
7095 zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
7096 } else {
7097 zval *res = EX_VAR(opline->op2.var);
7099
7100 ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
7101 if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
7102 GC_ADDREF(gc);
7103 }
7104 }
7106}
7107
7109{
7111 zval *array;
7112 zval *value;
7113 uint32_t value_type;
7114 HashTable *fe_ht;
7116
7117 array = EX_VAR(opline->op1.var);
7118 if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) {
7119 ZEND_VM_DISPATCH_TO_HELPER(zend_fe_fetch_object_helper);
7120 }
7121 fe_ht = Z_ARRVAL_P(array);
7122 pos = Z_FE_POS_P(array);
7123 if (HT_IS_PACKED(fe_ht)) {
7124 value = fe_ht->arPacked + pos;
7125 while (1) {
7126 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7127 /* reached end of iteration */
7128 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7130 }
7131 value_type = Z_TYPE_INFO_P(value);
7132 ZEND_ASSERT(value_type != IS_INDIRECT);
7133 if (EXPECTED(value_type != IS_UNDEF)) {
7134 break;
7135 }
7136 pos++;
7137 value++;
7138 }
7139 Z_FE_POS_P(array) = pos + 1;
7140 if (RETURN_VALUE_USED(opline)) {
7141 ZVAL_LONG(EX_VAR(opline->result.var), pos);
7142 }
7143 } else {
7144 Bucket *p;
7145
7146 p = fe_ht->arData + pos;
7147 while (1) {
7148 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7149 /* reached end of iteration */
7150 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7152 }
7153 pos++;
7154 value = &p->val;
7155 value_type = Z_TYPE_INFO_P(value);
7156 ZEND_ASSERT(value_type != IS_INDIRECT);
7157 if (EXPECTED(value_type != IS_UNDEF)) {
7158 break;
7159 }
7160 p++;
7161 }
7162 Z_FE_POS_P(array) = pos;
7163 if (RETURN_VALUE_USED(opline)) {
7164 if (!p->key) {
7165 ZVAL_LONG(EX_VAR(opline->result.var), p->h);
7166 } else {
7167 ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
7168 }
7169 }
7170 }
7171 if (EXPECTED(OP2_TYPE == IS_CV)) {
7172 zval *variable_ptr = EX_VAR(opline->op2.var);
7173 SAVE_OPLINE();
7174 zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
7176 } else {
7177 zval *res = EX_VAR(opline->op2.var);
7179
7180 ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
7181 if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
7182 GC_ADDREF(gc);
7183 }
7185 }
7186}
7187
7189{
7191 zval *array;
7192 zval *value;
7193 uint32_t value_type;
7194 HashTable *fe_ht;
7196 Bucket *p;
7197
7198 array = EX_VAR(opline->op1.var);
7199 SAVE_OPLINE();
7200
7201 ZVAL_DEREF(array);
7202 if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
7203 pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array);
7204 fe_ht = Z_ARRVAL_P(array);
7205 if (HT_IS_PACKED(fe_ht)) {
7206 value = fe_ht->arPacked + pos;
7207 while (1) {
7208 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7209 /* reached end of iteration */
7210 ZEND_VM_C_GOTO(fe_fetch_w_exit);
7211 }
7212 value_type = Z_TYPE_INFO_P(value);
7213 ZEND_ASSERT(value_type != IS_INDIRECT);
7214 if (EXPECTED(value_type != IS_UNDEF)) {
7215 break;
7216 }
7217 pos++;
7218 value++;
7219 }
7220 EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
7221 if (RETURN_VALUE_USED(opline)) {
7222 ZVAL_LONG(EX_VAR(opline->result.var), pos);
7223 }
7224 } else {
7225 p = fe_ht->arData + pos;
7226 while (1) {
7227 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7228 /* reached end of iteration */
7229 ZEND_VM_C_GOTO(fe_fetch_w_exit);
7230 }
7231 pos++;
7232 value = &p->val;
7233 value_type = Z_TYPE_INFO_P(value);
7234 ZEND_ASSERT(value_type != IS_INDIRECT);
7235 if (EXPECTED(value_type != IS_UNDEF)) {
7236 break;
7237 }
7238 p++;
7239 }
7240 EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
7241 if (RETURN_VALUE_USED(opline)) {
7242 if (!p->key) {
7243 ZVAL_LONG(EX_VAR(opline->result.var), p->h);
7244 } else {
7245 ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
7246 }
7247 }
7248 }
7249 } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
7251
7252 if ((iter = zend_iterator_unwrap(array)) == NULL) {
7253 /* plain object */
7254
7255 fe_ht = Z_OBJPROP_P(array);
7256 pos = zend_hash_iterator_pos(Z_FE_ITER_P(EX_VAR(opline->op1.var)), fe_ht);
7257 p = fe_ht->arData + pos;
7258 while (1) {
7259 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
7260 /* reached end of iteration */
7261 ZEND_VM_C_GOTO(fe_fetch_w_exit);
7262 }
7263 pos++;
7264 value = &p->val;
7265 value_type = Z_TYPE_INFO_P(value);
7266 if (EXPECTED(value_type != IS_UNDEF)) {
7267 if (UNEXPECTED(value_type == IS_INDIRECT)) {
7269 value_type = Z_TYPE_INFO_P(value);
7270 if (EXPECTED(value_type != IS_UNDEF)
7271 && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
7272 if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) {
7274 zend_get_property_info_for_slot(Z_OBJ_P(array), value);
7275 if (prop_info) {
7276 if (UNEXPECTED(prop_info->flags & ZEND_ACC_READONLY)) {
7278 "Cannot acquire reference to readonly property %s::$%s",
7279 ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key));
7280 UNDEF_RESULT();
7282 }
7283 if (ZEND_TYPE_IS_SET(prop_info->type)) {
7286 value_type = IS_REFERENCE_EX;
7287 }
7288 }
7289 }
7290 break;
7291 }
7292 } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
7293 || !p->key
7294 || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
7295 break;
7296 }
7297 }
7298 p++;
7299 }
7300 EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
7301 if (RETURN_VALUE_USED(opline)) {
7302 if (UNEXPECTED(!p->key)) {
7303 ZVAL_LONG(EX_VAR(opline->result.var), p->h);
7304 } else if (ZSTR_VAL(p->key)[0]) {
7305 ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
7306 } else {
7307 const char *class_name, *prop_name;
7308 size_t prop_name_len;
7310 p->key, &class_name, &prop_name, &prop_name_len);
7311 ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
7312 }
7313 }
7314 } else {
7315 const zend_object_iterator_funcs *funcs = iter->funcs;
7316 if (++iter->index > 0) {
7317 /* This could cause an endless loop if index becomes zero again.
7318 * In case that ever happens we need an additional flag. */
7319 funcs->move_forward(iter);
7320 if (UNEXPECTED(EG(exception) != NULL)) {
7321 UNDEF_RESULT();
7323 }
7324 if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
7325 /* reached end of iteration */
7326 if (UNEXPECTED(EG(exception) != NULL)) {
7327 UNDEF_RESULT();
7329 }
7330 ZEND_VM_C_GOTO(fe_fetch_w_exit);
7331 }
7332 }
7333 value = funcs->get_current_data(iter);
7334 if (UNEXPECTED(EG(exception) != NULL)) {
7335 UNDEF_RESULT();
7337 }
7338 if (!value) {
7339 /* failure in get_current_data */
7340 ZEND_VM_C_GOTO(fe_fetch_w_exit);
7341 }
7342 if (RETURN_VALUE_USED(opline)) {
7343 if (funcs->get_current_key) {
7344 funcs->get_current_key(iter, EX_VAR(opline->result.var));
7345 if (UNEXPECTED(EG(exception) != NULL)) {
7346 UNDEF_RESULT();
7348 }
7349 } else {
7350 ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
7351 }
7352 }
7353 value_type = Z_TYPE_INFO_P(value);
7354 }
7355 } else {
7356 zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array));
7357 if (UNEXPECTED(EG(exception))) {
7358 UNDEF_RESULT();
7360 }
7361ZEND_VM_C_LABEL(fe_fetch_w_exit):
7362 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7364 }
7365
7366 if (EXPECTED((value_type & Z_TYPE_MASK) != IS_REFERENCE)) {
7368 zval *ref;
7370 ref = Z_REFVAL_P(value);
7371 ZVAL_COPY_VALUE_EX(ref, value, gc, value_type);
7372 }
7373 if (EXPECTED(OP2_TYPE == IS_CV)) {
7374 zval *variable_ptr = EX_VAR(opline->op2.var);
7375 if (EXPECTED(variable_ptr != value)) {
7376 zend_reference *ref;
7377
7378 ref = Z_REF_P(value);
7379 GC_ADDREF(ref);
7380 i_zval_ptr_dtor(variable_ptr);
7381 ZVAL_REF(variable_ptr, ref);
7382 }
7383 } else {
7385 ZVAL_REF(EX_VAR(opline->op2.var), Z_REF_P(value));
7386 }
7388}
7389
7390ZEND_VM_HOT_HANDLER(154, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET, SPEC(ISSET))
7391{
7393 zval *value;
7394
7395 value = EX_VAR(opline->op1.var);
7396 if (!(opline->extended_value & ZEND_ISEMPTY)) {
7397 if (Z_TYPE_P(value) > IS_NULL &&
7400 } else {
7402 }
7403 } else {
7404 bool result;
7405
7406 SAVE_OPLINE();
7407 result = !i_zend_is_true(value);
7409 }
7410}
7411
7412ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ISSET)
7413{
7415 zval *value;
7416 bool result;
7417 zval *varname;
7419 HashTable *target_symbol_table;
7420
7421 SAVE_OPLINE();
7422 varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
7423 if (OP1_TYPE == IS_CONST) {
7424 name = Z_STR_P(varname);
7425 } else {
7426 name = zval_get_tmp_string(varname, &tmp_name);
7427 }
7428
7429 target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
7430 value = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
7431
7432 if (OP1_TYPE != IS_CONST) {
7433 zend_tmp_string_release(tmp_name);
7434 }
7435 FREE_OP1();
7436
7437 if (!value) {
7438 result = (opline->extended_value & ZEND_ISEMPTY);
7439 } else {
7440 if (Z_TYPE_P(value) == IS_INDIRECT) {
7442 }
7443 if (!(opline->extended_value & ZEND_ISEMPTY)) {
7444 if (Z_ISREF_P(value)) {
7446 }
7448 } else {
7449 result = !i_zend_is_true(value);
7450 }
7451 }
7452
7454}
7455
7456/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
7457ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, ANY, CLASS_FETCH, ISSET|CACHE_SLOT)
7458{
7460 zval *value;
7461 zend_result fetch_result;
7462 bool result;
7463
7464 SAVE_OPLINE();
7465
7466 fetch_result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
7467
7468 if (!(opline->extended_value & ZEND_ISEMPTY)) {
7469 result = fetch_result == SUCCESS && Z_TYPE_P(value) > IS_NULL &&
7471 } else {
7472 result = fetch_result != SUCCESS || !i_zend_is_true(value);
7473 }
7474
7476}
7477
7479{
7481 zval *container;
7482 bool result;
7483 zend_ulong hval;
7484 zval *offset;
7485
7486 SAVE_OPLINE();
7487 container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_IS);
7488 offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
7489
7491 HashTable *ht;
7492 zval *value;
7493 zend_string *str;
7494
7495ZEND_VM_C_LABEL(isset_dim_obj_array):
7497ZEND_VM_C_LABEL(isset_again):
7498 if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
7499 str = Z_STR_P(offset);
7500 if (OP2_TYPE != IS_CONST) {
7501 if (ZEND_HANDLE_NUMERIC(str, hval)) {
7502 ZEND_VM_C_GOTO(num_index_prop);
7503 }
7504 }
7505 value = zend_hash_find_ex(ht, str, OP2_TYPE == IS_CONST);
7506 } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
7507 hval = Z_LVAL_P(offset);
7508ZEND_VM_C_LABEL(num_index_prop):
7509 value = zend_hash_index_find(ht, hval);
7510 } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
7512 ZEND_VM_C_GOTO(isset_again);
7513 } else {
7514 value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
7515 if (UNEXPECTED(EG(exception))) {
7516 result = 0;
7517 ZEND_VM_C_GOTO(isset_dim_obj_exit);
7518 }
7519 }
7520
7521 if (!(opline->extended_value & ZEND_ISEMPTY)) {
7522 /* > IS_NULL means not IS_UNDEF and not IS_NULL */
7523 result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
7525
7526 if (OP1_TYPE & (IS_CONST|IS_CV)) {
7527 /* avoid exception check */
7528 FREE_OP2();
7530 }
7531 } else {
7532 result = (value == NULL || !i_zend_is_true(value));
7533 }
7534 ZEND_VM_C_GOTO(isset_dim_obj_exit);
7535 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
7538 ZEND_VM_C_GOTO(isset_dim_obj_array);
7539 }
7540 }
7541
7542 if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
7543 offset++;
7544 }
7545 if (!(opline->extended_value & ZEND_ISEMPTY)) {
7546 result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
7547 } else {
7548 result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
7549 }
7550
7551ZEND_VM_C_LABEL(isset_dim_obj_exit):
7552 FREE_OP2();
7553 FREE_OP1();
7555}
7556
7557ZEND_VM_COLD_CONST_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, ISSET|CACHE_SLOT)
7558{
7560 zval *container;
7561 int result;
7562 zval *offset;
7564
7565 SAVE_OPLINE();
7566 container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
7567 offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
7568
7569 if (OP1_TYPE == IS_CONST ||
7570 (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
7571 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
7574 result = (opline->extended_value & ZEND_ISEMPTY);
7575 ZEND_VM_C_GOTO(isset_object_finish);
7576 }
7577 } else {
7578 result = (opline->extended_value & ZEND_ISEMPTY);
7579 ZEND_VM_C_GOTO(isset_object_finish);
7580 }
7581 }
7582
7583 if (OP2_TYPE == IS_CONST) {
7584 name = Z_STR_P(offset);
7585 } else {
7586 name = zval_try_get_tmp_string(offset, &tmp_name);
7587 if (UNEXPECTED(!name)) {
7588 result = 0;
7589 ZEND_VM_C_GOTO(isset_object_finish);
7590 }
7591 }
7592
7593 result =
7594 (opline->extended_value & ZEND_ISEMPTY) ^
7595 Z_OBJ_HT_P(container)->has_property(Z_OBJ_P(container), name, (opline->extended_value & ZEND_ISEMPTY), ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
7596
7597 if (OP2_TYPE != IS_CONST) {
7598 zend_tmp_string_release(tmp_name);
7599 }
7600
7601ZEND_VM_C_LABEL(isset_object_finish):
7602 FREE_OP2();
7603 FREE_OP1();
7605}
7606
7608{
7610
7611 zval *key, *subject;
7612 HashTable *ht;
7613 bool result;
7614
7615 SAVE_OPLINE();
7616
7617 key = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
7618 subject = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
7619
7620 if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
7621ZEND_VM_C_LABEL(array_key_exists_array):
7622 ht = Z_ARRVAL_P(subject);
7623 result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
7624 } else {
7625 if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
7626 subject = Z_REFVAL_P(subject);
7627 if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
7628 ZEND_VM_C_GOTO(array_key_exists_array);
7629 }
7630 }
7631 zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC);
7632 result = 0;
7633 }
7634
7635 FREE_OP2();
7636 FREE_OP1();
7638}
7639
7641{
7643
7644 ZVAL_LONG(EX_VAR(opline->result.var), EG(error_reporting));
7645
7647 do {
7648 /* Do not silence fatal errors */
7650 if (!EG(error_reporting_ini_entry)) {
7651 zval *zv = zend_hash_find_known_hash(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING));
7652 if (zv) {
7653 EG(error_reporting_ini_entry) = (zend_ini_entry *)Z_PTR_P(zv);
7654 } else {
7655 break;
7656 }
7657 }
7658 if (!EG(error_reporting_ini_entry)->modified) {
7659 if (!EG(modified_ini_directives)) {
7660 ALLOC_HASHTABLE(EG(modified_ini_directives));
7661 zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
7662 }
7663 if (EXPECTED(zend_hash_add_ptr(EG(modified_ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), EG(error_reporting_ini_entry)) != NULL)) {
7664 EG(error_reporting_ini_entry)->orig_value = EG(error_reporting_ini_entry)->value;
7665 EG(error_reporting_ini_entry)->orig_modifiable = EG(error_reporting_ini_entry)->modifiable;
7666 EG(error_reporting_ini_entry)->modified = 1;
7667 }
7668 }
7669 } while (0);
7670 }
7672}
7673
7675{
7677
7679 && !E_HAS_ONLY_FATAL_ERRORS(Z_LVAL_P(EX_VAR(opline->op1.var)))) {
7680 EG(error_reporting) = Z_LVAL_P(EX_VAR(opline->op1.var));
7681 }
7683}
7684
7686{
7688 zval *value;
7689 zend_reference *ref = NULL;
7690 bool ret;
7691
7692 SAVE_OPLINE();
7693 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
7694
7695 if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
7696 if (OP1_TYPE == IS_VAR) {
7697 ref = Z_REF_P(value);
7698 }
7700 }
7701
7702 ret = i_zend_is_true(value);
7703
7704 if (UNEXPECTED(EG(exception))) {
7705 FREE_OP1();
7706 ZVAL_UNDEF(EX_VAR(opline->result.var));
7708 }
7709
7710 if (ret) {
7711 zval *result = EX_VAR(opline->result.var);
7712
7714 if (OP1_TYPE == IS_CONST) {
7716 } else if (OP1_TYPE == IS_CV) {
7718 } else if (OP1_TYPE == IS_VAR && ref) {
7719 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
7720 efree_size(ref, sizeof(zend_reference));
7721 } else if (Z_OPT_REFCOUNTED_P(result)) {
7723 }
7724 }
7725 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
7726 }
7727
7728 FREE_OP1();
7730}
7731
7733{
7735 zval *value;
7736 zend_reference *ref = NULL;
7737
7738 SAVE_OPLINE();
7739 value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
7740
7741 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
7742 if (OP1_TYPE & IS_VAR) {
7743 ref = Z_REF_P(value);
7744 }
7746 }
7747
7748 if (Z_TYPE_P(value) > IS_NULL) {
7749 zval *result = EX_VAR(opline->result.var);
7751 if (OP1_TYPE == IS_CONST) {
7753 } else if (OP1_TYPE == IS_CV) {
7755 } else if ((OP1_TYPE & IS_VAR) && ref) {
7756 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
7757 efree_size(ref, sizeof(zend_reference));
7758 } else if (Z_OPT_REFCOUNTED_P(result)) {
7760 }
7761 }
7762 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
7763 }
7764
7765 if ((OP1_TYPE & IS_VAR) && ref) {
7766 if (UNEXPECTED(GC_DELREF(ref) == 0)) {
7767 efree_size(ref, sizeof(zend_reference));
7768 }
7769 }
7771}
7772
7774{
7776 zval *val, *result;
7777
7778 val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
7779
7780 if (Z_TYPE_P(val) > IS_NULL) {
7781 do {
7782 if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) && Z_TYPE_P(val) == IS_REFERENCE) {
7783 val = Z_REFVAL_P(val);
7784 if (Z_TYPE_P(val) <= IS_NULL) {
7785 FREE_OP1();
7786 break;
7787 }
7788 }
7790 } while (0);
7791 }
7792
7793 result = EX_VAR(opline->result.var);
7794 uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
7795 if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
7797 if (OP1_TYPE == IS_CV
7799 && (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
7800 ) {
7801 SAVE_OPLINE();
7803 if (UNEXPECTED(EG(exception) != NULL)) {
7805 }
7806 }
7807 } else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
7809 } else {
7810 ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
7812 }
7813
7814 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
7815}
7816
7818{
7820 zval *value;
7821 zval *result = EX_VAR(opline->result.var);
7822
7823 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
7824 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
7825 SAVE_OPLINE();
7829 }
7830
7831 if (OP1_TYPE == IS_CV) {
7833 } else if (OP1_TYPE == IS_VAR) {
7834 if (UNEXPECTED(Z_ISREF_P(value))) {
7836 if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
7838 } else if (Z_OPT_REFCOUNTED_P(result)) {
7840 }
7841 } else {
7843 }
7844 } else {
7846 if (OP1_TYPE == IS_CONST) {
7849 }
7850 }
7851 }
7853}
7854
7856{
7858
7859 if (!EG(no_extensions)) {
7860 SAVE_OPLINE();
7863 }
7865}
7866
7868{
7870
7871 if (!EG(no_extensions)) {
7872 SAVE_OPLINE();
7875 }
7877}
7878
7880{
7882
7883 if (!EG(no_extensions)) {
7884 SAVE_OPLINE();
7887 }
7889}
7890
7892{
7894
7895 SAVE_OPLINE();
7896 do_bind_class(RT_CONSTANT(opline, opline->op1), (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
7898}
7899
7901{
7903
7904 zend_class_entry *ce = CACHED_PTR(opline->extended_value);
7905 if (ce == NULL) {
7906 zval *lcname = RT_CONSTANT(opline, opline->op1);
7907 zval *zv = zend_hash_find_known_hash(EG(class_table), Z_STR_P(lcname + 1));
7908 if (zv) {
7909 SAVE_OPLINE();
7910 ce = zend_bind_class_in_slot(zv, lcname, Z_STR_P(RT_CONSTANT(opline, opline->op2)));
7911 if (!ce) {
7913 }
7914 }
7915 CACHE_PTR(opline->extended_value, ce);
7916 }
7918}
7919
7920ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, CACHE_SLOT)
7921{
7922 zval *zv;
7923 zend_class_entry *ce;
7925
7926 ce = CACHED_PTR(opline->extended_value);
7927 if (UNEXPECTED(ce == NULL)) {
7928 zend_string *rtd_key = Z_STR_P(RT_CONSTANT(opline, opline->op1));
7929 zv = zend_hash_find_known_hash(EG(class_table), rtd_key);
7930 ZEND_ASSERT(zv != NULL);
7931 ce = Z_CE_P(zv);
7932 if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
7933 SAVE_OPLINE();
7934 ce = zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL, rtd_key);
7935 if (!ce) {
7937 }
7938 }
7939 CACHE_PTR(opline->extended_value, ce);
7940 }
7941 Z_CE_P(EX_VAR(opline->result.var)) = ce;
7943}
7944
7946{
7949
7950 SAVE_OPLINE();
7951 func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
7952 do_bind_function(func, RT_CONSTANT(opline, opline->op1));
7954}
7955
7957{
7959
7960 if ((uint32_t)++EG(ticks_count) >= opline->extended_value) {
7961 EG(ticks_count) = 0;
7962 if (zend_ticks_function) {
7963 SAVE_OPLINE();
7965 zend_ticks_function(opline->extended_value);
7968 }
7969 }
7971}
7972
7973ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
7974{
7976 zval *expr;
7977 bool result;
7978
7979 SAVE_OPLINE();
7980 expr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
7981
7982ZEND_VM_C_LABEL(try_instanceof):
7983 if (Z_TYPE_P(expr) == IS_OBJECT) {
7984 zend_class_entry *ce;
7985
7986 if (OP2_TYPE == IS_CONST) {
7987 ce = CACHED_PTR(opline->extended_value);
7988 if (UNEXPECTED(ce == NULL)) {
7989 ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
7990 if (EXPECTED(ce)) {
7991 CACHE_PTR(opline->extended_value, ce);
7992 }
7993 }
7994 } else if (OP2_TYPE == IS_UNUSED) {
7995 ce = zend_fetch_class(NULL, opline->op2.num);
7996 if (UNEXPECTED(ce == NULL)) {
7997 FREE_OP1();
7998 ZVAL_UNDEF(EX_VAR(opline->result.var));
8000 }
8001 } else {
8002 ce = Z_CE_P(EX_VAR(opline->op2.var));
8003 }
8004 result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
8005 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
8006 expr = Z_REFVAL_P(expr);
8007 ZEND_VM_C_GOTO(try_instanceof);
8008 } else {
8009 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
8011 }
8012 result = 0;
8013 }
8014 FREE_OP1();
8016}
8017
8019{
8021
8023}
8024
8026{
8028
8030}
8031
8032ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_catch_offset, uint32_t op_num)
8033{
8034 /* May be NULL during generator closing (only finally blocks are executed) */
8036
8037 /* Walk try/catch/finally structures upwards, performing the necessary actions */
8038 for (; try_catch_offset != (uint32_t) -1; try_catch_offset--) {
8039 zend_try_catch_element *try_catch =
8040 &EX(func)->op_array.try_catch_array[try_catch_offset];
8041
8042 if (op_num < try_catch->catch_op && ex) {
8043 /* Go to catch block */
8044 cleanup_live_vars(execute_data, op_num, try_catch->catch_op);
8045 ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0);
8046
8047 } else if (op_num < try_catch->finally_op) {
8048 if (ex && zend_is_unwind_exit(ex)) {
8049 /* Don't execute finally blocks on exit (for now) */
8050 continue;
8051 }
8052
8053 /* Go to finally block */
8054 zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
8055 cleanup_live_vars(execute_data, op_num, try_catch->finally_op);
8056 Z_OBJ_P(fast_call) = EG(exception);
8057 EG(exception) = NULL;
8058 Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
8059 ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0);
8060
8061 } else if (op_num < try_catch->finally_end) {
8062 zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
8063
8064 /* cleanup incomplete RETURN statement */
8065 if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
8066 && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
8067 zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
8068
8070 }
8071
8072 /* Chain potential exception from wrapping finally block */
8073 if (Z_OBJ_P(fast_call)) {
8074 if (ex) {
8076 /* discard the previously thrown exception */
8077 OBJ_RELEASE(Z_OBJ_P(fast_call));
8078 } else {
8080 }
8081 } else {
8082 ex = EG(exception) = Z_OBJ_P(fast_call);
8083 }
8084 }
8085 }
8086 }
8087
8088 /* Uncaught exception */
8089
8090 /* Don't use ZEND_OBSERVER_ENABLED because it gets replaced by zend_vm_gen.php. */
8092 zend_observer_fcall_end(execute_data, NULL);
8093 }
8094 cleanup_live_vars(execute_data, op_num, 0);
8096 zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
8097 EG(current_execute_data) = EX(prev_execute_data);
8100 } else {
8101 /* We didn't execute RETURN, and have to initialize return_value */
8102 if (EX(return_value)) {
8104 }
8105 ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
8106 }
8107}
8108
8110{
8111 const zend_op *throw_op = EG(opline_before_exception);
8112
8113 /* Exception was thrown before executing any op */
8114 if (UNEXPECTED(!throw_op)) {
8115 ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0);
8116 }
8117
8118 uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
8119 int i, current_try_catch_offset = -1;
8120
8121 if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
8122 && throw_op->extended_value & ZEND_FREE_ON_RETURN) {
8123 /* exceptions thrown because of loop var destruction on return/break/...
8124 * are logically thrown at the end of the foreach loop, so adjust the
8125 * throw_op_num.
8126 */
8127 const zend_live_range *range = find_live_range(
8128 &EX(func)->op_array, throw_op_num, throw_op->op1.var);
8129 /* free op1 of the corresponding RETURN */
8130 for (i = throw_op_num; i < range->end; i++) {
8131 if (EX(func)->op_array.opcodes[i].opcode == ZEND_FREE
8132 || EX(func)->op_array.opcodes[i].opcode == ZEND_FE_FREE) {
8133 /* pass */
8134 } else {
8135 if (EX(func)->op_array.opcodes[i].opcode == ZEND_RETURN
8136 && (EX(func)->op_array.opcodes[i].op1_type & (IS_VAR|IS_TMP_VAR))) {
8137 zval_ptr_dtor(EX_VAR(EX(func)->op_array.opcodes[i].op1.var));
8138 }
8139 break;
8140 }
8141 }
8142 throw_op_num = range->end;
8143 }
8144
8145 /* Find the innermost try/catch/finally the exception was thrown in */
8146 for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
8147 zend_try_catch_element *try_catch = &EX(func)->op_array.try_catch_array[i];
8148 if (try_catch->try_op > throw_op_num) {
8149 /* further blocks will not be relevant... */
8150 break;
8151 }
8152 if (throw_op_num < try_catch->catch_op || throw_op_num < try_catch->finally_end) {
8153 current_try_catch_offset = i;
8154 }
8155 }
8156
8157 cleanup_unfinished_calls(execute_data, throw_op_num);
8158
8159 if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
8160 switch (throw_op->opcode) {
8163 case ZEND_ROPE_INIT:
8164 case ZEND_ROPE_ADD:
8165 break; /* exception while building structures, live range handling will free those */
8166
8167 case ZEND_FETCH_CLASS:
8169 break; /* return value is zend_class_entry pointer */
8170
8171 default:
8172 /* smart branch opcodes may not initialize result */
8173 if (!zend_is_smart_branch(throw_op)) {
8174 zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
8175 }
8176 }
8177 }
8178
8179 ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num);
8180}
8181
8183{
8185 int ret;
8186
8187 SAVE_OPLINE();
8188 ret = zend_user_opcode_handlers[opline->opcode](execute_data);
8189 opline = EX(opline);
8190
8191 switch (ret) {
8196 zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
8197 EG(current_execute_data) = EX(prev_execute_data);
8200 } else {
8201 ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
8202 }
8204 ZEND_VM_ENTER();
8206 ZEND_VM_LEAVE();
8208 ZEND_VM_DISPATCH(opline->opcode, opline);
8209 default:
8210 ZEND_VM_DISPATCH((uint8_t)(ret & 0xff), opline);
8211 }
8212}
8213
8215{
8217 zval *name;
8218 zval *val;
8219 zend_constant c;
8220
8221 SAVE_OPLINE();
8222 name = GET_OP1_ZVAL_PTR(BP_VAR_R);
8223 val = GET_OP2_ZVAL_PTR(BP_VAR_R);
8224
8225 ZVAL_COPY(&c.value, val);
8226 if (Z_OPT_CONSTANT(c.value)) {
8227 if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
8228 zval_ptr_dtor_nogc(&c.value);
8229 FREE_OP1();
8230 FREE_OP2();
8232 }
8233 }
8234 /* non persistent, case sensitive */
8236 c.name = zend_string_copy(Z_STR_P(name));
8237
8238 if (zend_register_constant(&c) == FAILURE) {
8239 }
8240
8241 FREE_OP1();
8242 FREE_OP2();
8244}
8245
8247{
8250 zval *object;
8251 zend_class_entry *called_scope;
8252
8253 func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
8254 if (Z_TYPE(EX(This)) == IS_OBJECT) {
8255 called_scope = Z_OBJCE(EX(This));
8256 if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
8257 (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
8258 object = NULL;
8259 } else {
8260 object = &EX(This);
8261 }
8262 } else {
8263 called_scope = Z_CE(EX(This));
8264 object = NULL;
8265 }
8266 SAVE_OPLINE();
8267 zend_create_closure(EX_VAR(opline->result.var), func,
8268 EX(func)->op_array.scope, called_scope, object);
8269
8271}
8272
8274{
8276 zval *var_ptr;
8277
8278 var_ptr = EX_VAR(opline->op1.var);
8280 if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
8282 }
8283 }
8284
8286}
8287
8288ZEND_VM_COLD_HELPER(zend_yield_in_closed_generator_helper, ANY, ANY)
8289{
8291
8292 SAVE_OPLINE();
8293 zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
8294 FREE_OP2();
8295 FREE_OP1();
8296 UNDEF_RESULT();
8298}
8299
8301{
8303
8304 zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
8305
8306 SAVE_OPLINE();
8307 if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
8308 ZEND_VM_DISPATCH_TO_HELPER(zend_yield_in_closed_generator_helper);
8309 }
8310
8311 /* Destroy the previously yielded value */
8312 zval_ptr_dtor(&generator->value);
8313
8314 /* Destroy the previously yielded key */
8315 zval_ptr_dtor(&generator->key);
8316
8317 /* Set the new yielded value */
8318 if (OP1_TYPE != IS_UNUSED) {
8319 if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
8320 /* Constants and temporary variables aren't yieldable by reference,
8321 * but we still allow them with a notice. */
8322 if (OP1_TYPE & (IS_CONST|IS_TMP_VAR)) {
8323 zval *value;
8324
8325 zend_error(E_NOTICE, "Only variable references should be yielded by reference");
8326
8327 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
8329 if (OP1_TYPE == IS_CONST) {
8330 if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
8331 Z_ADDREF(generator->value);
8332 }
8333 }
8334 } else {
8335 zval *value_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
8336
8337 /* If a function call result is yielded and the function did
8338 * not return by reference we throw a notice. */
8339 do {
8340 if (OP1_TYPE == IS_VAR) {
8341 ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
8342 if (opline->extended_value == ZEND_RETURNS_FUNCTION
8343 && !Z_ISREF_P(value_ptr)) {
8344 zend_error(E_NOTICE, "Only variable references should be yielded by reference");
8345 ZVAL_COPY(&generator->value, value_ptr);
8346 break;
8347 }
8348 }
8349 if (Z_ISREF_P(value_ptr)) {
8351 } else {
8353 }
8355 } while (0);
8356
8357 FREE_OP1();
8358 }
8359 } else {
8360 zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
8361
8362 /* Consts, temporary variables and references need copying */
8363 if (OP1_TYPE == IS_CONST) {
8365 if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
8366 Z_ADDREF(generator->value);
8367 }
8368 } else if (OP1_TYPE == IS_TMP_VAR) {
8370 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
8372 FREE_OP1_IF_VAR();
8373 } else {
8375 if (OP1_TYPE == IS_CV) {
8377 }
8378 }
8379 }
8380 } else {
8381 /* If no value was specified yield null */
8382 ZVAL_NULL(&generator->value);
8383 }
8384
8385 /* Set the new yielded key */
8386 if (OP2_TYPE != IS_UNUSED) {
8387 zval *key = GET_OP2_ZVAL_PTR(BP_VAR_R);
8388 if ((OP2_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_TYPE_P(key) == IS_REFERENCE)) {
8389 key = Z_REFVAL_P(key);
8390 }
8391 ZVAL_COPY(&generator->key, key);
8392 FREE_OP2();
8393
8394 if (Z_TYPE(generator->key) == IS_LONG
8395 && Z_LVAL(generator->key) > generator->largest_used_integer_key
8396 ) {
8397 generator->largest_used_integer_key = Z_LVAL(generator->key);
8398 }
8399 } else {
8400 /* If no key was specified we use auto-increment keys */
8401 generator->largest_used_integer_key++;
8402 ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
8403 }
8404
8405 if (RETURN_VALUE_USED(opline)) {
8406 /* If the return value of yield is used set the send
8407 * target and initialize it to NULL */
8408 generator->send_target = EX_VAR(opline->result.var);
8409 ZVAL_NULL(generator->send_target);
8410 } else {
8411 generator->send_target = NULL;
8412 }
8413
8414 /* The GOTO VM uses a local opline variable. We need to set the opline
8415 * variable in execute_data so we don't resume at an old position. */
8416 SAVE_OPLINE();
8417
8419}
8420
8422{
8424 zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
8425 zval *val;
8426
8427 SAVE_OPLINE();
8428 val = GET_OP1_ZVAL_PTR(BP_VAR_R);
8429
8430 if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
8431 zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
8432 FREE_OP1();
8433 UNDEF_RESULT();
8435 }
8436
8437ZEND_VM_C_LABEL(yield_from_try_again):
8438 if (Z_TYPE_P(val) == IS_ARRAY) {
8439 ZVAL_COPY_VALUE(&generator->values, val);
8440 if (Z_OPT_REFCOUNTED_P(val)) {
8441 Z_ADDREF_P(val);
8442 }
8443 Z_FE_POS(generator->values) = 0;
8444 FREE_OP1();
8445 } else if (OP1_TYPE != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
8447 if (ce == zend_ce_generator) {
8448 zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
8449
8450 Z_ADDREF_P(val);
8451 FREE_OP1();
8452
8453 if (UNEXPECTED(new_gen->execute_data == NULL)) {
8454 zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
8456 UNDEF_RESULT();
8458 } else if (Z_ISUNDEF(new_gen->retval)) {
8459 if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
8460 zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
8462 UNDEF_RESULT();
8464 } else {
8466 }
8467 } else {
8468 if (RETURN_VALUE_USED(opline)) {
8469 ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
8470 }
8472 }
8473 } else {
8474 zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
8475 FREE_OP1();
8476
8477 if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
8478 if (!EG(exception)) {
8479 zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
8480 }
8481 UNDEF_RESULT();
8483 }
8484
8485 iter->index = 0;
8486 if (iter->funcs->rewind) {
8487 iter->funcs->rewind(iter);
8488 if (UNEXPECTED(EG(exception) != NULL)) {
8489 OBJ_RELEASE(&iter->std);
8490 UNDEF_RESULT();
8492 }
8493 }
8494
8495 ZVAL_OBJ(&generator->values, &iter->std);
8496 }
8497 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(val) == IS_REFERENCE) {
8498 val = Z_REFVAL_P(val);
8499 ZEND_VM_C_GOTO(yield_from_try_again);
8500 } else {
8501 zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
8502 FREE_OP1();
8503 UNDEF_RESULT();
8505 }
8506
8507 /* This is the default return value
8508 * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
8509 if (RETURN_VALUE_USED(opline)) {
8510 ZVAL_NULL(EX_VAR(opline->result.var));
8511 }
8512
8513 /* This generator has no send target (though the generator we delegate to might have one) */
8514 generator->send_target = NULL;
8515
8516 /* The GOTO VM uses a local opline variable. We need to set the opline
8517 * variable in execute_data so we don't resume at an old position. */
8518 SAVE_OPLINE();
8519
8521}
8522
8524{
8526 zval *fast_call = EX_VAR(opline->op1.var);
8527 SAVE_OPLINE();
8528
8529 /* cleanup incomplete RETURN statement */
8530 if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
8531 && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
8532 zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
8533
8535 }
8536
8537 /* cleanup delayed exception */
8538 if (Z_OBJ_P(fast_call) != NULL) {
8539 /* discard the previously thrown exception */
8540 OBJ_RELEASE(Z_OBJ_P(fast_call));
8541 Z_OBJ_P(fast_call) = NULL;
8542 }
8543
8545}
8546
8548{
8550 zval *fast_call = EX_VAR(opline->result.var);
8551
8552 Z_OBJ_P(fast_call) = NULL;
8553 /* set return address */
8554 Z_OPLINE_NUM_P(fast_call) = opline - EX(func)->op_array.opcodes;
8555 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
8556}
8557
8558ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH)
8559{
8561 zval *fast_call = EX_VAR(opline->op1.var);
8562 uint32_t current_try_catch_offset, current_op_num;
8563
8564 if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1) {
8565 const zend_op *fast_ret = EX(func)->op_array.opcodes + Z_OPLINE_NUM_P(fast_call);
8566
8567 ZEND_VM_JMP_EX(fast_ret + 1, 0);
8568 }
8569
8570 /* special case for unhandled exceptions */
8571 EG(exception) = Z_OBJ_P(fast_call);
8572 Z_OBJ_P(fast_call) = NULL;
8573 current_try_catch_offset = opline->op2.num;
8574 current_op_num = opline - EX(func)->op_array.opcodes;
8575 ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, current_op_num);
8576}
8577
8579{
8581 zend_string *varname;
8582 zval *value;
8584 uintptr_t idx;
8585 zend_reference *ref;
8586
8588
8589 varname = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
8590
8591 /* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
8592 idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
8593 if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
8594 Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
8595
8596 if (EXPECTED(p->key == varname) ||
8597 (EXPECTED(p->h == ZSTR_H(varname)) &&
8598 EXPECTED(p->key != NULL) &&
8599 EXPECTED(zend_string_equal_content(p->key, varname)))) {
8600
8601 value = (zval*)p; /* value = &p->val; */
8602 ZEND_VM_C_GOTO(check_indirect);
8603 }
8604 }
8605
8606 value = zend_hash_find_known_hash(&EG(symbol_table), varname);
8607 if (UNEXPECTED(value == NULL)) {
8608 value = zend_hash_add_new(&EG(symbol_table), varname, &EG(uninitialized_zval));
8609 idx = (char*)value - (char*)EG(symbol_table).arData;
8610 /* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
8611 CACHE_PTR(opline->extended_value, (void*)(idx + 1));
8612 } else {
8613 idx = (char*)value - (char*)EG(symbol_table).arData;
8614 /* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
8615 CACHE_PTR(opline->extended_value, (void*)(idx + 1));
8616ZEND_VM_C_LABEL(check_indirect):
8617 /* GLOBAL variable may be an INDIRECT pointer to CV */
8620 if (UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
8622 }
8623 }
8624 }
8625
8626 if (UNEXPECTED(!Z_ISREF_P(value))) {
8628 ref = Z_REF_P(value);
8629 } else {
8630 ref = Z_REF_P(value);
8631 GC_ADDREF(ref);
8632 }
8633
8634 variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
8635
8638
8639 ZVAL_REF(variable_ptr, ref);
8640 SAVE_OPLINE();
8641 if (GC_DELREF(garbage) == 0) {
8643 if (UNEXPECTED(EG(exception))) {
8646 }
8647 } else {
8648 gc_check_possible_root(garbage);
8649 }
8650 } else {
8651 ZVAL_REF(variable_ptr, ref);
8652 }
8653
8656}
8657
8659{
8661 zval *value;
8662
8663 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8664 if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
8665 ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
8666 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
8667 zval_ptr_dtor_str(value);
8668 }
8670 } else {
8671 bool strict;
8672
8673 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
8675 if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
8676 ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
8677 FREE_OP1();
8679 }
8680 }
8681
8682 SAVE_OPLINE();
8683 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
8685 }
8686 strict = EX_USES_STRICT_TYPES();
8687 do {
8688 if (EXPECTED(!strict)) {
8689 zend_string *str;
8690 zval tmp;
8691
8692 if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) {
8694 "strlen(): Passing null to parameter #1 ($string) of type string is deprecated");
8695 ZVAL_LONG(EX_VAR(opline->result.var), 0);
8696 if (UNEXPECTED(EG(exception))) {
8698 }
8699 break;
8700 }
8701
8702 ZVAL_COPY(&tmp, value);
8703 if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
8704 ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
8705 zval_ptr_dtor(&tmp);
8706 break;
8707 }
8708 zval_ptr_dtor(&tmp);
8709 }
8710 if (!EG(exception)) {
8711 zend_type_error("strlen(): Argument #1 ($string) must be of type string, %s given", zend_zval_value_name(value));
8712 }
8713 ZVAL_UNDEF(EX_VAR(opline->result.var));
8714 } while (0);
8715 }
8716 FREE_OP1();
8718}
8719
8720ZEND_VM_HOT_NOCONST_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMPVAR|CV, ANY, TYPE_MASK)
8721{
8723 zval *value;
8724 int result = 0;
8725
8726 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8727 if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
8728ZEND_VM_C_LABEL(type_check_resource):
8729 if (opline->extended_value != MAY_BE_RESOURCE
8731 result = 1;
8732 }
8733 } else if ((OP1_TYPE & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
8735 if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
8736 ZEND_VM_C_GOTO(type_check_resource);
8737 }
8738 } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
8739 result = ((1 << IS_NULL) & opline->extended_value) != 0;
8740 SAVE_OPLINE();
8742 if (UNEXPECTED(EG(exception))) {
8743 ZVAL_UNDEF(EX_VAR(opline->result.var));
8745 }
8746 }
8747 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
8748 SAVE_OPLINE();
8749 FREE_OP1();
8751 } else {
8753 }
8754}
8755
8757{
8759 zend_constant *c;
8760
8761 c = CACHED_PTR(opline->extended_value);
8762 if (EXPECTED(c != NULL)) {
8763 if (!IS_SPECIAL_CACHE_VAL(c)) {
8764ZEND_VM_C_LABEL(defined_true):
8766 } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
8767ZEND_VM_C_LABEL(defined_false):
8769 }
8770 }
8771 if (zend_quick_check_constant(RT_CONSTANT(opline, opline->op1) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
8772 CACHE_PTR(opline->extended_value, ENCODE_SPECIAL_CACHE_NUM(zend_hash_num_elements(EG(zend_constants))));
8773 ZEND_VM_C_GOTO(defined_false);
8774 } else {
8775 ZEND_VM_C_GOTO(defined_true);
8776 }
8777}
8778
8780{
8782
8783 if (EG(assertions) <= 0) {
8784 zend_op *target = OP_JMP_ADDR(opline, opline->op2);
8785 if (RETURN_VALUE_USED(opline)) {
8786 ZVAL_TRUE(EX_VAR(opline->result.var));
8787 }
8788 ZEND_VM_JMP_EX(target, 0);
8789 } else {
8791 }
8792}
8793
8794ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, CV|TMPVAR|UNUSED|CLASS_FETCH, ANY)
8795{
8796 uint32_t fetch_type;
8797 zend_class_entry *called_scope, *scope;
8799
8800 if (OP1_TYPE != IS_UNUSED) {
8801 SAVE_OPLINE();
8802 zval *op = GET_OP1_ZVAL_PTR(BP_VAR_R);
8803 if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
8804 ZVAL_DEREF(op);
8805 if (Z_TYPE_P(op) != IS_OBJECT) {
8806 zend_type_error("Cannot use \"::class\" on %s", zend_zval_value_name(op));
8807 ZVAL_UNDEF(EX_VAR(opline->result.var));
8808 FREE_OP1();
8810 }
8811 }
8812
8813 ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op)->name);
8814 FREE_OP1();
8816 }
8817
8818 fetch_type = opline->op1.num;
8819 scope = EX(func)->op_array.scope;
8820 if (UNEXPECTED(scope == NULL)) {
8821 SAVE_OPLINE();
8822 zend_throw_error(NULL, "Cannot use \"%s\" in the global scope",
8823 fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
8824 fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
8825 ZVAL_UNDEF(EX_VAR(opline->result.var));
8827 }
8828
8829 switch (fetch_type) {
8831 ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
8832 break;
8834 if (UNEXPECTED(scope->parent == NULL)) {
8835 SAVE_OPLINE();
8837 "Cannot use \"parent\" when current class scope has no parent");
8838 ZVAL_UNDEF(EX_VAR(opline->result.var));
8840 }
8841 ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
8842 break;
8844 if (Z_TYPE(EX(This)) == IS_OBJECT) {
8845 called_scope = Z_OBJCE(EX(This));
8846 } else {
8847 called_scope = Z_CE(EX(This));
8848 }
8849 ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
8850 break;
8852 }
8854}
8855
8856ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
8857{
8858 zend_array *args = NULL;
8860 zval *ret = EX(return_value);
8862 uint32_t num_args = EX_NUM_ARGS();
8864
8865 SAVE_OPLINE();
8866
8869 zval *end = p + num_args;
8870
8874 do {
8876 p++;
8877 } while (p != end);
8879 }
8880
8882 execute_data = EG(current_execute_data) = EX(prev_execute_data);
8883
8884 call->func = (fbc->op_array.fn_flags & ZEND_ACC_STATIC) ? fbc->op_array.scope->__callstatic : fbc->op_array.scope->__call;
8885 ZEND_ASSERT(zend_vm_calc_used_stack(2, call->func) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
8887
8888 ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
8889
8891 if (args) {
8893 } else {
8895 }
8897 if (zend_hash_num_elements(Z_ARRVAL_P(call_args)) == 0) {
8898 GC_ADDREF(call->extra_named_params);
8899 ZVAL_ARR(call_args, call->extra_named_params);
8900 } else {
8902 zend_hash_copy(Z_ARRVAL_P(call_args), call->extra_named_params, zval_add_ref);
8903 }
8904 }
8906 fbc = call->func;
8907
8908 if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
8909 if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
8910 init_func_run_time_cache(&fbc->op_array);
8911 }
8913 i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
8919 } else {
8923 if (execute_data) {
8924 LOAD_OPLINE();
8925 }
8928 }
8929 } else {
8930 zval retval;
8931
8933
8934 EG(current_execute_data) = call;
8935
8936#if ZEND_DEBUG
8937 bool should_throw = zend_internal_call_should_throw(fbc, call);
8938#endif
8939
8940 if (ret == NULL) {
8941 ret = &retval;
8942 }
8943
8944 ZVAL_NULL(ret);
8946 if (!zend_execute_internal) {
8947 /* saves one function call if zend_execute_internal is not used */
8948 fbc->internal_function.handler(call, ret);
8949 } else {
8951 }
8952
8953#if ZEND_DEBUG
8954 if (!EG(exception) && call->func) {
8955 if (should_throw) {
8956 zend_internal_call_arginfo_violation(call->func);
8957 }
8958 ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
8959 zend_verify_internal_return_type(call->func, ret));
8960 ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
8961 ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
8962 zend_verify_internal_func_info(call->func, ret);
8963 }
8964#endif
8966
8967 EG(current_execute_data) = call->prev_execute_data;
8968
8971 zend_free_extra_named_params(call->extra_named_params);
8972 }
8973 if (ret == &retval) {
8975 }
8976 }
8977
8978 execute_data = EG(current_execute_data);
8979
8983
8985 zend_object *object = Z_OBJ(call->This);
8986 OBJ_RELEASE(object);
8987 }
8989
8990 if (UNEXPECTED(EG(exception) != NULL)) {
8991 zend_rethrow_exception(execute_data);
8993 }
8994
8998}
8999
9001{
9003 zval *closure, *var;
9004
9005 closure = GET_OP1_ZVAL_PTR(BP_VAR_R);
9006 if (opline->extended_value & ZEND_BIND_REF) {
9007 /* By-ref binding */
9008 var = GET_OP2_ZVAL_PTR(BP_VAR_W);
9009 if (Z_ISREF_P(var)) {
9010 Z_ADDREF_P(var);
9011 } else {
9012 ZVAL_MAKE_REF_EX(var, 2);
9013 }
9014 } else {
9015 var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9016 if (UNEXPECTED(Z_ISUNDEF_P(var)) && !(opline->extended_value & ZEND_BIND_IMPLICIT)) {
9017 SAVE_OPLINE();
9018 var = ZVAL_UNDEFINED_OP2();
9019 if (UNEXPECTED(EG(exception))) {
9021 }
9022 }
9023 ZVAL_DEREF(var);
9024 Z_TRY_ADDREF_P(var);
9025 }
9026
9028 (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)), var);
9030}
9031
9033{
9035 HashTable *ht;
9036 zval *value;
9038
9039 variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
9040
9041 SAVE_OPLINE();
9042
9043 ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
9044 if (!ht) {
9045 ht = zend_array_dup(EX(func)->op_array.static_variables);
9046 ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
9047 }
9048 ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
9049
9050 value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT)));
9051
9052 if (opline->extended_value & ZEND_BIND_REF) {
9053 if (UNEXPECTED(!Z_ISREF_P(value))) {
9055 GC_SET_REFCOUNT(ref, 2);
9057 if (OP2_TYPE == IS_UNUSED) {
9058 ZVAL_COPY_VALUE(&ref->val, value);
9059 } else {
9061 ZVAL_COPY(&ref->val, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R));
9062 FREE_OP2();
9063 }
9064 ref->sources.ptr = NULL;
9065 Z_REF_P(value) = ref;
9067 i_zval_ptr_dtor(variable_ptr);
9068 ZVAL_REF(variable_ptr, ref);
9069 } else {
9071 i_zval_ptr_dtor(variable_ptr);
9073 if (OP2_TYPE != IS_UNUSED) {
9074 FREE_OP2();
9075 }
9076 }
9077 } else {
9078 i_zval_ptr_dtor(variable_ptr);
9080 }
9081
9083}
9084
9086{
9088 HashTable *ht;
9089 zval *value;
9091
9092 variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
9093
9094 ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
9095 if (!ht) {
9097 }
9098 ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
9099
9100 value = (zval*)((char*)ht->arData + opline->extended_value);
9101 if (Z_TYPE_P(value) == IS_NULL) {
9103 } else {
9104 SAVE_OPLINE();
9109 ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 1);
9110 }
9111}
9112
9114{
9116
9117 if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
9118 zval *result = EX_VAR(opline->result.var);
9119
9120 ZVAL_OBJ(result, Z_OBJ(EX(This)));
9123 } else {
9124 ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
9125 }
9126}
9127
9129{
9131
9132 /* For symbol tables we need to deal with exactly the same problems as for property tables. */
9133 ZVAL_ARR(EX_VAR(opline->result.var),
9134 zend_proptable_to_symtable(&EG(symbol_table), /* always_duplicate */ 1));
9136}
9137
9139{
9141
9142 ZVAL_BOOL(EX_VAR(opline->result.var),
9143 (opline->extended_value & ZEND_ISEMPTY) ^
9144 (Z_TYPE(EX(This)) == IS_OBJECT));
9146}
9147
9149{
9151 zval *op1 = EX_VAR(opline->op1.var);
9152
9154 SAVE_OPLINE();
9157 }
9159}
9160
9162{
9164 zval *op1 = EX_VAR(opline->op1.var);
9165
9166 if (OP1_TYPE == IS_CV) {
9167 if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
9171 ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
9172 } else {
9173 if (Z_ISREF_P(op1)) {
9174 Z_ADDREF_P(op1);
9175 } else {
9177 }
9178 ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
9179 }
9180 } else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
9181 op1 = Z_INDIRECT_P(op1);
9182 if (EXPECTED(!Z_ISREF_P(op1))) {
9184 } else {
9186 }
9187 ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
9188 } else {
9189 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
9190 }
9192}
9193
9195{
9197 zval *op, *jump_zv;
9198 HashTable *jumptable;
9199
9200 op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9201
9202 if (Z_TYPE_P(op) != IS_LONG) {
9203 ZVAL_DEREF(op);
9204 if (Z_TYPE_P(op) != IS_LONG) {
9205 /* Wrong type, fall back to ZEND_CASE chain */
9207 }
9208 }
9209
9210 jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
9211 jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
9212 if (jump_zv != NULL) {
9213 ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
9215 } else {
9216 /* default */
9217 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
9219 }
9220}
9221
9223{
9225 zval *op, *jump_zv;
9226 HashTable *jumptable;
9227
9228 op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9229
9230 if (Z_TYPE_P(op) != IS_STRING) {
9231 if (OP1_TYPE == IS_CONST) {
9232 /* Wrong type, fall back to ZEND_CASE chain */
9234 } else {
9235 ZVAL_DEREF(op);
9236 if (Z_TYPE_P(op) != IS_STRING) {
9237 /* Wrong type, fall back to ZEND_CASE chain */
9239 }
9240 }
9241 }
9242
9243 jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
9244 jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), OP1_TYPE == IS_CONST);
9245 if (jump_zv != NULL) {
9246 ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
9248 } else {
9249 /* default */
9250 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
9252 }
9253}
9254
9256{
9258 zval *op, *jump_zv;
9259 HashTable *jumptable;
9260
9261 op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9262 jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
9263
9264ZEND_VM_C_LABEL(match_try_again):
9265 if (Z_TYPE_P(op) == IS_LONG) {
9266 jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
9267 } else if (Z_TYPE_P(op) == IS_STRING) {
9268 jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), OP1_TYPE == IS_CONST);
9269 } else if (Z_TYPE_P(op) == IS_REFERENCE) {
9270 op = Z_REFVAL_P(op);
9271 ZEND_VM_C_GOTO(match_try_again);
9272 } else {
9273 if (UNEXPECTED((OP1_TYPE & IS_CV) && Z_TYPE_P(op) == IS_UNDEF)) {
9274 SAVE_OPLINE();
9275 op = ZVAL_UNDEFINED_OP1();
9276 if (UNEXPECTED(EG(exception))) {
9278 }
9279 ZEND_VM_C_GOTO(match_try_again);
9280 }
9281
9282 ZEND_VM_C_GOTO(default_branch);
9283 }
9284
9285 if (jump_zv != NULL) {
9286 ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
9288 } else {
9289ZEND_VM_C_LABEL(default_branch):
9290 /* default */
9291 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
9293 }
9294}
9295
9297{
9299 zval *op;
9300
9301 SAVE_OPLINE();
9302 op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9305}
9306
9308{
9310 zval *op1;
9311 HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
9312 zval *result;
9313
9314 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9315 if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
9316 result = zend_hash_find_ex(ht, Z_STR_P(op1), OP1_TYPE == IS_CONST);
9317 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
9318 zval_ptr_dtor_str(op1);
9319 }
9321 }
9322
9323 if (opline->extended_value) {
9324 if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
9327 }
9328 SAVE_OPLINE();
9329 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
9330 op1 = Z_REFVAL_P(op1);
9331 if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
9333 FREE_OP1();
9335 } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
9337 FREE_OP1();
9339 }
9340 } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
9342 }
9343 } else if (Z_TYPE_P(op1) <= IS_FALSE) {
9344 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
9345 SAVE_OPLINE();
9347 if (UNEXPECTED(EG(exception) != NULL)) {
9349 }
9350 }
9353 } else {
9355 zval key_tmp;
9356
9357 if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
9358 op1 = Z_REFVAL_P(op1);
9359 if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
9361 FREE_OP1();
9363 }
9364 }
9365
9366 SAVE_OPLINE();
9368 ZVAL_STR(&key_tmp, key);
9369 if (zend_compare(op1, &key_tmp) == 0) {
9370 FREE_OP1();
9372 }
9374 }
9375 FREE_OP1();
9377}
9378
9380{
9382 zval *op1;
9384
9385 SAVE_OPLINE();
9386 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9387
9388 while (1) {
9389 if (Z_TYPE_P(op1) == IS_ARRAY) {
9390 count = zend_hash_num_elements(Z_ARRVAL_P(op1));
9391 break;
9392 } else if (Z_TYPE_P(op1) == IS_OBJECT) {
9394
9395 /* first, we check if the handler is defined */
9396 if (zobj->handlers->count_elements) {
9397 if (SUCCESS == zobj->handlers->count_elements(zobj, &count)) {
9398 break;
9399 }
9400 if (UNEXPECTED(EG(exception))) {
9401 count = 0;
9402 break;
9403 }
9404 }
9405
9406 /* if not and the object implements Countable we call its count() method */
9408 zval retval;
9409
9410 zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
9411 zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
9412 count = zval_get_long(&retval);
9414 break;
9415 }
9416
9417 /* If There's no handler and it doesn't implement Countable then emit a TypeError */
9418 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
9419 op1 = Z_REFVAL_P(op1);
9420 continue;
9421 } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
9423 }
9424 count = 0;
9425 zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_value_name(op1));
9426 break;
9427 }
9428
9429 ZVAL_LONG(EX_VAR(opline->result.var), count);
9430 FREE_OP1();
9432}
9433
9435{
9437 zend_array *ht = Z_ARRVAL_P(GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R));
9438 ZVAL_LONG(EX_VAR(opline->result.var), zend_hash_num_elements(ht));
9439 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR) && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
9440 SAVE_OPLINE();
9442 if (EG(exception)) {
9444 }
9445 }
9447}
9448
9450{
9452
9453 if (OP1_TYPE == IS_UNUSED) {
9454 SAVE_OPLINE();
9455 if (UNEXPECTED(!EX(func)->common.scope)) {
9456 zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
9457 ZVAL_UNDEF(EX_VAR(opline->result.var));
9459 } else {
9460 zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
9461 ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
9462 if (UNEXPECTED(EG(exception))) {
9464 }
9466 }
9467 } else {
9468 zval *op1;
9469
9470 SAVE_OPLINE();
9471 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9472 while (1) {
9473 if (Z_TYPE_P(op1) == IS_OBJECT) {
9474 ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
9475 } else if ((OP1_TYPE & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
9476 op1 = Z_REFVAL_P(op1);
9477 continue;
9478 } else {
9479 if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
9481 }
9482 zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
9483 ZVAL_UNDEF(EX_VAR(opline->result.var));
9484 }
9485 break;
9486 }
9487 FREE_OP1();
9489 }
9490}
9491
9493{
9495
9496 if (Z_TYPE(EX(This)) == IS_OBJECT) {
9497 ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE(EX(This))->name);
9498 } else if (Z_CE(EX(This))) {
9499 ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_CE(EX(This))->name);
9500 } else {
9501 ZEND_ASSERT(!EX(func)->common.scope);
9502 SAVE_OPLINE();
9503 zend_throw_error(NULL, "get_called_class() must be called from within a class");
9504 ZVAL_UNDEF(EX_VAR(opline->result.var));
9506 }
9508}
9509
9511{
9513 zval *op1;
9515
9516 SAVE_OPLINE();
9517 op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9519 if (EXPECTED(type)) {
9520 ZVAL_INTERNED_STR(EX_VAR(opline->result.var), type);
9521 } else {
9522 ZVAL_STRING(EX_VAR(opline->result.var), "unknown type");
9523 }
9524 FREE_OP1();
9526}
9527
9529{
9531
9532 ZVAL_LONG(EX_VAR(opline->result.var), EX_NUM_ARGS());
9534}
9535
9537{
9539 zend_array *ht;
9540 uint32_t arg_count, result_size, skip;
9541
9542 arg_count = EX_NUM_ARGS();
9543 if (OP1_TYPE == IS_CONST) {
9544 skip = Z_LVAL_P(RT_CONSTANT(opline, opline->op1));
9545 if (arg_count < skip) {
9546 result_size = 0;
9547 } else {
9548 result_size = arg_count - skip;
9549 }
9550 } else {
9551 skip = 0;
9552 result_size = arg_count;
9553 }
9554
9555 if (result_size) {
9556 SAVE_OPLINE();
9557 uint32_t first_extra_arg = EX(func)->op_array.num_args;
9558
9559 ht = zend_new_array(result_size);
9560 ZVAL_ARR(EX_VAR(opline->result.var), ht);
9563 zval *p, *q;
9564 uint32_t i = skip;
9565 p = EX_VAR_NUM(i);
9566 if (arg_count > first_extra_arg) {
9567 while (i < first_extra_arg) {
9568 q = p;
9569 if (EXPECTED(Z_TYPE_INFO_P(q) != IS_UNDEF)) {
9570 ZVAL_DEREF(q);
9571 if (Z_OPT_REFCOUNTED_P(q)) {
9572 Z_ADDREF_P(q);
9573 }
9575 } else {
9577 }
9579 p++;
9580 i++;
9581 }
9582 if (skip < first_extra_arg) {
9583 skip = 0;
9584 } else {
9585 skip -= first_extra_arg;
9586 }
9587 p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T + skip);
9588 }
9589 while (i < arg_count) {
9590 q = p;
9591 if (EXPECTED(Z_TYPE_INFO_P(q) != IS_UNDEF)) {
9592 ZVAL_DEREF(q);
9593 if (Z_OPT_REFCOUNTED_P(q)) {
9594 Z_ADDREF_P(q);
9595 }
9597 } else {
9599 }
9601 p++;
9602 i++;
9603 }
9605 ht->nNumOfElements = result_size;
9606 } else {
9607 ZVAL_EMPTY_ARRAY(EX_VAR(opline->result.var));
9608 }
9610}
9611
9612/* Contrary to what its name indicates, ZEND_COPY_TMP may receive and define references. */
9614{
9616 zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
9617 zval *result = EX_VAR(opline->result.var);
9620}
9621
9623{
9626
9627 zend_closure_from_frame(EX_VAR(opline->result.var), call);
9628
9630 OBJ_RELEASE(Z_OBJ(call->This));
9631 }
9632
9633 EX(call) = call->prev_execute_data;
9634
9636
9638}
9639
9640ZEND_VM_HANDLER(208, ZEND_JMP_FRAMELESS, CONST, JMP_ADDR, NUM|CACHE_SLOT)
9641{
9643 zend_jmp_fl_result result = (uintptr_t)CACHED_PTR(opline->extended_value);
9644ZEND_VM_C_LABEL(try_again):
9646 OPLINE = OP_JMP_ADDR(opline, opline->op2);
9648 } else if (EXPECTED(result == ZEND_JMP_FL_MISS)) {
9650 } else {
9652 /* func_name refers to the function in the local namespace, e.g. foo\substr. */
9653 zval *func_name = (zval *)RT_CONSTANT(opline, opline->op1);
9654 /* If it cannot be found locally, we must be referring to the global function. */
9655 zval *func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(func_name));
9656 /* ZEND_JMP_FL_MISS = 1, ZEND_JMP_FL_HIT = 2 */
9657 result = (func == NULL) + 1;
9658 CACHE_PTR(opline->extended_value, (void *)result);
9659 ZEND_VM_C_GOTO(try_again);
9660 }
9661}
9662
9664{
9666 SAVE_OPLINE();
9667
9668 zval *result = EX_VAR(opline->result.var);
9670
9671#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9672 if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9674 } else
9675#endif
9676 {
9678 function(EX_VAR(opline->result.var));
9679 }
9681}
9682
9683ZEND_VM_HANDLER(205, ZEND_FRAMELESS_ICALL_1, ANY, UNUSED, SPEC(OBSERVER))
9684{
9686 SAVE_OPLINE();
9687
9688 zval *result = EX_VAR(opline->result.var);
9690 zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9692 FREE_OP1();
9694 }
9695
9696#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9697 if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9699 } else
9700#endif
9701 {
9704 }
9705 FREE_OP1();
9707}
9708
9709ZEND_VM_HANDLER(206, ZEND_FRAMELESS_ICALL_2, ANY, ANY, SPEC(OBSERVER))
9710{
9712 SAVE_OPLINE();
9713
9714 zval *result = EX_VAR(opline->result.var);
9716 zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9717 zval *arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9718 if (EG(exception)) {
9719 FREE_OP1();
9720 FREE_OP2();
9722 }
9723
9724#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9725 if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9727 } else
9728#endif
9729 {
9732 }
9733
9734 FREE_OP1();
9735 /* Set OP1 to UNDEF in case FREE_OP2() throws. */
9736 if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
9737 ZVAL_UNDEF(EX_VAR(opline->op1.var));
9738 }
9739 FREE_OP2();
9741}
9742
9743ZEND_VM_HANDLER(207, ZEND_FRAMELESS_ICALL_3, ANY, ANY, SPEC(OBSERVER))
9744{
9746 SAVE_OPLINE();
9747
9748 zval *result = EX_VAR(opline->result.var);
9750 zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9751 zval *arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9752 zval *arg3 = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
9753 if (EG(exception)) {
9754 FREE_OP1();
9755 FREE_OP2();
9756 FREE_OP_DATA();
9758 }
9759
9760#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9761 if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9763 } else
9764#endif
9765 {
9768 }
9769
9770 FREE_OP1();
9771 /* Set to UNDEF in case FREE_OP2() throws. */
9772 if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
9773 ZVAL_UNDEF(EX_VAR(opline->op1.var));
9774 }
9775 FREE_OP2();
9776 if (OP2_TYPE & (IS_VAR|IS_TMP_VAR)) {
9777 ZVAL_UNDEF(EX_VAR(opline->op2.var));
9778 }
9779 FREE_OP_DATA();
9781}
9782
9784{
9786 SAVE_OPLINE();
9787
9788 zend_class_entry *ce = EX(func)->common.scope;
9789 ZEND_ASSERT(ce);
9790
9791 zend_class_entry *parent_ce = ce->parent;
9792 if (!parent_ce) {
9793 zend_throw_error(NULL, "Cannot use \"parent\" when current class scope has no parent");
9794 UNDEF_RESULT();
9796 }
9797
9798 zend_string *property_name = Z_STR_P(RT_CONSTANT(opline, opline->op1));
9799 zend_property_hook_kind hook_kind = opline->op2.num;
9800
9801 zend_property_info *prop_info = zend_hash_find_ptr(&parent_ce->properties_info, property_name);
9802 if (!prop_info) {
9803 zend_throw_error(NULL, "Undefined property %s::$%s", ZSTR_VAL(parent_ce->name), ZSTR_VAL(property_name));
9804 UNDEF_RESULT();
9806 }
9807 if (prop_info->flags & ZEND_ACC_PRIVATE) {
9808 zend_throw_error(NULL, "Cannot access private property %s::$%s", ZSTR_VAL(parent_ce->name), ZSTR_VAL(property_name));
9809 UNDEF_RESULT();
9811 }
9812
9813 zend_function **hooks = prop_info->hooks;
9814 zend_function *hook = hooks ? hooks[hook_kind] : NULL;
9815
9817 if (hook) {
9818 call = zend_vm_stack_push_call_frame(
9820 hook, opline->extended_value, Z_OBJ_P(ZEND_THIS));
9821 if (EXPECTED(hook->type == ZEND_USER_FUNCTION)) {
9822 if (UNEXPECTED(!RUN_TIME_CACHE(&hook->op_array))) {
9823 init_func_run_time_cache(&hook->op_array);
9824 }
9825 call->run_time_cache = RUN_TIME_CACHE(&hook->op_array);
9826 }
9827 } else {
9828 zend_function *fbc = zend_get_property_hook_trampoline(prop_info, hook_kind, property_name);
9829 call = zend_vm_stack_push_call_frame(
9831 fbc, opline->extended_value, Z_OBJ_P(ZEND_THIS));
9832 }
9833
9834 call->prev_execute_data = EX(call);
9835 EX(call) = call;
9837}
9838
9839ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_JMP, (OP_JMP_ADDR(op, op->op1) > op), ZEND_JMP_FORWARD, JMP_ADDR, ANY)
9840{
9842
9843 OPLINE = OP_JMP_ADDR(opline, opline->op1);
9845}
9846
9847ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_ADD_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9848{
9850 zval *op1, *op2, *result;
9851
9852 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9853 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9854 result = EX_VAR(opline->result.var);
9857}
9858
9859ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_ADD_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9860{
9862 zval *op1, *op2, *result;
9863
9864 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9865 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9866 result = EX_VAR(opline->result.var);
9867 fast_long_add_function(result, op1, op2);
9869}
9870
9871ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_ADD_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9872{
9874 zval *op1, *op2, *result;
9875
9876 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9877 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9878 result = EX_VAR(opline->result.var);
9881}
9882
9883ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_SUB_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
9884{
9886 zval *op1, *op2, *result;
9887
9888 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9889 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9890 result = EX_VAR(opline->result.var);
9893}
9894
9895ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_SUB_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
9896{
9898 zval *op1, *op2, *result;
9899
9900 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9901 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9902 result = EX_VAR(opline->result.var);
9903 fast_long_sub_function(result, op1, op2);
9905}
9906
9907ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_SUB_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
9908{
9910 zval *op1, *op2, *result;
9911
9912 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9913 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9914 result = EX_VAR(opline->result.var);
9917}
9918
9919ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_MUL_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9920{
9922 zval *op1, *op2, *result;
9923
9924 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9925 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9926 result = EX_VAR(opline->result.var);
9929}
9930
9931ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_MUL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9932{
9934 zval *op1, *op2, *result;
9935 zend_long overflow;
9936
9937 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9938 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9939 result = EX_VAR(opline->result.var);
9941 Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
9943}
9944
9945ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_MUL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
9946{
9948 zval *op1, *op2, *result;
9949
9950 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9951 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9952 result = EX_VAR(opline->result.var);
9955}
9956
9957ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_EQUAL|ZEND_IS_IDENTICAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
9958{
9960 zval *op1, *op2;
9961 bool result;
9962
9963 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9964 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9965 result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
9967}
9968
9969ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_EQUAL|ZEND_IS_IDENTICAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
9970{
9972 zval *op1, *op2;
9973 bool result;
9974
9975 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9976 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9977 result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
9979}
9980
9981ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL|ZEND_IS_NOT_IDENTICAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_NOT_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
9982{
9984 zval *op1, *op2;
9985 bool result;
9986
9987 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
9988 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
9989 result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
9991}
9992
9993ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL|ZEND_IS_NOT_IDENTICAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_NOT_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
9994{
9996 zval *op1, *op2;
9997 bool result;
9998
9999 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10000 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10001 result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
10003}
10004
10005ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF)), ZEND_IS_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
10006{
10007 /* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
10008 /* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
10009 /* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
10011 zval *op1, *op2;
10012 bool result;
10013
10014 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10015 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10016 result = fast_is_identical_function(op1, op2);
10017 /* Free is a no-op for const/cv */
10019}
10020
10021ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF)), ZEND_IS_NOT_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
10022{
10024 zval *op1, *op2;
10025 bool result;
10026
10027 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10028 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10029 result = fast_is_identical_function(op1, op2);
10030 /* Free is a no-op for const/cv */
10032}
10033
10034ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
10035{
10037 zval *op1, *op2;
10038 bool result;
10039
10040 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10041 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10042 result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
10044}
10045
10046ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_SMALLER_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
10047{
10049 zval *op1, *op2;
10050 bool result;
10051
10052 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10053 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10054 result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
10056}
10057
10058ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER_OR_EQUAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_OR_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
10059{
10061 zval *op1, *op2;
10062 bool result;
10063
10064 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10065 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10066 result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
10068}
10069
10070ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER_OR_EQUAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_SMALLER_OR_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
10071{
10073 zval *op1, *op2;
10074 bool result;
10075
10076 op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10077 op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10078 result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
10080}
10081
10082ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_INC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
10083{
10085 zval *var_ptr;
10086
10087 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10088 Z_LVAL_P(var_ptr)++;
10089 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
10090 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10091 }
10093}
10094
10095ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == MAY_BE_LONG), ZEND_PRE_INC_LONG, CV, ANY, SPEC(RETVAL))
10096{
10098 zval *var_ptr;
10099
10100 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10102 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
10103 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
10104 }
10106}
10107
10108ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
10109{
10111 zval *var_ptr;
10112
10113 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10114 Z_LVAL_P(var_ptr)--;
10115 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
10116 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10117 }
10119}
10120
10121ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG, CV, ANY, SPEC(RETVAL))
10122{
10124 zval *var_ptr;
10125
10126 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10128 if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
10129 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
10130 }
10132}
10133
10134ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG_NO_OVERFLOW, CV, ANY)
10135{
10137 zval *var_ptr;
10138
10139 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10140 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10143}
10144
10145ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG, CV, ANY)
10146{
10148 zval *var_ptr;
10149
10150 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10151 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10154}
10155
10156ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG_NO_OVERFLOW, CV, ANY)
10157{
10159 zval *var_ptr;
10160
10161 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10162 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10163 Z_LVAL_P(var_ptr)--;
10165}
10166
10167ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG, CV, ANY)
10168{
10170 zval *var_ptr;
10171
10172 var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10173 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
10176}
10177
10178ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_LONG), ZEND_QM_ASSIGN_LONG, CONST|TMPVARCV, ANY)
10179{
10181 zval *value;
10182
10183 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10184 ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(value));
10186}
10187
10188ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_DOUBLE), ZEND_QM_ASSIGN_DOUBLE, CONST|TMPVARCV, ANY)
10189{
10191 zval *value;
10192
10193 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10194 ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(value));
10196}
10197
10198ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))), ZEND_QM_ASSIGN_NOREF, CONST|TMPVARCV, ANY)
10199{
10201 zval *value;
10202
10203 value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10204 ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
10206}
10207
10209{
10211 zval *container, *dim, *value;
10213 HashTable *ht;
10214
10215 container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10216 dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
10218ZEND_VM_C_LABEL(fetch_dim_r_index_array):
10219 if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
10220 offset = Z_LVAL_P(dim);
10221 } else {
10222 SAVE_OPLINE();
10223 zend_fetch_dimension_address_read_R(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
10224 FREE_OP1();
10226 }
10228 ZEND_HASH_INDEX_FIND(ht, offset, value, ZEND_VM_C_LABEL(fetch_dim_r_index_undef));
10229 ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
10230 if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
10231 SAVE_OPLINE();
10232 FREE_OP1();
10234 } else {
10236 }
10237 } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
10240 ZEND_VM_C_GOTO(fetch_dim_r_index_array);
10241 } else {
10242 ZEND_VM_C_GOTO(fetch_dim_r_index_slow);
10243 }
10244 } else {
10245ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
10246 SAVE_OPLINE();
10247 if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
10248 dim++;
10249 }
10250 zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
10251 FREE_OP1();
10253 }
10254
10255ZEND_VM_C_LABEL(fetch_dim_r_index_undef):
10256 ZVAL_NULL(EX_VAR(opline->result.var));
10257 SAVE_OPLINE();
10258 zend_undefined_offset(offset);
10259 FREE_OP1();
10261}
10262
10263ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR, op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_SIMPLE, CV|VAR, NUM)
10264{
10266 zval *varptr, *arg;
10267
10268 varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10269 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
10270
10271 if (OP1_TYPE == IS_CV) {
10273 } else /* if (OP1_TYPE == IS_VAR) */ {
10275 }
10276
10278}
10279
10280ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, UNUSED|NUM)
10281{
10283 zval *varptr, *arg;
10284 uint32_t arg_num = opline->op2.num;
10285
10287 ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
10288 }
10289
10290 varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
10291 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
10292
10293 if (OP1_TYPE == IS_CV) {
10295 } else /* if (OP1_TYPE == IS_VAR) */ {
10297 }
10298
10300}
10301
10302ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL, op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_SIMPLE, CONST, NUM)
10303{
10305 zval *value, *arg;
10306
10307 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
10308 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
10311}
10312
10313ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL_EX, op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_EX_SIMPLE, CONST, NUM)
10314{
10316 zval *value, *arg;
10317 uint32_t arg_num = opline->op2.num;
10318
10319 arg = ZEND_CALL_VAR(EX(call), opline->result.var);
10321 ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper, _arg_num, arg_num, _arg, arg);
10322 }
10323 value = GET_OP1_ZVAL_PTR(BP_VAR_R);
10326}
10327
10328ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY, ZEND_FE_FETCH_R_SIMPLE, VAR, CV, JMP_ADDR, SPEC(RETVAL))
10329{
10331 zval *array;
10333 uint32_t value_type;
10334 HashTable *fe_ht;
10336
10337 array = EX_VAR(opline->op1.var);
10338 SAVE_OPLINE();
10339 fe_ht = Z_ARRVAL_P(array);
10340 pos = Z_FE_POS_P(array);
10341 if (HT_IS_PACKED(fe_ht)) {
10342 value = fe_ht->arPacked + pos;
10343 while (1) {
10344 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
10345 /* reached end of iteration */
10346 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
10348 }
10349 value_type = Z_TYPE_INFO_P(value);
10350 ZEND_ASSERT(value_type != IS_INDIRECT);
10351 if (EXPECTED(value_type != IS_UNDEF)) {
10352 break;
10353 }
10354 pos++;
10355 value++;
10356 }
10357 Z_FE_POS_P(array) = pos + 1;
10358 if (RETURN_VALUE_USED(opline)) {
10359 ZVAL_LONG(EX_VAR(opline->result.var), pos);
10360 }
10361 } else {
10362 Bucket *p;
10363
10364 p = fe_ht->arData + pos;
10365 while (1) {
10366 if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
10367 /* reached end of iteration */
10368 ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
10370 }
10371 pos++;
10372 value = &p->val;
10373 value_type = Z_TYPE_INFO_P(value);
10374 ZEND_ASSERT(value_type != IS_INDIRECT);
10375 if (EXPECTED(value_type != IS_UNDEF)) {
10376 break;
10377 }
10378 p++;
10379 }
10380 Z_FE_POS_P(array) = pos;
10381 if (RETURN_VALUE_USED(opline)) {
10382 if (!p->key) {
10383 ZVAL_LONG(EX_VAR(opline->result.var), p->h);
10384 } else {
10385 ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
10386 }
10387 }
10388 }
10389
10390 variable_ptr = EX_VAR(opline->op2.var);
10391 zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
10393}
10394
10396
10397ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY)
10398{
10399 zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
10400 SAVE_OPLINE();
10401 if (zend_atomic_bool_load_ex(&EG(timed_out))) {
10402 zend_timeout();
10403 } else if (zend_interrupt_function) {
10405 if (EG(exception)) {
10406 /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */
10407 const zend_op *throw_op = EG(opline_before_exception);
10408
10409 if (throw_op
10410 && throw_op->result_type & (IS_TMP_VAR|IS_VAR)
10411 && throw_op->opcode != ZEND_ADD_ARRAY_ELEMENT
10412 && throw_op->opcode != ZEND_ADD_ARRAY_UNPACK
10413 && throw_op->opcode != ZEND_ROPE_INIT
10414 && throw_op->opcode != ZEND_ROPE_ADD) {
10415 ZVAL_UNDEF(ZEND_CALL_VAR(EG(current_execute_data), throw_op->result.var));
10416
10417 }
10418 }
10419 ZEND_VM_ENTER();
10420 }
10422}
size_t len
Definition apprentice.c:174
bool exception
Definition assert.c:30
count(Countable|array $value, int $mode=COUNT_NORMAL)
error($message)
Definition ext_skel.php:22
zend_ffi_type * type
Definition ffi.c:3812
zval * zv
Definition ffi.c:3975
new_type size
Definition ffi.c:4365
zend_string * res
Definition ffi.c:4692
memcpy(ptr1, ptr2, size)
zval * arg
Definition ffi.c:3975
zval * val
Definition ffi.c:4262
HashTable * ht
Definition ffi.c:4838
zend_ffi_type * old_type
Definition ffi.c:3971
zend_long offset
#define NULL
Definition gdcache.h:45
#define SUCCESS
Definition hash_sha3.c:261
foreach($dp as $el) foreach( $dp as $el) if( $pass2< 2) echo ""
#define UNUSED(x)
Definition minilua.c:214
unsigned const char * end
Definition php_ffi.h:51
unsigned const char * pos
Definition php_ffi.h:52
zend_stack handlers
Definition php_output.h:139
unsigned char key[REFLECTION_KEY_LEN]
const char * func_name
zend_string * lcname
zend_object * ex
original_stack top
p
Definition session.c:1105
#define EVAL(op, r, addr)
#define NUM(c)
Definition snprintf.c:435
spl_ce_SplDoublyLinkedList get_iterator
#define VAR(i)
uint32_t nNumUsed
Definition zend_types.h:406
Bucket * arData
Definition zend_types.h:403
zval * arPacked
Definition zend_types.h:404
zend_class_entry * ce
HashTable properties_info
Definition zend.h:164
zend_object_iterator *(* get_iterator)(zend_class_entry *ce, zval *object, int by_ref)
Definition zend.h:198
zend_string * name
Definition zend.h:149
uint32_t ce_flags
Definition zend.h:156
char type
Definition zend.h:148
zend_function *(* get_static_method)(zend_class_entry *ce, zend_string *method)
Definition zend.h:199
zend_function * constructor
Definition zend.h:172
uint32_t enum_backing_type
Definition zend.h:221
zend_class_entry * parent
Definition zend.h:152
zend_function * clone
Definition zend.h:174
zend_string * name
zend_execute_data * prev_execute_data
zend_array * symbol_table
zend_function * func
const zend_op * opline
zend_function * function_handler
Definition zend_API.h:60
zend_class_entry * called_scope
Definition zend_API.h:62
zend_object * object
Definition zend_API.h:63
zend_execute_data * execute_data
zend_object_get_method_t get_method
void(* get_current_key)(zend_object_iterator *iter, zval *key)
void(* rewind)(zend_object_iterator *iter)
void(* move_forward)(zend_object_iterator *iter)
zend_result(* valid)(zend_object_iterator *iter)
zval *(* get_current_data)(zend_object_iterator *iter)
const zend_object_iterator_funcs * funcs
zend_class_entry * ce
Definition zend_types.h:560
const zend_object_handlers * handlers
Definition zend_types.h:561
zend_op * opcodes
znode_op op1
uint8_t result_type
znode_op result
uint8_t opcode
uint32_t extended_value
zend_property_info_source_list sources
Definition zend_types.h:591
zend_class_entry * scope
zend_op_array op_array
struct _zend_function::@236135173067030250234125302313220025134003177336 common
uint32_t fn_flags
uint32_t var
struct _zend_property_info * ptr
Definition zend_types.h:580
ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format,...)
Definition zend.c:1670
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
Definition zend.c:1703
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
Definition zend.c:1772
ZEND_API zend_class_entry * zend_standard_class_def
Definition zend.c:83
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
Definition zend.c:1824
ZEND_API void(* zend_ticks_function)(int ticks)
Definition zend.c:88
ZEND_API void(* zend_interrupt_function)(zend_execute_data *execute_data)
Definition zend.c:89
ZEND_API zend_write_func_t zend_write
Definition zend.c:85
ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long *dest, uint32_t arg_num)
Definition zend_API.c:557
ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type)
Definition zend_API.c:1518
ZEND_API const char * zend_zval_value_name(const zval *arg)
Definition zend_API.c:148
ZEND_API const char * zend_zval_type_name(const zval *arg)
Definition zend_API.c:167
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
Definition zend_API.c:1849
ZEND_API ZEND_COLD void zend_wrong_property_read(zval *object, zval *property)
Definition zend_API.c:103
ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error)
Definition zend_API.c:4271
ZEND_API zend_string * zend_zval_get_legacy_type(const zval *arg)
Definition zend_API.c:184
ZEND_API zend_result zend_update_class_constant(zend_class_constant *c, const zend_string *name, zend_class_entry *scope)
Definition zend_API.c:1490
ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num)
Definition zend_API.c:751
struct _zend_fcall_info_cache zend_fcall_info_cache
#define ZVAL_STRING(z, s)
Definition zend_API.h:956
#define array_init_size(arg, size)
Definition zend_API.h:538
ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data)
#define CE_CONSTANTS_TABLE(ce)
Definition zend_API.h:331
#define ZEND_THIS
Definition zend_API.h:523
ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data)
ZEND_API zend_array * zend_rebuild_symbol_table(void)
#define ZVAL_STRINGL(z, s, l)
Definition zend_API.h:952
#define efree_size(ptr, size)
Definition zend_alloc.h:138
#define efree(ptr)
Definition zend_alloc.h:155
#define ALLOC_HASHTABLE(ht)
Definition zend_alloc.h:231
#define emalloc(size)
Definition zend_alloc.h:151
struct _zval_struct zval
error_reporting(?int $error_level=null)
#define RETURN_VALUE_USED(opline)
Definition zend_cfg.h:113
ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr)
uint32_t num_args
ZEND_API zend_class_entry * zend_ce_closure
zend_string_release_ex(func->internal_function.function_name, 0)
execute_data func
void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val)
void zend_closure_from_frame(zval *return_value, zend_execute_data *call)
zval * args
#define ZEND_CLOSURE_OBJECT(op_array)
ZEND_API bool zend_is_smart_branch(const zend_op *opline)
ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name)
ZEND_API zend_class_entry * zend_bind_class_in_slot(zval *class_table_slot, zval *lcname, zend_string *lc_parent_name)
ZEND_API zend_result do_bind_function(zend_function *func, zval *lcname)
ZEND_API zend_result zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len)
#define BP_VAR_R
#define ZEND_JMP_NULL_BP_VAR_IS
#define ZEND_BIND_REF
#define ZEND_FETCH_CLASS_SELF
#define ZEND_CALL_CLOSURE
#define QUICK_ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num)
#define ZEND_ACC_ENUM
struct _zend_op zend_op
#define ZEND_USER_CODE(type)
#define EX_VAR_NUM(n)
#define ZEND_SHORT_CIRCUITING_CHAIN_EXPR
#define ARG_MUST_BE_SENT_BY_REF(zf, arg_num)
#define IS_UNUSED
#define ZEND_CALL_TOP_FUNCTION
#define ZEND_ACC_FAKE_CLOSURE
#define ZEND_FETCH_CLASS_MASK
#define ZEND_CALL_ALLOCATED
#define QUICK_ARG_MAY_BE_SENT_BY_REF(zf, arg_num)
#define ZEND_CALL_NESTED_CODE
#define ZEND_FETCH_GLOBAL_LOCK
#define IS_CONST
#define ZEND_ARRAY_NOT_PACKED
#define ZEND_ACC_HAS_TYPE_HINTS
#define BP_VAR_W
#define ZEND_INTERNAL_FUNCTION
#define IS_VAR
#define ZEND_CLASS_CONST_FLAGS(c)
#define EX_NUM_ARGS()
#define ZEND_CALL_FRAME_SLOT
#define ZEND_SHORT_CIRCUITING_CHAIN_EMPTY
#define ZEND_FREE_ON_RETURN
#define QUICK_ARG_MUST_BE_SENT_BY_REF(zf, arg_num)
#define ZEND_ACC_LINKED
#define ZEND_CALL_TOP
#define ZEND_ACC_READONLY
#define RUN_TIME_CACHE(op_array)
#define ZEND_RETURNS_VALUE
#define ZEND_FETCH_CLASS_NO_AUTOLOAD
#define ZEND_CALL_NESTED_FUNCTION
#define EX(element)
#define ZEND_CALL_NEEDS_REATTACH
#define ZEND_USER_FUNCTION
#define ZEND_CALL_VAR(call, n)
#define EX_CALL_INFO()
#define ZEND_CALL_NESTED
#define ZEND_CALL_HAS_SYMBOL_TABLE
#define ZEND_ACC_CALL_VIA_TRAMPOLINE
#define ZEND_CALL_GENERATOR
#define ZEND_CALL_OBSERVED
struct _zend_op_array zend_op_array
#define ZEND_CALL_HAS_THIS
#define EX_USES_STRICT_TYPES()
#define OBJ_PROP(obj, offset)
struct _zend_class_constant zend_class_constant
struct _zend_property_info zend_property_info
#define ZEND_CALL_HAS_EXTRA_NAMED_PARAMS
#define ZEND_ACC_TRAIT
#define ZEND_FETCH_REF
#define ZEND_BIND_IMPLICIT
#define ZEND_CALL_CODE
#define ZEND_ACC_PRIVATE
#define ZEND_FETCH_CLASS_STATIC
#define ZEND_FETCH_CLASS_DEFAULT
#define ZEND_ACC_CONSTANTS_UPDATED
#define ZEND_EXTRA_VALUE
#define ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES
#define ZEND_CALL_NUM_ARGS(call)
#define RT_CONSTANT(opline, node)
#define ZEND_ACC_STATIC
#define MAX_ARG_FLAG_NUM
#define ZEND_FETCH_CLASS_EXCEPTION
#define ZEND_CALL_INFO(call)
#define ZEND_FETCH_CLASS_PARENT
#define ZEND_ACC_PUBLIC
#define ZEND_CALL_FUNCTION
#define ZEND_ARRAY_ELEMENT_REF
#define ZEND_ACC_HAS_RETURN_TYPE
struct _zend_arg_info zend_arg_info
#define OP_JMP_ADDR(opline, node)
#define EX_VAR(n)
#define ZEND_CALL_DYNAMIC
#define ZEND_FETCH_OBJ_FLAGS
#define ZEND_CALL_SEND_ARG_BY_REF
#define ZEND_FETCH_GLOBAL
#define ZEND_ADD_CALL_FLAG_EX(call_info, flag)
#define ZEND_ACC_VARIADIC
#define ZEND_USER_CLASS
#define ZEND_ADD_CALL_FLAG(call, flag)
#define ZEND_CALL_FREE_EXTRA_ARGS
#define ZEND_ARRAY_SIZE_SHIFT
#define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num)
#define ZEND_ISEMPTY
#define ZEND_CALL_MAY_HAVE_UNDEF
#define IS_CV
#define IS_TMP_VAR
struct _zend_try_catch_element zend_try_catch_element
#define ZEND_DEL_CALL_FLAG(call, flag)
#define BP_VAR_RW
struct _zend_live_range zend_live_range
#define ZEND_ACC_DEPRECATED
#define ZEND_CALL_RELEASE_THIS
#define ZEND_FETCH_CLASS_SILENT
#define ZEND_ACC_RETURN_REFERENCE
#define ZEND_RETURNS_FUNCTION
char * zend_visibility_string(uint32_t fn_flags)
#define ARG_MAY_BE_SENT_BY_REF(zf, arg_num)
#define ZEND_LAST_CATCH
#define BP_VAR_IS
#define ZEND_SHORT_CIRCUITING_CHAIN_MASK
#define ZEND_ACC_CLOSURE
#define ZEND_ACC_NEVER_CACHE
#define BP_VAR_UNSET
#define ZEND_BIND_EXPLICIT
#define ZEND_CALL_ARG(call, n)
#define ZEND_CALL_FAKE_CLOSURE
#define ZEND_SHORT_CIRCUITING_CHAIN_ISSET
ZEND_API zend_result zend_register_constant(zend_constant *c)
ZEND_API bool zend_verify_const_access(zend_class_constant *c, zend_class_entry *scope)
#define ZEND_CONSTANT_SET_FLAGS(c, _flags, _module_number)
struct _zend_constant zend_constant
#define PHP_USER_CONSTANT
#define E_NOTICE
Definition zend_errors.h:26
#define E_ERROR
Definition zend_errors.h:23
#define E_WARNING
Definition zend_errors.h:24
#define E_FATAL_ERRORS
Definition zend_errors.h:47
#define E_HAS_ONLY_FATAL_ERRORS(mask)
Definition zend_errors.h:49
#define E_DEPRECATED
Definition zend_errors.h:37
void zend_exception_restore(void)
ZEND_API bool zend_is_unwind_exit(const zend_object *ex)
ZEND_API ZEND_COLD void zend_throw_exception_object(zval *exception)
void zend_exception_save(void)
ZEND_API bool zend_is_graceful_exit(const zend_object *ex)
ZEND_API zend_class_entry * zend_ce_division_by_zero_error
ZEND_API ZEND_COLD zend_object * zend_throw_exception_ex(zend_class_entry *exception_ce, zend_long code, const char *format,...)
void zend_exception_set_previous(zend_object *exception, zend_object *add_previous)
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params(zend_array *extra_named_params)
ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref)
ZEND_API void zend_frameless_observed_call(zend_execute_data *execute_data)
#define ZEND_VM_SET_OPCODE_NO_INTERRUPT(new_op)
#define EXECUTE_DATA_CC
#define ZEND_FAKE_OP_ARRAY
#define ZEND_VM_SMART_BRANCH_FALSE()
ZEND_API const zend_internal_function zend_pass_function
#define _zend_vm_stack_push_call_frame
#define ZEND_VM_FCALL_INTERRUPT_CHECK(call)
ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(uint8_t type)
#define UNDEF_RESULT()
ZEND_COLD void zend_match_unhandled_error(const zval *value)
#define ZEND_VM_SMART_BRANCH(_result, _check)
#define get_op_data_zval_ptr_r(op_type, node)
#define ZEND_VM_JMP(new_op)
ZEND_API bool zend_never_inline zend_verify_property_type(const zend_property_info *info, zval *property, bool strict)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_class_constant(const zend_class_constant *c, const zend_string *constant_name)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc)
ZEND_API ZEND_COLD void zend_verify_never_error(const zend_function *zf)
#define OPLINE_CC
#define ZEND_VM_JMP_EX(new_op, check_exception)
ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call)
#define EXECUTE_DATA_C
#define ZVAL_UNDEFINED_OP1()
#define ZEND_VM_REPEAT_OPCODE(_opcode)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim)
ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num)
#define ZEND_VM_NEXT_OPCODE_EX(check_exception, skip)
#define ZEND_VM_REPEATABLE_OPCODE
#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_var)
#define FREE_OP(type, var)
#define ZEND_VM_SET_RELATIVE_OPCODE(opline, offset)
#define ZEND_VM_SMART_BRANCH_TRUE()
#define _zend_vm_stack_push_call_frame_ex
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data)
#define ZVAL_UNDEFINED_OP2()
ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num)
zval *ZEND_FASTCALL zend_handle_named_arg(zend_execute_data **call_ptr, zend_string *arg_name, uint32_t *arg_num_ptr, void **cache_slot)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_false_to_array_deprecated(void)
ZEND_API ZEND_COLD void zend_verify_return_error(const zend_function *zf, zval *value)
#define CACHED_PTR_EX(slot)
#define ZEND_REF_HAS_TYPE_SOURCES(ref)
#define ZEND_USER_OPCODE_ENTER
ZEND_API void(* zend_execute_ex)(zend_execute_data *execute_data)
ZEND_API void(* zend_execute_internal)(zend_execute_data *execute_data, zval *return_value)
ZEND_API void execute_ex(zend_execute_data *execute_data)
ZEND_API zend_class_entry * zend_fetch_class(zend_string *class_name, uint32_t fetch_type)
#define ZEND_USER_OPCODE_RETURN
ZEND_API zend_class_entry * zend_fetch_class_by_name(zend_string *class_name, zend_string *lcname, uint32_t fetch_type)
#define ZEND_USER_OPCODE_LEAVE
ZEND_API zend_result ZEND_FASTCALL zval_update_constant_with_ctx(zval *pp, zend_class_entry *scope, zend_ast_evaluate_ctx *ctx)
ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope)
#define DECODE_SPECIAL_CACHE_NUM(ptr)
#define IS_SPECIAL_CACHE_VAL(ptr)
#define CACHED_PTR(num)
#define CACHE_PTR_EX(slot, ptr)
#define ENCODE_SPECIAL_CACHE_NUM(num)
#define ZEND_USER_OPCODE_DISPATCH
ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(void)
#define CACHE_PTR(num, ptr)
#define ZEND_REF_ADD_TYPE_SOURCE(ref, source)
#define CACHE_ADDR(num)
#define ZEND_USER_OPCODE_CONTINUE
ZEND_API zend_class_entry * zend_lookup_class_ex(zend_string *name, zend_string *lcname, uint32_t flags)
#define CACHE_POLYMORPHIC_PTR(num, ce, ptr)
ZEND_API zend_llist zend_extensions
ZEND_API void zend_fiber_switch_unblock(void)
ZEND_API void zend_fiber_switch_block(void)
union _zend_function zend_function
void(* zend_frameless_function_1)(zval *return_value, zval *op1)
@ ZEND_JMP_FL_UNPRIMED
#define ZEND_FLF_HANDLER(opline)
void(* zend_frameless_function_3)(zval *return_value, zval *op1, zval *op2, zval *op3)
void(* zend_frameless_function_0)(zval *return_value)
#define ZEND_FLF_FUNC(opline)
void(* zend_frameless_function_2)(zval *return_value, zval *op1, zval *op2)
ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref)
Definition zend_gc.c:698
#define GC_MAY_LEAK(ref)
Definition zend_gc.h:84
void zend_generator_yield_from(zend_generator *generator, zend_generator *from)
ZEND_API zend_class_entry * zend_ce_generator
struct _zend_generator zend_generator
struct _zend_ini_entry zend_ini_entry
#define EG(v)
ZEND_API HashTable *ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate)
Definition zend_hash.c:3387
ZEND_API HashTable *ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht)
Definition zend_hash.c:3334
ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht)
Definition zend_hash.c:330
ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPosition pos)
Definition zend_hash.c:537
ZEND_API zval *ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData)
Definition zend_hash.c:1224
ZEND_API zval *ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData)
Definition zend_hash.c:1214
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
Definition zend_hash.c:1007
ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h)
Definition zend_hash.c:1692
ZEND_API zval *ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key)
Definition zend_hash.c:2679
ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTable *ht)
Definition zend_hash.c:608
ZEND_API zval *ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData)
Definition zend_hash.c:1219
ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, bool packed)
Definition zend_hash.c:396
ZEND_API zend_result ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key)
Definition zend_hash.c:1566
ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor)
Definition zend_hash.c:2240
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
Definition zend_hash.c:1808
ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos_ex(uint32_t idx, zval *array)
Definition zend_hash.c:627
ZEND_API HashTable *ZEND_FASTCALL zend_array_dup(HashTable *source)
Definition zend_hash.c:2438
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
Definition zend_hash.c:997
ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht)
Definition zend_hash.c:338
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
Definition zend_hash.c:1534
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
Definition zend_hash.c:2668
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
Definition zend_hash.c:2701
ZEND_API void ZEND_FASTCALL zend_hash_iterator_del(uint32_t idx)
Definition zend_hash.c:649
#define ZEND_HASH_FILL_ADD(_val)
Definition zend_hash.h:1570
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
Definition zend_hash.h:108
#define ZEND_HASH_FILL_PACKED(ht)
Definition zend_hash.h:1528
#define ZEND_HASH_FILL_SET(_val)
Definition zend_hash.h:1544
#define ZEND_HASH_FILL_END()
Definition zend_hash.h:1582
#define ZEND_HASH_FILL_SET_NULL()
Definition zend_hash.h:1547
#define HT_IS_PACKED(ht)
Definition zend_hash.h:59
#define zend_new_array(size)
Definition zend_hash.h:338
#define ZEND_HASH_INDEX_FIND(_ht, _h, _ret, _not_found)
Definition zend_hash.h:196
#define ZEND_HANDLE_NUMERIC(key, idx)
Definition zend_hash.h:420
#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val)
Definition zend_hash.h:1166
#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key)
Definition zend_hash.h:1346
#define ZEND_HASH_FILL_FINISH()
Definition zend_hash.h:1575
#define ZEND_HASH_PACKED_FOREACH_VAL(ht, _val)
Definition zend_hash.h:1479
#define ZEND_HASH_FOREACH_END()
Definition zend_hash.h:1086
#define ZEND_HASH_FILL_NEXT()
Definition zend_hash.h:1565
#define ZVAL_EMPTY_ARRAY(z)
Definition zend_hash.h:87
#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val)
Definition zend_hash.h:1374
#define ZEND_HASH_FOREACH_VAL(ht, _val)
Definition zend_hash.h:1102
ZEND_API zend_class_entry * zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name, zend_string *key)
ZEND_API zend_class_entry * zend_ce_countable
ZEND_API zend_object_iterator * zend_iterator_unwrap(zval *array_ptr)
ZEND_API void zend_iterator_dtor(zend_object_iterator *iter)
struct _zend_object_iterator zend_object_iterator
struct _zend_object_iterator_funcs zend_object_iterator_funcs
ZEND_API zend_object * zend_lazy_object_init(zend_object *obj)
const char * zend_rsrc_list_get_rsrc_type(zend_resource *res)
Definition zend_list.c:316
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, llist_apply_with_arg_func_t func, void *arg)
Definition zend_llist.c:231
void(* llist_apply_with_arg_func_t)(void *data, void *arg)
Definition zend_llist.h:34
int32_t zend_long
Definition zend_long.h:42
uint32_t zend_ulong
Definition zend_long.h:43
#define SIZEOF_ZEND_LONG
Definition zend_long.h:50
struct _zend_string zend_string
#define ZEND_MAP_PTR_GET(ptr)
#define ZEND_MAP_PTR_SET(ptr, val)
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval)
ZEND_API zend_result zend_check_property_access(const zend_object *zobj, zend_string *prop_info_name, bool is_dynamic)
ZEND_API HashTable * zend_get_properties_for(zval *obj, zend_prop_purpose purpose)
ZEND_API bool zend_check_protected(const zend_class_entry *ce, const zend_class_entry *scope)
ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API HashTable * zend_std_build_object_properties_array(zend_object *zobj)
ZEND_API zend_property_info * zend_get_property_info(const zend_class_entry *ce, zend_string *member, int silent)
ZEND_API zval * zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv)
ZEND_API zend_function * zend_get_property_hook_trampoline(const zend_property_info *prop_info, zend_property_hook_kind kind, zend_string *prop_name)
ZEND_API HashTable * rebuild_object_properties_internal(zend_object *zobj)
ZEND_API zend_function * zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name, const zval *key)
#define ZEND_WRONG_PROPERTY_INFO
#define zend_release_properties(ht)
#define ZEND_IS_PROPERTY_HOOK_SIMPLE_READ(offset)
#define ZEND_DECODE_DYN_PROP_OFFSET(offset)
#define zend_get_function_root_class(fbc)
#define ZEND_IS_PROPERTY_HOOK_SIMPLE_GET(offset)
zend_object *(* zend_object_clone_obj_t)(zend_object *object)
#define ZEND_ENCODE_DYN_PROP_OFFSET(offset)
#define IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(offset)
@ ZEND_PROP_PURPOSE_ARRAY_CAST
#define IS_HOOKED_PROPERTY_OFFSET(offset)
#define ZEND_DYNAMIC_PROPERTY_OFFSET
#define ZEND_IS_PROPERTY_HOOK_SIMPLE_WRITE(offset)
#define IS_VALID_PROPERTY_OFFSET(offset)
#define ZEND_STD_BUILD_OBJECT_PROPERTIES_ARRAY_COMPATIBLE(object)
#define zend_free_trampoline(func)
#define IS_DYNAMIC_PROPERTY_OFFSET(offset)
ZEND_API zend_object *ZEND_FASTCALL zend_objects_new(zend_class_entry *ce)
ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object)
#define OBJ_RELEASE(obj)
int zend_observer_fcall_op_array_extension
#define ZEND_OBSERVER_DATA(function)
#define ZEND_OBSERVER_ENABLED
#define ZEND_OBSERVER_FCALL_BEGIN(execute_data)
#define ZEND_OBSERVER_FCALL_END(execute_data, return_value)
ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op1)
ZEND_API zend_result ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_not_function(zval *result, zval *op1)
ZEND_API zend_result ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op2)
ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1)
ZEND_API zend_result ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_string *ZEND_FASTCALL zval_get_string_func(zval *op)
ZEND_API bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce)
#define EXPECTED(condition)
#define ZEND_ASSERT(c)
#define EMPTY_SWITCH_DEFAULT_CASE()
#define UNEXPECTED(condition)
struct _zend_array zend_array
zend_property_hook_kind
@ ZEND_PROPERTY_HOOK_GET
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
#define ZSTR_H(zstr)
Definition zend_string.h:70
#define ZSTR_COPY_CONCAT_PROPERTIES_BOTH(out, in1, in2)
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2)
Definition zend_string.h:94
#define ZSTR_IS_INTERNED(s)
Definition zend_string.h:84
#define ZSTR_VAL(zstr)
Definition zend_string.h:68
#define ZSTR_COPYABLE_CONCAT_PROPERTIES
Definition zend_string.h:90
#define ZSTR_MAX_LEN
#define ZSTR_KNOWN(idx)
#define ZSTR_EMPTY_ALLOC()
#define ZSTR_LEN(zstr)
Definition zend_string.h:69
#define zend_string_equals_literal_ci(str, c)
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s)
Definition zend_string.h:92
#define CONST
#define d1
#define MAY_BE_REF
#define MAY_BE_STRING
#define MAY_BE_FALSE
#define MAY_BE_UNDEF
#define MAY_BE_NULL
#define MAY_BE_DOUBLE
#define MAY_BE_LONG
#define MAY_BE_TRUE
#define MAY_BE_ANY
#define MAY_BE_OBJECT
#define MAY_BE_RESOURCE
#define MAY_BE_ARRAY
#define Z_TYPE_P(zval_p)
Definition zend_types.h:660
#define IS_TRUE
Definition zend_types.h:603
#define ZVAL_STR(z, s)
#define Z_SET_REFCOUNT_P(pz, rc)
#define ZVAL_FALSE(z)
#define GC_DTOR(p)
Definition zend_types.h:716
#define Z_ISREF_P(zval_p)
Definition zend_types.h:954
#define Z_TRY_ADDREF_P(pz)
#define ZVAL_NEW_EMPTY_REF(z)
#define ZVAL_UNDEF(z)
#define GC_SET_REFCOUNT(p, rc)
Definition zend_types.h:708
#define Z_REFVAL_P(zval_p)
#define IS_FALSE
Definition zend_types.h:602
#define Z_STRVAL_P(zval_p)
Definition zend_types.h:975
#define IS_UNDEF
Definition zend_types.h:600
#define Z_ISUNDEF_P(zval_p)
Definition zend_types.h:957
#define Z_ARRVAL_P(zval_p)
Definition zend_types.h:987
#define ZVAL_TRUE(z)
#define ZVAL_NULL(z)
#define ZVAL_DEREF(z)
#define ZVAL_LONG(z, l)
#define GC_REFERENCE
Definition zend_types.h:789
#define IS_STRING
Definition zend_types.h:606
#define GC_DTOR_NO_REF(p)
Definition zend_types.h:726
#define Z_OPT_REFCOUNTED_P(zval_p)
Definition zend_types.h:944
#define Z_FE_POS_P(zval_p)
Definition zend_types.h:684
#define Z_CE(zval)
#define Z_REFCOUNTED_P(zval_p)
Definition zend_types.h:921
#define ZVAL_STR_COPY(z, s)
#define Z_FE_ITER_P(zval_p)
Definition zend_types.h:687
#define ZVAL_INDIRECT(z, v)
struct _zend_array HashTable
Definition zend_types.h:386
#define IS_RESOURCE
Definition zend_types.h:609
#define Z_OBJ_P(zval_p)
Definition zend_types.h:990
#define IS_ARRAY
Definition zend_types.h:607
#define ZVAL_COPY_OR_DUP(z, v)
#define Z_OBJ_HT_P(zval_p)
Definition zend_types.h:993
#define ZVAL_COPY_DEREF(z, v)
#define IS_DOUBLE
Definition zend_types.h:605
#define Z_TYPE_INFO_P(zval_p)
Definition zend_types.h:669
#define Z_ISUNDEF(zval)
Definition zend_types.h:956
#define ZVAL_OPT_DEREF(z)
#define Z_OPT_ISREF_P(zval_p)
Definition zend_types.h:951
#define Z_COUNTED_P(zval_p)
Definition zend_types.h:699
#define IS_REFERENCE_EX
Definition zend_types.h:811
#define Z_STR_P(zval_p)
Definition zend_types.h:972
#define Z_TYPE_MASK
Definition zend_types.h:701
#define Z_PTR_P(zval_p)
#define ZVAL_NEW_REF(z, r)
#define Z_STR(zval)
Definition zend_types.h:971
#define GC_DELREF(p)
Definition zend_types.h:710
#define GC_FLAGS(p)
Definition zend_types.h:756
#define GC_ADDREF(p)
Definition zend_types.h:709
#define Z_FUNC_P(zval_p)
#define ZEND_TYPE_FULL_MASK(t)
Definition zend_types.h:254
#define Z_ADDREF_P(pz)
#define Z_PTR(zval)
#define Z_STRLEN_P(zval_p)
Definition zend_types.h:978
#define ZVAL_UNREF(z)
#define Z_OPLINE_NUM_P(zval_p)
Definition zend_types.h:681
#define IS_NULL
Definition zend_types.h:601
#define Z_OBJCE_P(zval_p)
#define ZVAL_OBJ(z, o)
@ FAILURE
Definition zend_types.h:61
#define Z_FE_POS(zval)
Definition zend_types.h:683
#define IS_OBJECT
Definition zend_types.h:608
#define Z_ADDREF(z)
#define IS_LONG
Definition zend_types.h:604
#define ZVAL_ARR(z, a)
#define ZEND_TYPE_IS_SET(t)
Definition zend_types.h:166
#define Z_DELREF_P(pz)
#define IS_REFERENCE
Definition zend_types.h:610
#define Z_RES_HANDLE_P(zval_p)
#define ZVAL_NEW_STR(z, s)
#define ZVAL_COPY(z, v)
uint32_t HashPosition
Definition zend_types.h:548
#define _IS_BOOL
Definition zend_types.h:629
#define Z_OPT_REFCOUNTED(zval)
Definition zend_types.h:943
struct _zend_refcounted zend_refcounted
Definition zend_types.h:95
#define Z_TYPE_INFO(zval)
Definition zend_types.h:668
struct _Bucket Bucket
#define Z_TYPE_INFO_REFCOUNTED(t)
Definition zend_types.h:799
#define Z_INDIRECT_P(zval_p)
#define Z_REF_P(zval_p)
#define Z_OBJPROP_P(zval_p)
#define ZVAL_DOUBLE(z, d)
#define Z_REFCOUNT_P(pz)
#define ZVAL_MAKE_REF_EX(z, refcount)
ZEND_RESULT_CODE zend_result
Definition zend_types.h:64
#define IS_ARRAY_IMMUTABLE
Definition zend_types.h:823
#define Z_ISERROR_P(zval_p)
Definition zend_types.h:963
#define IS_CONSTANT_AST
Definition zend_types.h:611
#define Z_CE_P(zval_p)
#define ZVAL_REF(z, r)
#define Z_RES_P(zval_p)
#define SEPARATE_ARRAY(zv)
#define Z_CACHE_SLOT_P(zval_p)
Definition zend_types.h:675
#define GC_REFCOUNT(p)
Definition zend_types.h:707
#define GC_IS_RECURSIVE(p)
Definition zend_types.h:865
#define Z_TYPE(zval)
Definition zend_types.h:659
#define ZVAL_INTERNED_STR(z, s)
#define ZEND_TYPE_CONTAINS_CODE(t, code)
Definition zend_types.h:266
#define Z_DVAL_P(zval_p)
Definition zend_types.h:969
#define IS_INDIRECT
Definition zend_types.h:623
struct _zend_execute_data zend_execute_data
Definition zend_types.h:91
#define Z_ARR_P(zval_p)
Definition zend_types.h:984
#define Z_LVAL_P(zval_p)
Definition zend_types.h:966
#define ZVAL_COPY_VALUE(z, v)
#define Z_EXTRA_P(zval_p)
Definition zend_types.h:696
struct _zend_reference zend_reference
Definition zend_types.h:100
#define ZVAL_BOOL(z, b)
#define Z_LVAL(zval)
Definition zend_types.h:965
#define Z_OPT_CONSTANT(zval)
Definition zend_types.h:940
#define GC_ADD_FLAGS(p, flags)
Definition zend_types.h:759
#define Z_OBJCE(zval)
#define GC_TYPE_INFO(p)
Definition zend_types.h:754
#define Z_OPT_TYPE_P(zval_p)
Definition zend_types.h:938
#define Z_OBJ(zval)
Definition zend_types.h:989
ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
ZEND_API void zval_add_ref(zval *p)
i_init_code_execute_data(call, new_op_array, return_value)
ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
zend_generator_close(generator, 1)
container
ZEND_OBSERVER_SAVE_OPLINE()
zval retval
LOAD_OPLINE_EX()
double d2
zend_destroy_static_vars(new_op_array)
uint32_t call_info
fast_long_increment_function(var_ptr)
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_COUNT,(op1_info &(MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF))==MAY_BE_ARRAY, ZEND_COUNT_ARRAY, CV|TMPVAR, UNUSED)
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_EXTRA_P(RT_CONSTANT(op, op->op2)) !=0, ZEND_INIT_FCALL_OFFSET, NUM, CONST, NUM|CACHE_SLOT)
zend_string * tmp_name
new_op_array
zval * return_value
ZEND_VM_LEAVE()
varptr
FREE_OP1()
zval * arg1
call prev_execute_data
ZEND_OBSERVER_FREE_RETVAL()
zval * arg2
zend_vm_stack_free_args(call)
zend_property_info * prop_info
ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
zval * call_args
zend_error(E_NOTICE, "Only variables should be passed by reference")
retval_ptr
ZEND_VM_HOT_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
uint32_t arg_num
orig_object_ptr
ZEND_VM_C_GOTO(fcall_by_name_end)
zval * dim
destroy_op_array(new_op_array)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION()
ZEND_OBSERVER_USE_RETVAL
zend_generator * generator
FREE_OP_DATA()
LOAD_OPLINE()
ZEND_VM_DISPATCH_TO_HELPER(zend_mul_helper, op_1, op1, op_2, op2)
FREE_OP2()
SAVE_OPLINE()
ZEND_VM_COLD_HANDLER(201, ZEND_VERIFY_NEVER_TYPE, UNUSED, UNUSED)
zend_string * name
zval * inc_filename
zval * arg3
zend_function * fbc
ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA)
ZEND_VM_HANDLER(196, ZEND_CASE_STRICT, TMP|VAR, CONST|TMP|VAR|CV)
value_ptr
ZEND_VM_C_LABEL(free_and_exit_assign_obj)
ZEND_VM_COLD_CONSTCONST_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_INC_OPCODE()
bool result
ZEND_VM_HELPER(zend_add_helper, ANY, ANY, zval *op_1, zval *op_2)
Definition zend_vm_def.h:26
ZEND_VM_HOT_NOCONST_HANDLER(13, ZEND_BW_NOT, CONST|TMPVARCV, ANY)
op2
ZEND_VM_NEXT_OPCODE()
ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
zend_vm_stack_free_call_frame(call)
function(EX_VAR(opline->result.var))
ZEND_OBSERVER_SET_RETVAL()
op1
zval * variable_ptr
execute_data
concat_function(EX_VAR(opline->result.var), op1, op2)
ZEND_VM_COLD_CONST_HANDLER(14, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
object
zend_refcounted * garbage
zval * ret
value
ZEND_VM_ENTER_EX()
ZEND_VM_CONTINUE()
fast_long_decrement_function(var_ptr)
var_ptr
ZEND_VM_RETURN()
zend_execute_data * call
ZEND_VM_HOT_NOCONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVARCV, CONST|TMPVARCV)
Definition zend_vm_def.h:47
property
new_op_array scope
zend_object * zobj
boolean_xor_function(EX_VAR(opline->result.var), op1, op2)
#define ZEND_VM_ENTER()
#define HANDLE_EXCEPTION_LEAVE()
#define OPLINE
#define SAVE_OPLINE_EX()
#define HANDLE_EXCEPTION()
#define USE_OPLINE
#define ZEND_VM_DISPATCH(opcode, opline)
#define LOAD_NEXT_OPLINE()
#define ZEND_FE_FREE
#define ZEND_FETCH_STATIC_PROP_IS
#define ZEND_SL
#define ZEND_SEND_VAR_EX
#define ZEND_IS_IDENTICAL
#define ZEND_YIELD
#define ZEND_DECLARE_ANON_CLASS
#define ZEND_FETCH_CONSTANT
#define ZEND_FETCH_THIS
#define ZEND_SWITCH_LONG
#define ZEND_ASSIGN_DIM_OP
#define ZEND_ASSIGN_STATIC_PROP_REF
#define ZEND_MAKE_REF
#define ZEND_UNSET_STATIC_PROP
#define ZEND_EXT_FCALL_END
#define ZEND_ISSET_ISEMPTY_CV
#define ZEND_CHECK_VAR
#define ZEND_PRE_DEC_OBJ
#define ZEND_BOOL_NOT
#define ZEND_RECV_INIT
#define ZEND_FETCH_OBJ_W
#define ZEND_NEW
#define ZEND_FE_FETCH_RW
#define ZEND_VERIFY_RETURN_TYPE
#define ZEND_SEND_VAL_EX
#define ZEND_FETCH_LIST_R
#define ZEND_USER_OPCODE
#define ZEND_FUNC_NUM_ARGS
#define ZEND_INCLUDE_OR_EVAL
#define ZEND_RETURN
#define ZEND_FE_RESET_RW
#define ZEND_THROW
#define ZEND_FE_FETCH_R
#define ZEND_GENERATOR_CREATE
#define ZEND_INIT_USER_CALL
#define ZEND_ROPE_INIT
#define ZEND_TICKS
#define ZEND_FRAMELESS_ICALL_0
#define ZEND_FETCH_R
#define ZEND_FETCH_LIST_W
#define ZEND_INIT_FCALL
#define ZEND_CALLABLE_CONVERT
#define ZEND_ASSERT_CHECK
#define ZEND_EXT_STMT
#define ZEND_SEND_VAL
#define ZEND_OP_DATA
#define ZEND_RETURN_BY_REF
#define ZEND_SWITCH_STRING
#define ZEND_CALL_TRAMPOLINE
#define ZEND_BOOL_XOR
#define ZEND_DECLARE_CONST
#define ZEND_ASSIGN_DIM
#define ZEND_DECLARE_CLASS_DELAYED
#define ZEND_INIT_ARRAY
#define ZEND_NOP
#define ZEND_GET_CALLED_CLASS
#define ZEND_JMPZ
#define ZEND_GET_TYPE
#define ZEND_DECLARE_FUNCTION
#define ZEND_FETCH_OBJ_FUNC_ARG
#define ZEND_PRE_INC_OBJ
#define ZEND_FETCH_STATIC_PROP_R
#define ZEND_PRE_DEC_STATIC_PROP
#define ZEND_ASSIGN_REF
#define ZEND_ASSIGN_STATIC_PROP_OP
#define ZEND_FETCH_DIM_FUNC_ARG
#define ZEND_FETCH_GLOBALS
#define ZEND_JMP_SET
#define ZEND_POW
#define ZEND_SUB
#define ZEND_EXT_FCALL_BEGIN
#define ZEND_JMPZ_EX
#define ZEND_IS_SMALLER
#define ZEND_UNSET_CV
#define ZEND_PRE_INC
#define ZEND_DEFINED
#define ZEND_FRAMELESS_ICALL_1
#define ZEND_POST_INC_STATIC_PROP
#define ZEND_FETCH_W
#define ZEND_HANDLE_EXCEPTION
#define ZEND_POST_INC
#define ZEND_PRE_DEC
#define ZEND_SEND_ARRAY
#define ZEND_SEND_UNPACK
#define ZEND_BW_XOR
#define ZEND_IS_NOT_EQUAL
#define ZEND_FETCH_STATIC_PROP_UNSET
#define ZEND_IS_NOT_IDENTICAL
#define ZEND_FETCH_OBJ_IS
#define ZEND_DO_UCALL
#define ZEND_GET_CLASS
#define ZEND_INSTANCEOF
#define ZEND_FETCH_OBJ_UNSET
#define ZEND_ROPE_ADD
#define ZEND_DIV
#define ZEND_SEND_VAR
#define ZEND_POST_DEC_OBJ
#define ZEND_CONCAT
#define ZEND_FAST_CONCAT
#define ZEND_MATCH
#define ZEND_FETCH_RW
#define ZEND_CHECK_FUNC_ARG
#define ZEND_BW_OR
#define ZEND_ISSET_ISEMPTY_PROP_OBJ
#define ZEND_RECV
#define ZEND_FETCH_STATIC_PROP_FUNC_ARG
#define ZEND_FRAMELESS_ICALL_3
#define ZEND_END_SILENCE
#define ZEND_INIT_NS_FCALL_BY_NAME
#define ZEND_JMPNZ_EX
#define ZEND_DO_FCALL
#define ZEND_UNSET_DIM
#define ZEND_ADD_ARRAY_ELEMENT
#define ZEND_ISSET_ISEMPTY_STATIC_PROP
#define ZEND_IN_ARRAY
#define ZEND_ASSIGN_STATIC_PROP
#define ZEND_IS_EQUAL
#define ZEND_IS_SMALLER_OR_EQUAL
#define ZEND_POST_DEC
#define ZEND_POST_DEC_STATIC_PROP
#define ZEND_UNSET_OBJ
#define ZEND_BOOL
#define ZEND_INIT_FCALL_BY_NAME
#define ZEND_DISCARD_EXCEPTION
#define ZEND_YIELD_FROM
#define ZEND_PRE_INC_STATIC_PROP
#define ZEND_STRLEN
#define ZEND_FRAMELESS_ICALL_2
#define ZEND_MUL
#define ZEND_CASE_STRICT
#define ZEND_ROPE_END
#define ZEND_FAST_CALL
#define ZEND_SEND_VAR_NO_REF_EX
#define ZEND_SEND_USER
#define ZEND_COPY_TMP
#define ZEND_BIND_LEXICAL
#define ZEND_FETCH_CLASS
#define ZEND_DO_ICALL
#define ZEND_DECLARE_LAMBDA_FUNCTION
#define ZEND_SEND_FUNC_ARG
#define ZEND_JMP_NULL
#define ZEND_BW_NOT
#define ZEND_FETCH_OBJ_R
#define ZEND_CHECK_UNDEF_ARGS
#define ZEND_ISSET_ISEMPTY_DIM_OBJ
#define ZEND_ISSET_ISEMPTY_VAR
#define ZEND_BIND_INIT_STATIC_OR_JMP
#define ZEND_BIND_GLOBAL
#define ZEND_BW_AND
#define ZEND_GENERATOR_RETURN
#define ZEND_FETCH_DIM_W
#define ZEND_DECLARE_CLASS
#define ZEND_FETCH_IS
#define ZEND_ADD_ARRAY_UNPACK
#define ZEND_BEGIN_SILENCE
#define ZEND_FUNC_GET_ARGS
#define ZEND_ARRAY_KEY_EXISTS
#define ZEND_FETCH_UNSET
#define ZEND_VM_SPEC
#define ZEND_JMP
#define ZEND_FREE
#define ZEND_FE_RESET_R
#define ZEND_JMP_FRAMELESS
#define ZEND_INIT_DYNAMIC_CALL
#define ZEND_SPACESHIP
#define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL
#define ZEND_ASSIGN_OBJ
#define ZEND_FETCH_STATIC_PROP_W
#define ZEND_ASSIGN_OBJ_OP
#define ZEND_ASSIGN_OBJ_REF
#define ZEND_FETCH_STATIC_PROP_RW
#define ZEND_ASSIGN
#define ZEND_ECHO
#define ZEND_SR
#define ZEND_FETCH_CLASS_CONSTANT
#define ZEND_RECV_VARIADIC
#define ZEND_COUNT
#define ZEND_FETCH_DIM_IS
#define ZEND_SEPARATE
#define ZEND_TYPE_CHECK
#define ZEND_FETCH_OBJ_RW
#define ZEND_VERIFY_NEVER_TYPE
#define ZEND_FETCH_DIM_UNSET
#define ZEND_EXT_NOP
#define ZEND_SEND_VAR_NO_REF
#define ZEND_SEND_REF
#define ZEND_POST_INC_OBJ
#define ZEND_FETCH_DIM_R
#define ZEND_DO_FCALL_BY_NAME
#define ZEND_JMPNZ
#define ZEND_INIT_METHOD_CALL
#define ZEND_INIT_STATIC_METHOD_CALL
#define ZEND_CAST
#define ZEND_ISSET_ISEMPTY_THIS
#define ZEND_QM_ASSIGN
#define ZEND_MOD
#define ZEND_CATCH
#define ZEND_FETCH_FUNC_ARG
#define ZEND_FETCH_CLASS_NAME
#define ZEND_ADD
#define ZEND_COALESCE
#define ZEND_ASSIGN_OP
#define ZEND_BIND_STATIC
#define ZEND_UNSET_VAR
#define ZEND_FETCH_DIM_RW
#define ZEND_MATCH_ERROR
#define ZEND_CLONE
#define ZEND_FAST_RET
#define ZEND_CASE