]> granicus.if.org Git - php/commitdiff
Explicitly check for exceptions in by-ref obj prop assign
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 10 Oct 2019 12:41:35 +0000 (14:41 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 10 Oct 2019 12:41:35 +0000 (14:41 +0200)
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.

Zend/zend_execute.c
tests/classes/static_properties_003_error4.phpt

index b69d0a88d55e8623e0ad28e2155e61e59003a206..368d6b2dcc8ba2150609b432f7709c2a3bdd0014 100644 (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");
index 6a4eafcd2a88c2199163c1ee4c41b73e644f4bbb..7c54fc42adb6544522646a981a3e7e23aa3f1d2d 100644 (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==