Explicitly check for exceptions in by-ref obj prop assign

Relying on setting ERROR if an exception happened during the
property address fetch is both a bit fragile and may pessimize
other codepaths that will check for exceptions in the VM. Adding
an extra exception check instead, which should also allow us to
drop the use of ERROR in this area in master.
This commit is contained in:
Nikita Popov 2019-10-10 14:41:35 +02:00
parent 12f4e9e020
commit 4463acb951
2 changed files with 9 additions and 6 deletions

View File

@ -2858,7 +2858,7 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container
variable_ptr = Z_INDIRECT_P(variable_ptr);
}
if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
if (UNEXPECTED(Z_ISERROR_P(variable_ptr) || EG(exception))) {
variable_ptr = &EG(uninitialized_zval);
} else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) {
zend_throw_error(NULL, "Cannot assign by reference to overloaded object");

View File

@ -8,17 +8,20 @@ class C {
$c = new C;
echo "\n--> Access non-visible static prop like instance prop:\n";
$c->y =& $ref;
try {
$c->y =& $ref;
} catch (Error $e) {
echo $e, "\n";
}
?>
==Done==
--EXPECTF--
--> Access non-visible static prop like instance prop:
Fatal error: Uncaught Error: Cannot access protected property C::$y in %s:8
Error: Cannot access protected property C::$y in %s:9
Stack trace:
#0 {main}
Next Error: Cannot access protected property C::$y in %s:8
Next Error: Cannot access protected property C::$y in %s:9
Stack trace:
#0 {main}
thrown in %s on line 8
==Done==