summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Friebe <thekid@thekid.de>2014-07-06 12:50:32 +0200
committerTimm Friebe <thekid@thekid.de>2014-07-06 12:50:32 +0200
commitdc68aa32bc33afcf9c42494c6db498f7c47c93e9 (patch)
tree90a06c61077f6afe90108f5a8b15fa162b06c9cb
parenta782f697df9c944f0645d56c078847d8316f8b9b (diff)
downloadphp-git-dc68aa32bc33afcf9c42494c6db498f7c47c93e9.tar.gz
Only allocate NULL return value if it's actually used
-rwxr-xr-xZend/tests/methods-on-non-objects-return-unused.phpt15
-rw-r--r--Zend/zend_vm_def.h8
-rw-r--r--Zend/zend_vm_execute.h128
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();
}