summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Friebe <thekid@thekid.de>2014-07-06 12:44:02 +0200
committerTimm Friebe <thekid@thekid.de>2014-07-06 12:44:02 +0200
commita782f697df9c944f0645d56c078847d8316f8b9b (patch)
tree609509466d93b922074f97852ce8881a05b7554d
parentabd42ea4c2d5e10fd88d6f89c6fcad9bc79d2f1b (diff)
downloadphp-git-a782f697df9c944f0645d56c078847d8316f8b9b.tar.gz
Also handle nested function calls via variable
-rw-r--r--Zend/tests/methods-on-non-objects-nested-calls.phpt8
-rw-r--r--Zend/zend_vm_def.h2
-rw-r--r--Zend/zend_vm_execute.h32
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--;