diff options
author | Timm Friebe <thekid@thekid.de> | 2014-07-06 14:58:20 +0200 |
---|---|---|
committer | Timm Friebe <thekid@thekid.de> | 2014-07-06 14:58:44 +0200 |
commit | ff66e597314f39e7015fb7c238c29d8f6e02dcab (patch) | |
tree | 09173d23f7bb2bc7244f0c6413a05307883cc238 | |
parent | df908275f65dbac0990576db6be0534433f72c0d (diff) | |
download | php-git-ff66e597314f39e7015fb7c238c29d8f6e02dcab.tar.gz |
Support nested static calls
-rwxr-xr-x | Zend/tests/methods-on-non-objects-nested-calls-static.phpt | 22 | ||||
-rw-r--r-- | Zend/tests/methods-on-non-objects-nested-calls.phpt | 2 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 5 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 112 |
4 files changed, 108 insertions, 33 deletions
diff --git a/Zend/tests/methods-on-non-objects-nested-calls-static.phpt b/Zend/tests/methods-on-non-objects-nested-calls-static.phpt new file mode 100755 index 0000000000..9e969b7d68 --- /dev/null +++ b/Zend/tests/methods-on-non-objects-nested-calls-static.phpt @@ -0,0 +1,22 @@ +--TEST-- +Catch method calls on non-objects with nested calls to static methods +--FILE-- +<?php +class Nesting { + static 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(Nesting::nested())); +echo "Alive\n"; +?> +--EXPECTF-- +Called #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 index 117e29f896..c92b0cb034 100644 --- a/Zend/tests/methods-on-non-objects-nested-calls.phpt +++ b/Zend/tests/methods-on-non-objects-nested-calls.phpt @@ -49,4 +49,6 @@ Called #10 NULL Called #11 NULL +Called #12 +NULL Alive diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 01b497774e..21bf19a836 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2479,7 +2479,10 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { 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 e1f60d38e8..368c20d580 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9316,12 +9316,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -10214,12 +10217,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -11113,12 +11119,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -12592,12 +12601,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -15864,12 +15876,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -18244,12 +18259,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -20585,12 +20603,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -24076,12 +24097,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -25751,12 +25775,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -27192,12 +27219,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -28539,12 +28569,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -30314,12 +30347,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -33586,12 +33622,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -35731,12 +35770,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -37931,12 +37973,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; @@ -41132,12 +41177,15 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H HANDLE_EXCEPTION(); } - /* Skip over arguments until fcall opcode, return NULL */ + /* No exception raised: Skip over arguments until fcall opcode, return NULL */ do { ZEND_VM_INC_OPCODE(); opline++; - if (opline->opcode == ZEND_INIT_METHOD_CALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME) { + if (opline->opcode == ZEND_INIT_METHOD_CALL || + opline->opcode == ZEND_INIT_FCALL_BY_NAME || + opline->opcode == ZEND_INIT_STATIC_METHOD_CALL + ) { nested++; } else if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { nested--; |