com php-src: Handle nesting correctly See feedback by @nikic, https://github.com/php/php-src/pull/647#issuecomment-48050551:
Zend/tests/methods-on-non-objects-as-arg.phpt Zend/tests/methods-on-non-objects-nested-calls.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h
| From: | Tjerk Anne Meesters | Date: | Sun, 06 Jul 2014 10:27:04 +0000 |
| Subject: | com php-src: Handle nesting correctly See feedback by @nikic, https://github.com/php/php-src/pull/647#issuecomment-48050551: Zend/tests/methods-on-non-objects-as-arg.phpt Zend/tests/methods-on-non-objects-nested-calls.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-82147@lists.php.net to get a copy of this message | ||
Commit: 17b3791a014fb01e4ff4c4e9cc0dd3f39824f972
Author: Timm Friebe <thekid@thekid.de> Sun, 6 Jul 2014 12:27:04 +0200
Parents: 7041ef44a6c18bb8d76dc5cf17d20ec00367d24b
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=17b3791a014fb01e4ff4c4e9cc0dd3f39824f972
Log:
Handle nesting correctly
See feedback by @nikic, https://github.com/php/php-src/pull/647#issuecomment-48050551
Changed paths:
A Zend/tests/methods-on-non-objects-as-arg.phpt
A Zend/tests/methods-on-non-objects-nested-calls.phpt
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
diff --git a/Zend/tests/methods-on-non-objects-as-arg.phpt b/Zend/tests/methods-on-non-objects-as-arg.phpt new file mode 100755 index 0000000..13b83cb --- /dev/null +++ b/Zend/tests/methods-on-non-objects-as-arg.phpt @@ -0,0 +1,47 @@ +--TEST-- +Catch method calls on non-objects as argument +--FILE-- +<?php +function nesting() { + return func_get_args(); +} +set_error_handler(function($code, $message) { + static $i= 0; + echo 'Called #'.(++$i)."\n"; +}); + +$x= null; +var_dump(nesting($x->method())); +var_dump(nesting(nesting($x->method()))); +var_dump(nesting($x->method(nesting($x->method())))); +var_dump(nesting($x->method(), $x->method())); +echo "Alive\n"; +?> +--EXPECTF-- +Called #1 +array(1) { + [0]=> + NULL +} +Called #2 +array(1) { + [0]=> + array(1) { + [0]=> + NULL + } +} +Called #3 +array(1) { + [0]=> + NULL +} +Called #4 +Called #5 +array(2) { + [0]=> + NULL + [1]=> + NULL +} +Alive diff --git a/Zend/tests/methods-on-non-objects-nested-calls.phpt b/Zend/tests/methods-on-non-objects-nested-calls.phpt new file mode 100644 index 0000000..e1fee51 --- /dev/null +++ b/Zend/tests/methods-on-non-objects-nested-calls.phpt @@ -0,0 +1,44 @@ +--TEST-- +Catch method calls on non-objects with nested function and method calls +--FILE-- +<?php +function nested() { + throw new LogicException('Should not be called'); +} +set_error_handler(function($code, $message) { + static $i= 0; + echo 'Called #'.(++$i)."\n"; +}); + +$x= null; +var_dump($x->method(nested())); +var_dump($x->method(nested(), nested())); +var_dump($x->method(nested(nested()))); +var_dump($x->method($x->nested())); +var_dump($x->method($x->nested(), $x->nested())); +var_dump($x->method($x->nested(nested()))); +var_dump($x->method($x->nested($x->deep()))); +var_dump($x->method($x->nested(nested($x->deep())))); +var_dump($x->method(nested(nested($x->nested())))); +echo "Alive\n"; +?> +--EXPECTF-- +Called #1 +NULL +Called #2 +NULL +Called #3 +NULL +Called #4 +NULL +Called #5 +NULL +Called #6 +NULL +Called #7 +NULL +Called #8 +NULL +Called #9 +NULL +Alive diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 10a71a6..001f0e5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2459,6 +2459,8 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { FREE_OP2(); HANDLE_EXCEPTION(); @@ -2473,7 +2475,12 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1c1a343..11f70be 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9302,6 +9302,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -9316,7 +9318,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -10186,6 +10193,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -10200,7 +10209,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -11071,6 +11085,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -11085,7 +11101,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -12536,6 +12557,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -12550,7 +12573,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -15793,6 +15821,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -15807,7 +15837,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -18158,6 +18193,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -18172,7 +18209,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -20484,6 +20526,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -20498,7 +20542,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -23960,6 +24009,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -23974,7 +24025,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -25621,6 +25677,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -25635,7 +25693,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -27048,6 +27111,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -27062,7 +27127,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -28381,6 +28451,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -28395,7 +28467,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -30142,6 +30219,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -30156,7 +30235,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -33400,6 +33484,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -33414,7 +33500,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -35531,6 +35622,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -35545,7 +35638,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -37717,6 +37815,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -37731,7 +37831,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -40904,6 +41009,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -40918,7 +41025,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr);
diff --git a/Zend/tests/methods-on-non-objects-as-arg.phpt b/Zend/tests/methods-on-non-objects-as-arg.phpt new file mode 100755 index 0000000..13b83cb --- /dev/null +++ b/Zend/tests/methods-on-non-objects-as-arg.phpt @@ -0,0 +1,47 @@ +--TEST-- +Catch method calls on non-objects as argument +--FILE-- +<?php +function nesting() { + return func_get_args(); +} +set_error_handler(function($code, $message) { + static $i= 0; + echo 'Called #'.(++$i)."\n"; +}); + +$x= null; +var_dump(nesting($x->method())); +var_dump(nesting(nesting($x->method()))); +var_dump(nesting($x->method(nesting($x->method())))); +var_dump(nesting($x->method(), $x->method())); +echo "Alive\n"; +?> +--EXPECTF-- +Called #1 +array(1) { + [0]=> + NULL +} +Called #2 +array(1) { + [0]=> + array(1) { + [0]=> + NULL + } +} +Called #3 +array(1) { + [0]=> + NULL +} +Called #4 +Called #5 +array(2) { + [0]=> + NULL + [1]=> + NULL +} +Alive diff --git a/Zend/tests/methods-on-non-objects-nested-calls.phpt b/Zend/tests/methods-on-non-objects-nested-calls.phpt new file mode 100644 index 0000000..e1fee51 --- /dev/null +++ b/Zend/tests/methods-on-non-objects-nested-calls.phpt @@ -0,0 +1,44 @@ +--TEST-- +Catch method calls on non-objects with nested function and method calls +--FILE-- +<?php +function nested() { + throw new LogicException('Should not be called'); +} +set_error_handler(function($code, $message) { + static $i= 0; + echo 'Called #'.(++$i)."\n"; +}); + +$x= null; +var_dump($x->method(nested())); +var_dump($x->method(nested(), nested())); +var_dump($x->method(nested(nested()))); +var_dump($x->method($x->nested())); +var_dump($x->method($x->nested(), $x->nested())); +var_dump($x->method($x->nested(nested()))); +var_dump($x->method($x->nested($x->deep()))); +var_dump($x->method($x->nested(nested($x->deep())))); +var_dump($x->method(nested(nested($x->nested())))); +echo "Alive\n"; +?> +--EXPECTF-- +Called #1 +NULL +Called #2 +NULL +Called #3 +NULL +Called #4 +NULL +Called #5 +NULL +Called #6 +NULL +Called #7 +NULL +Called #8 +NULL +Called #9 +NULL +Alive diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 10a71a6..001f0e5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2459,6 +2459,8 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { FREE_OP2(); HANDLE_EXCEPTION(); @@ -2473,7 +2475,12 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1c1a343..11f70be 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9302,6 +9302,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -9316,7 +9318,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -10186,6 +10193,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -10200,7 +10209,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -11071,6 +11085,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -11085,7 +11101,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -12536,6 +12557,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -12550,7 +12573,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -15793,6 +15821,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -15807,7 +15837,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -18158,6 +18193,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -18172,7 +18209,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -20484,6 +20526,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -20498,7 +20542,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -23960,6 +24009,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -23974,7 +24025,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -25621,6 +25677,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -25635,7 +25693,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -27048,6 +27111,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -27062,7 +27127,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -28381,6 +28451,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -28395,7 +28467,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -30142,6 +30219,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -30156,7 +30235,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -33400,6 +33484,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -33414,7 +33500,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -35531,6 +35622,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_dtor(free_op2.var); HANDLE_EXCEPTION(); @@ -35545,7 +35638,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -37717,6 +37815,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); @@ -37731,7 +37831,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr); @@ -40904,6 +41009,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H } } } else { + zend_uint nested = 1; + if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); @@ -40918,7 +41025,12 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H do { ZEND_VM_INC_OPCODE(); opline++; - } while (ZEND_DO_FCALL_BY_NAME != opline->opcode); + if (opline->opcode == ZEND_INIT_METHOD_CALL) { + nested++; + } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { + nested--; + } + } while (nested); MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr); ZVAL_NULL(EX_T(opline->result.var).var.ptr);