diff options
author | Timm Friebe <thekid@thekid.de> | 2014-07-06 12:44:02 +0200 |
---|---|---|
committer | Timm Friebe <thekid@thekid.de> | 2014-07-06 12:44:02 +0200 |
commit | a782f697df9c944f0645d56c078847d8316f8b9b (patch) | |
tree | 609509466d93b922074f97852ce8881a05b7554d | |
parent | abd42ea4c2d5e10fd88d6f89c6fcad9bc79d2f1b (diff) | |
download | php-git-a782f697df9c944f0645d56c078847d8316f8b9b.tar.gz |
Also handle nested function calls via variable
-rw-r--r-- | Zend/tests/methods-on-non-objects-nested-calls.phpt | 8 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 2 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 32 |
3 files changed, 25 insertions, 17 deletions
diff --git a/Zend/tests/methods-on-non-objects-nested-calls.phpt b/Zend/tests/methods-on-non-objects-nested-calls.phpt index e1fee5153d..117e29f896 100644 --- a/Zend/tests/methods-on-non-objects-nested-calls.phpt +++ b/Zend/tests/methods-on-non-objects-nested-calls.phpt @@ -11,6 +11,8 @@ set_error_handler(function($code, $message) { }); $x= null; +$ref= 'nested'; +$func= function() { return nested(); }; var_dump($x->method(nested())); var_dump($x->method(nested(), nested())); var_dump($x->method(nested(nested()))); @@ -20,6 +22,8 @@ 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())))); +var_dump($x->method($ref())); +var_dump($x->method($func())); echo "Alive\n"; ?> --EXPECTF-- @@ -41,4 +45,8 @@ Called #8 NULL Called #9 NULL +Called #10 +NULL +Called #11 +NULL Alive diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 19dbd9433b..32b910fe48 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2475,7 +2475,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a4492bcb02..f323381f48 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9318,7 +9318,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -10205,7 +10205,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -11093,7 +11093,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -12561,7 +12561,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -15821,7 +15821,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -18189,7 +18189,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -20518,7 +20518,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -23997,7 +23997,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -25661,7 +25661,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -27091,7 +27091,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -28427,7 +28427,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -30191,7 +30191,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -33452,7 +33452,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -35586,7 +35586,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -37775,7 +37775,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -40965,7 +40965,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; |