diff options
author | Timm Friebe <thekid@thekid.de> | 2014-07-06 12:50:32 +0200 |
---|---|---|
committer | Timm Friebe <thekid@thekid.de> | 2014-07-06 12:50:32 +0200 |
commit | dc68aa32bc33afcf9c42494c6db498f7c47c93e9 (patch) | |
tree | 90a06c61077f6afe90108f5a8b15fa162b06c9cb | |
parent | a782f697df9c944f0645d56c078847d8316f8b9b (diff) | |
download | php-git-dc68aa32bc33afcf9c42494c6db498f7c47c93e9.tar.gz |
Only allocate NULL return value if it's actually used
-rwxr-xr-x | Zend/tests/methods-on-non-objects-return-unused.phpt | 15 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 8 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 128 |
3 files changed, 100 insertions, 51 deletions
diff --git a/Zend/tests/methods-on-non-objects-return-unused.phpt b/Zend/tests/methods-on-non-objects-return-unused.phpt new file mode 100755 index 0000000000..19703b46c6 --- /dev/null +++ b/Zend/tests/methods-on-non-objects-return-unused.phpt @@ -0,0 +1,15 @@ +--TEST-- +Catch method calls on non-objects without using return value +--FILE-- +<?php +set_error_handler(function($code, $message) { + echo "Caught\n"; +}); + +$x= null; +$x->method(); +echo "Alive\n"; +?> +--EXPECTF-- +Caught +Alive diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 32b910fe48..4af4f984c3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2482,9 +2482,11 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV) } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f323381f48..e745dd0850 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9325,9 +9325,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -10212,9 +10214,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -11100,9 +11104,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -12568,9 +12574,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -15828,9 +15836,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -18196,9 +18206,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -20525,9 +20537,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -24004,9 +24018,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -25668,9 +25684,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -27098,9 +27116,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -28434,9 +28454,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -30198,9 +30220,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -33459,9 +33483,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -35593,9 +35619,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -37782,9 +37810,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } @@ -40972,9 +41002,11 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H } } while (nested); - ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); - EX_T(opline->result.var).var.fcall_returned_reference = 0; - EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + if (RETURN_VALUE_USED(opline)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.var).var.ptr); + EX_T(opline->result.var).var.fcall_returned_reference = 0; + EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr; + } ZEND_VM_NEXT_OPCODE(); } |