]> granicus.if.org Git - php/commitdiff
Fixed memory leaks caused by exceptions thrown from destructors.
authorDmitry Stogov <dmitry@zend.com>
Tue, 6 Dec 2016 21:41:07 +0000 (00:41 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 6 Dec 2016 21:41:07 +0000 (00:41 +0300)
NEWS
Zend/tests/foreach_empty_loop_leak.phpt [new file with mode: 0644]
Zend/tests/temporary_cleaning_013.phpt [new file with mode: 0644]
Zend/tests/temporary_cleaning_014.phpt [new file with mode: 0644]
Zend/zend_execute.c
Zend/zend_operators.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index a6f9a8dcf4d055224df487f42a0ebe88e6b607b8..4ba1c5b8837a98973f75ebf7aebe8c77f9f88032 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,8 @@ PHP                                                                        NEWS
     (Yasuo)
   . Implemented FR #49806 (proc_nice() for Windows). (Kalle)
   . Fix pthreads detection when cross-compiling (ffontaine)
+  . Fixed memory leaks caused by exceptions thrown from destructors. (Bob,
+    Dmitry).
   . Fixed bug #73215 (uniqid() should use better random source). (Yasuo)
   . Fixed bug #73337 (try/catch not working with two exceptions inside a same
     operation). (Dmitry)
diff --git a/Zend/tests/foreach_empty_loop_leak.phpt b/Zend/tests/foreach_empty_loop_leak.phpt
new file mode 100644 (file)
index 0000000..70b3911
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Empty foreach loops with exception must not leak
+--FILE--
+<?php
+
+class Foo implements IteratorAggregate {
+    public function getIterator() {
+        return new ArrayIterator([]);
+    }
+    public function __destruct() {
+        throw new Exception;
+    }
+}
+
+try {
+    foreach (new Foo as $x);
+} catch (Exception $e) {
+    echo "Exception caught\n";
+}
+
+?>
+--EXPECT--
+Exception caught
diff --git a/Zend/tests/temporary_cleaning_013.phpt b/Zend/tests/temporary_cleaning_013.phpt
new file mode 100644 (file)
index 0000000..34e4080
--- /dev/null
@@ -0,0 +1,311 @@
+--TEST--
+Exceptions thrown in operand cleaning must cause leak of return value
+--FILE--
+<?php
+
+try {
+       var_dump(new class {
+               function __toString() { return "a"; }
+               function __destruct() { throw new Exception; }
+       } . "foo");
+} catch (Exception $e) { print "caught Exception 1\n"; }
+
+try {
+       var_dump([0] + [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 2\n"; }
+
+try {
+       $foo = [0];
+       var_dump($foo += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 3\n"; }
+
+try {
+       $foo = (object)["foo" => [0]];
+       var_dump($foo->foo += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 4\n"; }
+
+try {
+       $foo = new class {
+               function __get($x) { return [0]; }
+               function __set($x, $y) {}
+       };
+       var_dump($foo->foo += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 5\n"; }
+
+try {
+       $foo = new class {
+               public $bar = [0];
+               function &__get($x) { return $this->bar; }
+       };
+       var_dump($foo->foo += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 6\n"; }
+
+try {
+       $foo = new class implements ArrayAccess {
+               function offsetGet($x) { return [0]; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+       };
+       var_dump($foo[0] += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 7\n"; }
+
+try {
+       $foo = new class implements ArrayAccess {
+               public $foo = [0];
+               function &offsetGet($x) { return $this->foo; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+       };
+       var_dump($foo[0] += [new class {
+               function __destruct() { throw new Exception; }
+       }]);
+} catch (Exception $e) { print "caught Exception 8\n"; }
+
+try {
+       var_dump((function() { return new class {
+               function __construct() { $this->foo = new stdClass; }
+               function __destruct() { throw new Exception; }
+       }; })()->foo++);
+} catch (Exception $e) { print "caught Exception 9\n"; }
+
+try {
+       var_dump((function() { return new class {
+               function __get($x) { return new stdClass; }
+               function __set($x, $y) {}
+               function __destruct() { throw new Exception; }
+       }; })()->foo++);
+} catch (Exception $e) { print "caught Exception 10\n"; }
+
+try {
+       var_dump((function() { return new class {
+               function __construct() { $this->bar = new stdClass; }
+               function &__get($x) { return $this->bar; }
+               function __destruct() { throw new Exception; }
+       }; })()->foo++);
+} catch (Exception $e) { print "caught Exception 11\n"; }
+
+try {
+       var_dump(++(function() { return new class {
+               function __construct() { $this->foo = new stdClass; }
+               function __destruct() { throw new Exception; }
+       }; })()->foo);
+} catch (Exception $e) { print "caught Exception 12\n"; }
+
+try {
+       var_dump(++(function() { return new class {
+               function __get($x) { return new stdClass; }
+               function __set($x, $y) {}
+               function __destruct() { throw new Exception; }
+       }; })()->foo);
+} catch (Exception $e) { print "caught Exception 13\n"; }
+
+try {
+       var_dump(++(function() { return new class {
+               function __construct() { $this->bar = new stdClass; }
+               function &__get($x) { return $this->bar; }
+               function __destruct() { throw new Exception; }
+       }; })()->foo);
+} catch (Exception $e) { print "caught Exception 14\n"; }
+
+try {
+       var_dump((function() { return new class implements ArrayAccess {
+               function offsetGet($x) { return [new stdClass]; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+               function __destruct() { throw new Exception; }
+       }; })()[0]++);
+} catch (Exception $e) { print "caught Exception 15\n"; }
+
+try {
+       var_dump(++(function() { return new class implements ArrayAccess {
+               function offsetGet($x) { return [new stdClass]; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+               function __destruct() { throw new Exception; }
+       }; })()[0]);
+} catch (Exception $e) { print "caught Exception 16\n"; }
+
+try {
+       var_dump((new class {
+               function __construct() { $this->foo = new stdClass; }
+               function __destruct() { throw new Exception; }
+       })->foo);
+} catch (Exception $e) { print "caught Exception 17\n"; }
+
+try {
+       var_dump((new class {
+               function __get($x) { return new stdClass; }
+               function __set($x, $y) {}
+               function __destruct() { throw new Exception; }
+       })->foo);
+} catch (Exception $e) { print "caught Exception 18\n"; }
+
+try {
+       var_dump((new class implements ArrayAccess {
+               function offsetGet($x) { return [new stdClass]; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+               function __destruct() { throw new Exception; }
+       })[0]);
+} catch (Exception $e) { print "caught Exception 19\n"; }
+
+try {
+       var_dump(isset((new class {
+               function __construct() { $this->foo = new stdClass; }
+               function __destruct() { throw new Exception; }
+       })->foo->bar));
+} catch (Exception $e) { print "caught Exception 20\n"; }
+
+try {
+       var_dump(isset((new class {
+               function __get($x) { return new stdClass; }
+               function __set($x, $y) {}
+               function __destruct() { throw new Exception; }
+       })->foo->bar));
+} catch (Exception $e) { print "caught Exception 21\n"; }
+
+try {
+       var_dump(isset((new class implements ArrayAccess {
+               function offsetGet($x) { return [new stdClass]; }
+               function offsetSet($x, $y) {}
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+               function __destruct() { throw new Exception; }
+       })[0]->bar));
+} catch (Exception $e) { print "caught Exception 22\n"; }
+
+try {
+       $foo = new class {
+               function __destruct() { throw new Exception; }
+       };
+       var_dump($foo = new stdClass);
+} catch (Exception $e) { print "caught Exception 23\n"; }
+
+try {
+       $foo = [new class {
+               function __destruct() { throw new Exception; }
+       }];
+       var_dump($foo[0] = new stdClass);
+} catch (Exception $e) { print "caught Exception 24\n"; }
+
+try {
+       $foo = (object) ["foo" => new class {
+               function __destruct() { throw new Exception; }
+       }];
+       var_dump($foo->foo = new stdClass);
+} catch (Exception $e) { print "caught Exception 25\n"; }
+
+try {
+       $foo = new class {
+               function __get($x) {}
+               function __set($x, $y) { throw new Exception; }
+       };
+       var_dump($foo->foo = new stdClass);
+} catch (Exception $e) { print "caught Exception 26\n"; }
+
+try {
+       $foo = new class implements ArrayAccess {
+               function offsetGet($x) {}
+               function offsetSet($x, $y) { throw new Exception; }
+               function offsetExists($x) { return true; }
+               function offsetUnset($x) {}
+       };
+       var_dump($foo[0] = new stdClass);
+} catch (Exception $e) { print "caught Exception 27\n"; }
+
+try {
+       $foo = new class {
+               function __destruct() { throw new Exception; }
+       };
+       $bar = new stdClass;
+       var_dump($foo = &$bar);
+} catch (Exception $e) { print "caught Exception 28\n"; }
+
+try {
+       $f = function() {
+               return new class {
+                       function __toString() { return "a"; }
+                       function __destruct() { throw new Exception; }
+               };
+       };
+       var_dump("{$f()}foo");
+} catch (Exception $e) { print "caught Exception 29\n"; }
+
+try {
+       $f = function() {
+               return new class {
+                       function __toString() { return "a"; }
+                       function __destruct() { throw new Exception; }
+               };
+       };
+       var_dump("bar{$f()}foo");
+} catch (Exception $e) { print "caught Exception 30\n"; }
+
+try {
+       var_dump((string) new class {
+               function __toString() { $x = "Z"; return ++$x; }
+               function __destruct() { throw new Exception; }
+       });
+} catch (Exception $e) { print "caught Exception 31\n"; }
+
+try {
+       var_dump(clone (new class {
+               function __clone() { throw new Exception; }
+       }));
+} catch (Exception $e) { print "caught Exception 32\n"; }
+
+?>
+--EXPECTF--
+caught Exception 1
+caught Exception 2
+caught Exception 3
+caught Exception 4
+caught Exception 5
+caught Exception 6
+caught Exception 7
+caught Exception 8
+caught Exception 9
+caught Exception 10
+caught Exception 11
+caught Exception 12
+caught Exception 13
+caught Exception 14
+
+Notice: Indirect modification of overloaded element of class@anonymous has no effect in %s on line %d
+caught Exception 15
+
+Notice: Indirect modification of overloaded element of class@anonymous has no effect in %s on line %d
+caught Exception 16
+caught Exception 17
+caught Exception 18
+caught Exception 19
+caught Exception 20
+caught Exception 21
+caught Exception 22
+caught Exception 23
+caught Exception 24
+caught Exception 25
+caught Exception 26
+caught Exception 27
+caught Exception 28
+caught Exception 29
+caught Exception 30
+caught Exception 31
+caught Exception 32
diff --git a/Zend/tests/temporary_cleaning_014.phpt b/Zend/tests/temporary_cleaning_014.phpt
new file mode 100644 (file)
index 0000000..a64f5a1
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Leak in JMP_SET
+--FILE--
+<?php
+set_error_handler(function() { throw new Exception; });
+try {
+       new GMP ?: null;
+} catch (Exception $e) {
+}
+?>
+DONE
+--EXPECT--
+DONE
index a2df1ef0485e3df1807e61149d15c2bae88a6c21..4c107ff263a23d8b2090580de5f0332133c8e82c 100644 (file)
@@ -1369,6 +1369,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object,
                z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
                if (UNEXPECTED(EG(exception))) {
                        OBJ_RELEASE(Z_OBJ(obj));
+                       ZVAL_UNDEF(result);
                        return;
                }
 
@@ -1414,6 +1415,9 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object,
                zptr = z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
                if (UNEXPECTED(EG(exception))) {
                        OBJ_RELEASE(Z_OBJ(obj));
+                       if (result) {
+                               ZVAL_UNDEF(result);
+                       }
                        return;
                }
 
@@ -1459,6 +1463,9 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z
                z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
                if (UNEXPECTED(EG(exception))) {
                        OBJ_RELEASE(Z_OBJ(obj));
+                       if (result) {
+                               ZVAL_UNDEF(result);
+                       }
                        return;
                }
                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
@@ -2974,6 +2981,7 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
                        break; \
                } \
                if ((_check) && UNEXPECTED(EG(exception))) { \
+                       ZVAL_UNDEF(EX_VAR(opline->result.var)); \
                        HANDLE_EXCEPTION(); \
                } \
                if (__result) { \
@@ -2985,6 +2993,7 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
        } while (0)
 # define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check) do { \
                if ((_check) && UNEXPECTED(EG(exception))) { \
+                       ZVAL_UNDEF(EX_VAR(opline->result.var)); \
                        HANDLE_EXCEPTION(); \
                } \
                if (_result) { \
@@ -2996,6 +3005,7 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
        } while (0)
 # define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check) do { \
                if ((_check) && UNEXPECTED(EG(exception))) { \
+                       ZVAL_UNDEF(EX_VAR(opline->result.var)); \
                        HANDLE_EXCEPTION(); \
                } \
                if (!(_result)) { \
@@ -3024,6 +3034,12 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
 #define GET_OP2_UNDEF_CV(ptr, type) \
        _get_zval_cv_lookup_ ## type(ptr, opline->op2.var, execute_data)
 
+#define UNDEF_RESULT() do { \
+               if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { \
+                       ZVAL_UNDEF(EX_VAR(opline->result.var)); \
+               } \
+       } while (0)
+
 #include "zend_vm_execute.h"
 
 ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler)
index 2d6df66a68dd3730bddbbcaf5f2372eca69f8c29..9f62db9aaadbff5da40ceef406028b7651fa0053 100644 (file)
@@ -217,6 +217,9 @@ ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
                                        ZVAL_COPY(&(holder), op);                                               \
                                        convert_to_long_base(&(holder), 10);                    \
                                        if (UNEXPECTED(EG(exception))) {                                \
+                                               if (result != op1) {                                            \
+                                                       ZVAL_UNDEF(result);                                             \
+                                               }                                                                                       \
                                                return FAILURE;                                                         \
                                        }                                                                                               \
                                        if (Z_TYPE(holder) == IS_LONG) {                                \
@@ -252,7 +255,7 @@ ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
 
 /* }}} */
 
-#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, op, op_func) \
+#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, op, op_func) \
        do {                                                                                                                            \
                if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {                                             \
                        if (Z_ISREF_P(op1)) {                                                                           \
@@ -265,6 +268,9 @@ ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
                        ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(op, op_func);                      \
                        op1_lval = _zval_get_long_func_noisy(op1);                                      \
                        if (UNEXPECTED(EG(exception))) {                                                        \
+                               if (result != op1) {                                                                    \
+                                       ZVAL_UNDEF(result);                                                                     \
+                               }                                                                                                               \
                                return FAILURE;                                                                                 \
                        }                                                                                                                       \
                } else {                                                                                                                \
@@ -283,6 +289,9 @@ ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
                        ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(op);                                       \
                        op2_lval = _zval_get_long_func_noisy(op2);                                      \
                        if (UNEXPECTED(EG(exception))) {                                                        \
+                               if (result != op1) {                                                                    \
+                                       ZVAL_UNDEF(result);                                                                     \
+                               }                                                                                                               \
                                return FAILURE;                                                                                 \
                        }                                                                                                                       \
                } else {                                                                                                                \
@@ -936,6 +945,9 @@ ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2) /* {
                                        zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
                                        converted = 1;
                                } else {
+                                       if (result != op1) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        zend_throw_error(NULL, "Unsupported operand types");
                                        return FAILURE; /* unknown datatype */
                                }
@@ -978,6 +990,9 @@ ZEND_API int ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2) /* {
                                        zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
                                        converted = 1;
                                } else {
+                                       if (result != op1) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        zend_throw_error(NULL, "Unsupported operand types");
                                        return FAILURE; /* unknown datatype */
                                }
@@ -1025,6 +1040,9 @@ ZEND_API int ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2) /* {
                                        zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
                                        converted = 1;
                                } else {
+                                       if (result != op1) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        zend_throw_error(NULL, "Unsupported operand types");
                                        return FAILURE; /* unknown datatype */
                                }
@@ -1113,6 +1131,9 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
                                        }
                                        converted = 1;
                                } else {
+                                       if (result != op1) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        zend_throw_error(NULL, "Unsupported operand types");
                                        return FAILURE;
                                }
@@ -1178,6 +1199,9 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* {
                                        zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
                                        converted = 1;
                                } else {
+                                       if (result != op1) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        zend_throw_error(NULL, "Unsupported operand types");
                                        return FAILURE; /* unknown datatype */
                                }
@@ -1190,7 +1214,7 @@ ZEND_API int ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2) /* {
 {
        zend_long op1_lval, op2_lval;
 
-       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, ZEND_MOD, mod_function);
+       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_MOD, mod_function);
 
        if (op2_lval == 0) {
                /* modulus by zero */
@@ -1330,6 +1354,9 @@ try_again:
                default:
                        ZEND_TRY_UNARY_OBJECT_OPERATION(ZEND_BW_NOT);
 
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        zend_throw_error(NULL, "Unsupported operand types");
                        return FAILURE;
        }
@@ -1389,6 +1416,9 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
                ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR, bitwise_or_function);
                op1_lval = _zval_get_long_func_noisy(op1);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1398,6 +1428,9 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
                ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_OR);
                op2_lval = _zval_get_long_func_noisy(op2);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1465,6 +1498,9 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
                ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND, bitwise_and_function);
                op1_lval = _zval_get_long_func_noisy(op1);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1474,6 +1510,9 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
                ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_AND);
                op2_lval = _zval_get_long_func_noisy(op2);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1541,6 +1580,9 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
                ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR, bitwise_xor_function);
                op1_lval = _zval_get_long_func_noisy(op1);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1550,6 +1592,9 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
                ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_XOR);
                op2_lval = _zval_get_long_func_noisy(op2);
                if (UNEXPECTED(EG(exception))) {
+                       if (result != op1) {
+                               ZVAL_UNDEF(result);
+                       }
                        return FAILURE;
                }
        } else {
@@ -1568,7 +1613,7 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
 {
        zend_long op1_lval, op2_lval;
 
-       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, ZEND_SL, shift_left_function);
+       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SL, shift_left_function);
 
        /* prevent wrapping quirkiness on some processors where << 64 + x == << x */
        if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
@@ -1604,7 +1649,7 @@ ZEND_API int ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *o
 {
        zend_long op1_lval, op2_lval;
 
-       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, ZEND_SR, shift_right_function);
+       convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SR, shift_right_function);
 
        /* prevent wrapping quirkiness on some processors where >> 64 + x == >> x */
        if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
@@ -1653,6 +1698,9 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
                        if (use_copy1) {
                                if (UNEXPECTED(EG(exception))) {
                                        zval_dtor(&op1_copy);
+                                       if (orig_op1 != result) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        return FAILURE;
                                }
                                if (result == op1) {
@@ -1678,6 +1726,9 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
                                                zval_dtor(op1);
                                        }
                                        zval_dtor(&op2_copy);
+                                       if (orig_op1 != result) {
+                                               ZVAL_UNDEF(result);
+                                       }
                                        return FAILURE;
                                }
                                op2 = &op2_copy;
index 6e2f31a4424d8ff09f058ec3ca4a8f972d41fa82..da819894acc39fd0a51106af0904217dbbe704f0 100644 (file)
@@ -186,6 +186,7 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -777,6 +778,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                FREE_UNFETCHED_OP2();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -893,6 +895,7 @@ ZEND_VM_C_LABEL(assign_dim_op_convert_to_array):
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
                        } else {
@@ -1039,6 +1042,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -1118,6 +1122,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -1406,9 +1411,11 @@ ZEND_VM_C_LABEL(fetch_this):
                                        break;
                                case BP_VAR_RW:
                                case BP_VAR_W:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot re-assign $this");
                                        break;
                                case BP_VAR_UNSET:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot unset $this");
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
@@ -1546,6 +1553,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -1558,6 +1566,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
                                        zend_string_release(name);
                                }
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -1571,6 +1580,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
                                        zend_string_release(name);
                                }
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -1583,6 +1593,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -1596,6 +1607,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
                        zend_string_release(name);
                }
                FREE_OP1();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (OP1_TYPE == IS_CONST && retval) {
@@ -1752,6 +1764,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUS
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        FREE_UNFETCHED_OP2();
                        FREE_UNFETCHED_OP1();
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
@@ -1766,6 +1779,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUS
                        zend_throw_error(NULL, "Cannot use [] for reading");
                        FREE_UNFETCHED_OP2();
                        FREE_UNFETCHED_OP1();
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -1808,6 +1822,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -1881,6 +1896,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -1907,6 +1923,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -1932,6 +1949,7 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -2008,12 +2026,14 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST
                if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        FREE_OP2();
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        FREE_OP2();
                        FREE_OP1_VAR_PTR();
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -2040,6 +2060,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -2080,6 +2101,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC(
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                FREE_UNFETCHED_OP_DATA();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -2213,7 +2235,7 @@ ZEND_VM_C_LABEL(fast_assign_obj):
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        FREE_OP_DATA();
@@ -2275,7 +2297,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -2285,6 +2307,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                FREE_UNFETCHED_OP_DATA();
                                FREE_OP1_VAR_PTR();
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
@@ -2363,6 +2386,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
                zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
                FREE_OP1_VAR_PTR();
                FREE_OP2_VAR_PTR();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
 
        } else if (OP2_TYPE == IS_VAR &&
@@ -2371,6 +2395,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
                zend_error(E_NOTICE, "Only variables should be assigned by reference");
                if (UNEXPECTED(EG(exception) != NULL)) {
                        FREE_OP2_VAR_PTR();
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -2427,11 +2452,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
                execute_data = EX(prev_execute_data);
 
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       const zend_op *old_opline = EX(opline);
                        zend_throw_exception_internal(NULL);
-                       if (RETURN_VALUE_USED(old_opline)) {
-                               zval_ptr_dtor(EX_VAR(old_opline->result.var));
-                       }
                        HANDLE_EXCEPTION_LEAVE();
                }
 
@@ -2465,11 +2486,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
                zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
 
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       const zend_op *old_opline = EX(opline);
                        zend_throw_exception_internal(NULL);
-                       if (RETURN_VALUE_USED(old_opline)) {
-                               zval_ptr_dtor(EX_VAR(old_opline->result.var));
-                       }
                        HANDLE_EXCEPTION_LEAVE();
                }
 
@@ -2891,6 +2908,7 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
                                for (i = 0; i <= opline->extended_value; i++) {
                                        zend_string_release(rope[i]);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -3507,9 +3525,6 @@ ZEND_VM_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -3570,6 +3585,7 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                           UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -3581,6 +3597,7 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
                 && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
                        zend_vm_stack_free_call_frame(call);
                        zend_throw_exception_internal(NULL);
+                   UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -3609,9 +3626,6 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
        ZEND_VM_SET_OPCODE(opline + 1);
@@ -3631,6 +3645,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
        if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
                        zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
@@ -3639,6 +3654,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -3670,9 +3686,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
 
                if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
                  && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
-                       if (RETURN_VALUE_USED(opline)) {
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                       }
+                       UNDEF_RESULT();
                        ZEND_VM_C_GOTO(fcall_end);
                }
 
@@ -3710,6 +3724,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
                call->prev_execute_data = execute_data;
 
                if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -3735,9 +3750,6 @@ ZEND_VM_C_LABEL(fcall_end):
        zend_vm_stack_free_call_frame(call);
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -3790,12 +3802,6 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED)
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (OP1_TYPE == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4807,6 +4813,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -4815,6 +4822,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
                ce = zend_fetch_class(NULL, opline->op1.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -4823,13 +4831,13 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
 
        result = EX_VAR(opline->result.var);
        if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+               ZVAL_UNDEF(result);
                HANDLE_EXCEPTION();
        }
 
        constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
        if (constructor == NULL) {
                if (UNEXPECTED(EG(exception))) {
-                       zval_ptr_dtor(result);
                        HANDLE_EXCEPTION();
                }
 
@@ -4867,7 +4875,6 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
        USE_OPLINE
        zend_free_op free_op1;
        zval *obj;
-       zend_object *clone_obj;
        zend_class_entry *ce, *scope;
        zend_function *clone;
        zend_object_clone_obj_t clone_call;
@@ -4877,6 +4884,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
 
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -4889,6 +4897,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
                                break;
                                }
                        }
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
                                if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4907,6 +4916,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
        if (UNEXPECTED(clone_call == NULL)) {
                zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
                FREE_OP1();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -4918,6 +4928,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
                        if (UNEXPECTED(ce != scope)) {
                                zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
@@ -4927,17 +4938,13 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
                        if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
                                zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
        }
 
-       clone_obj = clone_call(obj);
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
-       } else {
-               OBJ_RELEASE(clone_obj);
-       }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
 
        FREE_OP1();
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4968,6 +4975,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, UNUSED, CONST, CONST_FETCH)
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                } else {
                        zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -5010,6 +5018,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -5019,6 +5028,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
                                ce = zend_fetch_class(NULL, opline->op1.num);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        } else {
@@ -5033,12 +5043,14 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
                        scope = EX(func)->op_array.scope;
                        if (!zend_verify_const_access(c, scope)) {
                                zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        value = &c->value;
                        if (Z_CONSTANT_P(value)) {
                                zval_update_constant_ex(value, ce);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -5049,6 +5061,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
                        }
                } else {
                        zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } while (0);
@@ -5290,6 +5303,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
                }
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
                if (RETURN_VALUE_USED(opline)) {
@@ -5330,6 +5344,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
@@ -5648,6 +5663,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -5657,6 +5673,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
                                        FREE_OP1();
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -5666,6 +5683,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                OBJ_RELEASE(&iter->std);
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -5674,10 +5692,13 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
                        FREE_OP1();
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -5804,6 +5825,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -5817,6 +5839,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
                                        } else {
                                                FREE_OP1();
                                        }
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -5830,6 +5853,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
                                } else {
                                        FREE_OP1();
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -5842,10 +5866,13 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
                        } else {
                                FREE_OP1();
                        }
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -5979,11 +6006,13 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
                                 * In case that ever happens we need an additional flag. */
                                iter->funcs->move_forward(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                                if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
                                        /* reached end of iteration */
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                        ZEND_VM_C_GOTO(fe_fetch_r_exit);
@@ -5991,6 +6020,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
                        }
                        value = iter->funcs->get_current_data(iter);
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                        if (!value) {
@@ -6001,6 +6031,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
                                if (iter->funcs->get_current_key) {
                                        iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                } else {
@@ -6012,6 +6043,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                if (UNEXPECTED(EG(exception))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 ZEND_VM_C_LABEL(fe_fetch_r_exit):
@@ -6167,11 +6199,13 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
                                 * In case that ever happens we need an additional flag. */
                                iter->funcs->move_forward(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                                if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
                                        /* reached end of iteration */
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                        ZEND_VM_C_GOTO(fe_fetch_w_exit);
@@ -6179,6 +6213,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
                        }
                        value = iter->funcs->get_current_data(iter);
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                        if (!value) {
@@ -6189,6 +6224,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
                                if (iter->funcs->get_current_key) {
                                        iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                } else {
@@ -6200,6 +6236,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                if (UNEXPECTED(EG(exception))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 ZEND_VM_C_LABEL(fe_fetch_w_exit):
@@ -6248,6 +6285,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
                        SAVE_OPLINE();
                        result = !i_zend_is_true(value);
                        if (UNEXPECTED(EG(exception))) {
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -6320,6 +6358,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -6333,6 +6372,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                                        zend_string_release(Z_STR(tmp));
                                }
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -6520,6 +6560,7 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, C
        if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -6631,6 +6672,7 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
        zend_free_op free_op1;
        zval *value;
        zval *ref = NULL;
+       int ret;
 
        SAVE_OPLINE();
        value = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -6641,7 +6683,16 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
                }
                value = Z_REFVAL_P(value);
        }
-       if (i_zend_is_true(value)) {
+
+       ret = i_zend_is_true(value);
+
+       if (UNEXPECTED(EG(exception))) {
+               FREE_OP1();
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
+               HANDLE_EXCEPTION();
+       }
+
+       if (ret) {
                zval *result = EX_VAR(opline->result.var);
 
                ZVAL_COPY_VALUE(result, value);
@@ -6658,11 +6709,12 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
                                Z_ADDREF_P(result);
                        }
                }
-               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_CONTINUE();
        }
 
        FREE_OP1();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
@@ -6907,6 +6959,7 @@ ZEND_VM_C_LABEL(try_instanceof):
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
                                FREE_OP1();
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -7066,7 +7119,8 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
 
 ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
 {
-       uint32_t throw_op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
+       const zend_op *throw_op = EG(opline_before_exception);
+       uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
        int i, current_try_catch_offset = -1;
 
        {
@@ -7095,6 +7149,24 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
 
        cleanup_unfinished_calls(execute_data, throw_op_num);
 
+       if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
+               switch (throw_op->opcode) {
+                       case ZEND_ADD_ARRAY_ELEMENT:
+                       case ZEND_ROPE_ADD:
+                               break; /* exception while building structures, live range handling will free those */
+
+                       case ZEND_FETCH_CLASS:
+                       case ZEND_DECLARE_CLASS:
+                       case ZEND_DECLARE_INHERITED_CLASS:
+                       case ZEND_DECLARE_ANON_CLASS:
+                       case ZEND_DECLARE_ANON_INHERITED_CLASS:
+                               break; /* return value is zend_class_entry pointer */
+
+                       default:
+                               zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
+               }
+       }
+
        ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num);
 }
 
@@ -7227,6 +7299,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                FREE_UNFETCHED_OP2();
                FREE_UNFETCHED_OP1();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -7367,6 +7440,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
        if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
                zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
                FREE_OP1();
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -7392,6 +7466,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
                                        zval_ptr_dtor(val);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
@@ -7399,6 +7474,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
                                zval_ptr_dtor(val);
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -7414,6 +7490,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                                if (!EG(exception)) {
                                        zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
 
@@ -7422,6 +7499,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                                iter->funcs->rewind(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -7430,6 +7508,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                }
        } else {
                zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -7858,9 +7937,6 @@ ZEND_VM_C_LABEL(call_trampoline_end):
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION_LEAVE();
        }
 
@@ -7963,6 +8039,7 @@ ZEND_VM_HANDLER(184, ZEND_FETCH_THIS, UNUSED, UNUSED)
        } else {
                SAVE_OPLINE();
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 }
index f1e9e6fd841d3b50276e07cd703c053018d26728..7727abd9ee185db760e8679264d17f9cf81d2d5c 100644 (file)
@@ -502,11 +502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
                execute_data = EX(prev_execute_data);
 
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       const zend_op *old_opline = EX(opline);
                        zend_throw_exception_internal(NULL);
-                       if (RETURN_VALUE_USED(old_opline)) {
-                               zval_ptr_dtor(EX_VAR(old_opline->result.var));
-                       }
                        HANDLE_EXCEPTION_LEAVE();
                }
 
@@ -540,11 +536,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
                zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
 
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       const zend_op *old_opline = EX(opline);
                        zend_throw_exception_internal(NULL);
-                       if (RETURN_VALUE_USED(old_opline)) {
-                               zval_ptr_dtor(EX_VAR(old_opline->result.var));
-                       }
                        HANDLE_EXCEPTION_LEAVE();
                }
 
@@ -645,9 +637,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HA
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (0) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -692,9 +681,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETVAL_USED_HAND
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (1) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -777,6 +763,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                           UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -788,6 +775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
                 && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
                        zend_vm_stack_free_call_frame(call);
                        zend_throw_exception_internal(NULL);
+                   UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -816,9 +804,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (0) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
        ZEND_VM_SET_OPCODE(opline + 1);
@@ -856,6 +841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                           UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -867,6 +853,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
                 && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
                        zend_vm_stack_free_call_frame(call);
                        zend_throw_exception_internal(NULL);
+                   UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -895,9 +882,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_U
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (1) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
        ZEND_VM_SET_OPCODE(opline + 1);
@@ -917,6 +901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
        if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
                        zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
@@ -925,6 +910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -956,9 +942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
 
                if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
                  && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
-                       if (0) {
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                       }
+                       UNDEF_RESULT();
                        goto fcall_end;
                }
 
@@ -996,6 +980,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
                call->prev_execute_data = execute_data;
 
                if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -1021,9 +1006,6 @@ fcall_end:
        zend_vm_stack_free_call_frame(call);
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (0) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -1044,6 +1026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
        if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
                        zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
                if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
@@ -1052,6 +1035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
                                fbc->common.scope ? "::" : "",
                                ZSTR_VAL(fbc->common.function_name));
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                }
@@ -1083,9 +1067,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
 
                if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
                  && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
-                       if (1) {
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                       }
+                       UNDEF_RESULT();
                        goto fcall_end;
                }
 
@@ -1123,6 +1105,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
                call->prev_execute_data = execute_data;
 
                if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -1148,9 +1131,6 @@ fcall_end:
        zend_vm_stack_free_call_frame(call);
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (1) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION();
        }
 
@@ -1750,7 +1730,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_hel
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       uint32_t throw_op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
+       const zend_op *throw_op = EG(opline_before_exception);
+       uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
        int i, current_try_catch_offset = -1;
 
        {
@@ -1779,6 +1760,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
 
        cleanup_unfinished_calls(execute_data, throw_op_num);
 
+       if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
+               switch (throw_op->opcode) {
+                       case ZEND_ADD_ARRAY_ELEMENT:
+                       case ZEND_ROPE_ADD:
+                               break; /* exception while building structures, live range handling will free those */
+
+                       case ZEND_FETCH_CLASS:
+                       case ZEND_DECLARE_CLASS:
+                       case ZEND_DECLARE_INHERITED_CLASS:
+                       case ZEND_DECLARE_ANON_CLASS:
+                       case ZEND_DECLARE_ANON_INHERITED_CLASS:
+                               break; /* return value is zend_class_entry pointer */
+
+                       default:
+                               zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
+               }
+       }
+
        ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
 }
 
@@ -2048,9 +2047,6 @@ call_trampoline_end:
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL);
-               if (RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
-               }
                HANDLE_EXCEPTION_LEAVE();
        }
 
@@ -3193,6 +3189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -3201,6 +3198,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
                ce = zend_fetch_class(NULL, opline->op1.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -3209,13 +3207,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
 
        result = EX_VAR(opline->result.var);
        if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+               ZVAL_UNDEF(result);
                HANDLE_EXCEPTION();
        }
 
        constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
        if (constructor == NULL) {
                if (UNEXPECTED(EG(exception))) {
-                       zval_ptr_dtor(result);
                        HANDLE_EXCEPTION();
                }
 
@@ -3253,7 +3251,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
        USE_OPLINE
 
        zval *obj;
-       zend_object *clone_obj;
        zend_class_entry *ce, *scope;
        zend_function *clone;
        zend_object_clone_obj_t clone_call;
@@ -3263,6 +3260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
 
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -3275,6 +3273,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
                                break;
                                }
                        }
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
                                if (UNEXPECTED(EG(exception) != NULL)) {
@@ -3293,6 +3292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
        if (UNEXPECTED(clone_call == NULL)) {
                zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -3304,6 +3304,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
                        if (UNEXPECTED(ce != scope)) {
                                zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
@@ -3313,17 +3314,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
                        if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
                                zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
        }
 
-       clone_obj = clone_call(obj);
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
-       } else {
-               OBJ_RELEASE(clone_obj);
-       }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -3424,6 +3421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
                }
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
                if (RETURN_VALUE_USED(opline)) {
@@ -3464,6 +3462,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
@@ -3545,6 +3544,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -3554,6 +3554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
 
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -3563,6 +3564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                OBJ_RELEASE(&iter->std);
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -3570,10 +3572,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
                        ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -3698,6 +3703,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -3711,6 +3717,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
                                        } else {
 
                                        }
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -3724,6 +3731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
                                } else {
 
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -3736,10 +3744,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
                        } else {
 
                        }
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -3790,6 +3801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
 
        zval *value;
        zval *ref = NULL;
+       int ret;
 
        SAVE_OPLINE();
        value = EX_CONSTANT(opline->op1);
@@ -3800,7 +3812,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
                }
                value = Z_REFVAL_P(value);
        }
-       if (i_zend_is_true(value)) {
+
+       ret = i_zend_is_true(value);
+
+       if (UNEXPECTED(EG(exception))) {
+
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
+               HANDLE_EXCEPTION();
+       }
+
+       if (ret) {
                zval *result = EX_VAR(opline->result.var);
 
                ZVAL_COPY_VALUE(result, value);
@@ -3817,10 +3838,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
                                Z_ADDREF_P(result);
                        }
                }
-               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_CONTINUE();
        }
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -3918,6 +3940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
        if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
                zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -3941,6 +3964,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
                                        zval_ptr_dtor(val);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
@@ -3948,6 +3972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
                                zval_ptr_dtor(val);
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -3962,6 +3987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                                if (!EG(exception)) {
                                        zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
 
@@ -3970,6 +3996,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                                iter->funcs->rewind(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -3978,6 +4005,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                }
        } else {
                zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -4275,6 +4303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -4845,6 +4874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -4857,6 +4887,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -4870,6 +4901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -4882,6 +4914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -4895,6 +4928,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CONST == IS_CONST && retval) {
@@ -5013,6 +5047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -5027,6 +5062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = EX_CONSTANT(opline->op1);
@@ -5051,6 +5087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -5123,6 +5160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -5198,12 +5236,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -5744,6 +5784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -5753,6 +5794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
                                ce = zend_fetch_class(NULL, opline->op1.num);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        } else {
@@ -5767,12 +5809,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
                        scope = EX(func)->op_array.scope;
                        if (!zend_verify_const_access(c, scope)) {
                                zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        value = &c->value;
                        if (Z_CONSTANT_P(value)) {
                                zval_update_constant_ex(value, ce);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -5783,6 +5827,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
                        }
                } else {
                        zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } while (0);
@@ -6013,6 +6058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -6026,6 +6072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -6212,6 +6259,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -6287,6 +6335,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -6506,6 +6555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -6698,6 +6748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -6710,6 +6761,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -6723,6 +6775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -6735,6 +6788,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -6748,6 +6802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CONST == IS_CONST && retval) {
@@ -6890,6 +6945,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -6903,6 +6959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -6954,6 +7011,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -7130,9 +7188,11 @@ fetch_this:
                                        break;
                                case BP_VAR_RW:
                                case BP_VAR_W:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot re-assign $this");
                                        break;
                                case BP_VAR_UNSET:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot unset $this");
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
@@ -7270,6 +7330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -7282,6 +7343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -7295,6 +7357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -7307,6 +7370,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -7320,6 +7384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CONST == IS_CONST && retval) {
@@ -7388,6 +7453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -7402,6 +7468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = EX_CONSTANT(opline->op1);
@@ -7612,12 +7679,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (IS_CONST == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7870,6 +7931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
                        SAVE_OPLINE();
                        result = !i_zend_is_true(value);
                        if (UNEXPECTED(EG(exception))) {
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -7941,6 +8003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -7954,6 +8017,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -8035,6 +8099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -8320,6 +8385,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -8921,6 +8987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -8935,6 +9002,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = EX_CONSTANT(opline->op1);
@@ -8959,6 +9027,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -9031,6 +9100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -9106,12 +9176,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -9956,6 +10028,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -9999,6 +10072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -10332,6 +10406,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -10897,6 +10972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -10911,6 +10987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_
                        zend_throw_error(NULL, "Cannot use [] for reading");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = EX_CONSTANT(opline->op1);
@@ -10935,6 +11012,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -11008,6 +11086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -11084,12 +11163,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(free_op2);
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -11881,6 +11962,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -12854,6 +12936,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -12863,6 +12946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
                                        zval_ptr_dtor_nogc(free_op1);
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -12872,6 +12956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                OBJ_RELEASE(&iter->std);
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -12880,10 +12965,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
                        zval_ptr_dtor_nogc(free_op1);
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -13008,6 +13096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -13021,6 +13110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
                                        } else {
                                                zval_ptr_dtor_nogc(free_op1);
                                        }
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -13034,6 +13124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
                                } else {
                                        zval_ptr_dtor_nogc(free_op1);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -13046,10 +13137,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
                        } else {
                                zval_ptr_dtor_nogc(free_op1);
                        }
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -13081,6 +13175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
        zend_free_op free_op1;
        zval *value;
        zval *ref = NULL;
+       int ret;
 
        SAVE_OPLINE();
        value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -13091,7 +13186,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
                }
                value = Z_REFVAL_P(value);
        }
-       if (i_zend_is_true(value)) {
+
+       ret = i_zend_is_true(value);
+
+       if (UNEXPECTED(EG(exception))) {
+               zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
+               HANDLE_EXCEPTION();
+       }
+
+       if (ret) {
                zval *result = EX_VAR(opline->result.var);
 
                ZVAL_COPY_VALUE(result, value);
@@ -13108,11 +13212,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
                                Z_ADDREF_P(result);
                        }
                }
-               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_CONTINUE();
        }
 
        zval_ptr_dtor_nogc(free_op1);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -13211,6 +13316,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
        if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
                zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
                zval_ptr_dtor_nogc(free_op1);
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -13234,6 +13340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
                                        zval_ptr_dtor(val);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
@@ -13241,6 +13348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
                                zval_ptr_dtor(val);
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -13256,6 +13364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                                if (!EG(exception)) {
                                        zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
 
@@ -13264,6 +13373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                                iter->funcs->rewind(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -13272,6 +13382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                }
        } else {
                zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -13373,6 +13484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -13387,6 +13499,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -13411,6 +13524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN
        if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -13486,12 +13600,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO
                if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -13572,6 +13688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CONST_HANDLE
                                for (i = 0; i <= opline->extended_value; i++) {
                                        zend_string_release(rope[i]);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -13729,6 +13846,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -13900,6 +14018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -14071,6 +14190,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -14208,6 +14328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UN
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -14222,6 +14343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UN
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -14277,12 +14399,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (IS_TMP_VAR == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -14425,6 +14541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -14598,6 +14715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -14612,6 +14730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -14636,6 +14755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE
        if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -14711,12 +14831,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV
                if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -14797,6 +14919,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(Z
                                for (i = 0; i <= opline->extended_value; i++) {
                                        zend_string_release(rope[i]);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -14954,6 +15077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -15122,6 +15246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = NULL;
@@ -15136,6 +15261,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM
                        zend_throw_error(NULL, "Cannot use [] for reading");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -15160,6 +15286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA
        if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -15236,12 +15363,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM
                if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(free_op2);
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -15322,6 +15451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDL
                                for (i = 0; i <= opline->extended_value; i++) {
                                        zend_string_release(rope[i]);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -16206,6 +16336,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -16214,6 +16345,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
                ce = zend_fetch_class(NULL, opline->op1.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -16222,13 +16354,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
 
        result = EX_VAR(opline->result.var);
        if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+               ZVAL_UNDEF(result);
                HANDLE_EXCEPTION();
        }
 
        constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
        if (constructor == NULL) {
                if (UNEXPECTED(EG(exception))) {
-                       zval_ptr_dtor(result);
                        HANDLE_EXCEPTION();
                }
 
@@ -16417,6 +16549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -16426,6 +16559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
                                        zval_ptr_dtor_nogc(free_op1);
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -16435,6 +16569,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                OBJ_RELEASE(&iter->std);
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -16443,10 +16578,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
                        zval_ptr_dtor_nogc(free_op1);
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -16573,6 +16711,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -16586,6 +16725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
                                        } else {
                                                zval_ptr_dtor_nogc(free_op1);
                                        }
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -16599,6 +16739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
                                } else {
                                        zval_ptr_dtor_nogc(free_op1);
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -16611,10 +16752,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
                        } else {
                                zval_ptr_dtor_nogc(free_op1);
                        }
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -16748,11 +16892,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
                                 * In case that ever happens we need an additional flag. */
                                iter->funcs->move_forward(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                                if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
                                        /* reached end of iteration */
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                        goto fe_fetch_r_exit;
@@ -16760,6 +16906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
                        }
                        value = iter->funcs->get_current_data(iter);
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                        if (!value) {
@@ -16770,6 +16917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
                                if (iter->funcs->get_current_key) {
                                        iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                } else {
@@ -16781,6 +16929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                if (UNEXPECTED(EG(exception))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 fe_fetch_r_exit:
@@ -16936,11 +17085,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
                                 * In case that ever happens we need an additional flag. */
                                iter->funcs->move_forward(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                                if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
                                        /* reached end of iteration */
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                        goto fe_fetch_w_exit;
@@ -16948,6 +17099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
                        }
                        value = iter->funcs->get_current_data(iter);
                        if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
                        if (!value) {
@@ -16958,6 +17110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
                                if (iter->funcs->get_current_key) {
                                        iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
                                        if (UNEXPECTED(EG(exception) != NULL)) {
+                                               UNDEF_RESULT();
                                                HANDLE_EXCEPTION();
                                        }
                                } else {
@@ -16969,6 +17122,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                if (UNEXPECTED(EG(exception))) {
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 fe_fetch_w_exit:
@@ -17006,6 +17160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
        zend_free_op free_op1;
        zval *value;
        zval *ref = NULL;
+       int ret;
 
        SAVE_OPLINE();
        value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -17016,7 +17171,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
                }
                value = Z_REFVAL_P(value);
        }
-       if (i_zend_is_true(value)) {
+
+       ret = i_zend_is_true(value);
+
+       if (UNEXPECTED(EG(exception))) {
+               zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
+               HANDLE_EXCEPTION();
+       }
+
+       if (ret) {
                zval *result = EX_VAR(opline->result.var);
 
                ZVAL_COPY_VALUE(result, value);
@@ -17033,11 +17197,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
                                Z_ADDREF_P(result);
                        }
                }
-               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_CONTINUE();
        }
 
        zval_ptr_dtor_nogc(free_op1);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17136,6 +17301,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
        if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
                zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
                zval_ptr_dtor_nogc(free_op1);
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -17161,6 +17327,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
                                        zval_ptr_dtor(val);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
@@ -17168,6 +17335,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
                                zval_ptr_dtor(val);
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -17183,6 +17351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                                if (!EG(exception)) {
                                        zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
 
@@ -17191,6 +17360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                                iter->funcs->rewind(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -17199,6 +17369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                }
        } else {
                zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -17379,6 +17550,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -17495,6 +17667,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -17799,6 +17972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -17877,6 +18051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -17985,6 +18160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CO
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -17999,6 +18175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CO
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -18041,6 +18218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -18113,6 +18291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -18139,6 +18318,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -18167,12 +18347,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO
                if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -18199,6 +18381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -18226,6 +18409,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -18359,7 +18543,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -18383,6 +18567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -18516,7 +18701,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -18540,6 +18725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -18673,7 +18859,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -18697,6 +18883,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -18830,7 +19017,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -18892,7 +19079,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -18901,6 +19088,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -18983,7 +19171,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -18993,6 +19181,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -19075,7 +19264,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -19085,6 +19274,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -19167,7 +19357,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -19176,6 +19366,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -19441,6 +19632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -19450,6 +19642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
                                ce = zend_fetch_class(NULL, opline->op1.num);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        } else {
@@ -19464,12 +19657,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
                        scope = EX(func)->op_array.scope;
                        if (!zend_verify_const_access(c, scope)) {
                                zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        value = &c->value;
                        if (Z_CONSTANT_P(value)) {
                                zval_update_constant_ex(value, ce);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -19480,6 +19675,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
                        }
                } else {
                        zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } while (0);
@@ -19763,6 +19959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -19991,6 +20188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -20227,6 +20425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE
                zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
                if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
 
        } else if (IS_VAR == IS_VAR &&
@@ -20235,6 +20434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE
                zend_error(E_NOTICE, "Only variables should be assigned by reference");
                if (UNEXPECTED(EG(exception) != NULL)) {
                        if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -20275,6 +20475,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -20469,6 +20670,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -20618,6 +20820,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UN
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -20632,6 +20835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UN
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -20693,7 +20897,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -20702,6 +20906,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -20784,7 +20989,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -20794,6 +20999,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -20876,7 +21082,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -20886,6 +21092,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -20968,7 +21175,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -20977,6 +21184,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -21208,12 +21416,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (IS_VAR == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -21371,6 +21573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -21576,6 +21779,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -21692,6 +21896,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -21996,6 +22201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -22074,6 +22280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -22182,6 +22389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -22196,6 +22404,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -22238,6 +22447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -22310,6 +22520,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -22336,6 +22547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -22364,12 +22576,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV
                if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
                        if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -22396,6 +22610,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -22423,6 +22638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -22556,7 +22772,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -22580,6 +22796,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -22713,7 +22930,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -22737,6 +22954,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -22870,7 +23088,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -22894,6 +23112,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -23027,7 +23246,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -23089,7 +23308,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -23098,6 +23317,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -23180,7 +23400,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -23190,6 +23410,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -23272,7 +23493,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -23282,6 +23503,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -23364,7 +23586,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -23373,6 +23595,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -23479,6 +23702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER
                zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
 
        } else if (IS_CV == IS_VAR &&
@@ -23487,6 +23711,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER
                zend_error(E_NOTICE, "Only variables should be assigned by reference");
                if (UNEXPECTED(EG(exception) != NULL)) {
 
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -23936,6 +24161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
                zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -24077,6 +24303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -24193,6 +24420,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -24499,6 +24727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -24578,6 +24807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -24687,6 +24917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TM
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -24701,6 +24932,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TM
                        zend_throw_error(NULL, "Cannot use [] for reading");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -24743,6 +24975,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -24816,6 +25049,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -24842,6 +25076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -24870,12 +25105,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM
                if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(free_op2);
                        if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -24902,6 +25139,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA
        if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -24929,6 +25167,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -25062,7 +25301,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -25086,6 +25325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -25219,7 +25459,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -25243,6 +25483,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -25376,7 +25617,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -25400,6 +25641,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -25533,7 +25775,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -25595,7 +25837,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -25604,6 +25846,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -25686,7 +25929,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -25696,6 +25939,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -25778,7 +26022,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -25788,6 +26032,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -25870,7 +26115,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -25879,6 +26124,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
                                if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -26337,6 +26583,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -26345,6 +26592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
                ce = zend_fetch_class(NULL, opline->op1.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -26353,13 +26601,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
 
        result = EX_VAR(opline->result.var);
        if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+               ZVAL_UNDEF(result);
                HANDLE_EXCEPTION();
        }
 
        constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
        if (constructor == NULL) {
                if (UNEXPECTED(EG(exception))) {
-                       zval_ptr_dtor(result);
                        HANDLE_EXCEPTION();
                }
 
@@ -26397,7 +26645,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
        USE_OPLINE
 
        zval *obj;
-       zend_object *clone_obj;
        zend_class_entry *ce, *scope;
        zend_function *clone;
        zend_object_clone_obj_t clone_call;
@@ -26407,6 +26654,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
 
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -26419,6 +26667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
                                break;
                                }
                        }
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
                                if (UNEXPECTED(EG(exception) != NULL)) {
@@ -26437,6 +26686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
        if (UNEXPECTED(clone_call == NULL)) {
                zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -26448,6 +26698,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
                        if (UNEXPECTED(ce != scope)) {
                                zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
@@ -26457,17 +26708,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
                        if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
                                zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
        }
 
-       clone_obj = clone_call(obj);
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
-       } else {
-               OBJ_RELEASE(clone_obj);
-       }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -26517,6 +26764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -26658,6 +26906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -26736,6 +26985,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -26809,6 +27059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -26881,6 +27132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -26907,6 +27159,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -26932,6 +27185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -27007,12 +27261,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -27039,6 +27295,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -27066,6 +27323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -27199,7 +27457,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -27223,6 +27481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -27356,7 +27615,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -27380,6 +27639,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -27513,7 +27773,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -27537,6 +27797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -27670,7 +27931,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -28020,6 +28281,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CON
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                } else {
                        zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } else {
@@ -28062,6 +28324,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -28071,6 +28334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
                                ce = zend_fetch_class(NULL, opline->op1.num);
                                if (UNEXPECTED(ce == NULL)) {
                                        ZEND_ASSERT(EG(exception));
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        } else {
@@ -28085,12 +28349,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
                        scope = EX(func)->op_array.scope;
                        if (!zend_verify_const_access(c, scope)) {
                                zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        value = &c->value;
                        if (Z_CONSTANT_P(value)) {
                                zval_update_constant_ex(value, ce);
                                if (UNEXPECTED(EG(exception) != NULL)) {
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -28101,6 +28367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
                        }
                } else {
                        zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
        } while (0);
@@ -28201,6 +28468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -28244,6 +28512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -28379,6 +28648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -28514,6 +28784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -28838,12 +29109,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (IS_UNUSED == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -28891,6 +29156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -29028,6 +29294,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_
        } else {
                SAVE_OPLINE();
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 }
@@ -29059,6 +29326,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -29200,6 +29468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -29278,6 +29547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -29351,6 +29621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -29423,6 +29694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -29449,6 +29721,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -29474,6 +29747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -29549,12 +29823,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -29581,6 +29857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -29608,6 +29885,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -29741,7 +30019,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -29765,6 +30043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -29898,7 +30177,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -29922,6 +30201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -30055,7 +30335,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -30079,6 +30359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -30212,7 +30493,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -30620,6 +30901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -30663,6 +30945,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -30803,6 +31086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -30944,6 +31228,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -31023,6 +31308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -31097,6 +31383,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -31170,6 +31457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -31196,6 +31484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -31221,6 +31510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -31297,12 +31587,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(free_op2);
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -31329,6 +31621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -31356,6 +31649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -31489,7 +31783,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -31513,6 +31807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -31646,7 +31941,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -31670,6 +31965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -31803,7 +32099,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -31827,6 +32123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -31960,7 +32257,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -32370,6 +32667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -33283,7 +33581,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
        USE_OPLINE
 
        zval *obj;
-       zend_object *clone_obj;
        zend_class_entry *ce, *scope;
        zend_function *clone;
        zend_object_clone_obj_t clone_call;
@@ -33293,6 +33590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
 
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -33305,6 +33603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
                                break;
                                }
                        }
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
                                if (UNEXPECTED(EG(exception) != NULL)) {
@@ -33323,6 +33622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
        if (UNEXPECTED(clone_call == NULL)) {
                zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -33334,6 +33634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
                        if (UNEXPECTED(ce != scope)) {
                                zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
@@ -33343,17 +33644,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
                        if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
                                zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
        }
 
-       clone_obj = clone_call(obj);
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
-       } else {
-               OBJ_RELEASE(clone_obj);
-       }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -33454,6 +33751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
                }
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
                if (RETURN_VALUE_USED(opline)) {
@@ -33494,6 +33792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
@@ -33575,6 +33874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -33584,6 +33884,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
 
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -33593,6 +33894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                OBJ_RELEASE(&iter->std);
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -33600,10 +33902,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
                        ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -33728,6 +34033,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
                                zend_throw_exception_internal(NULL);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -33741,6 +34047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
                                        } else {
 
                                        }
+                                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -33754,6 +34061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
                                } else {
 
                                }
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        iter->index = -1; /* will be set to 0 before using next handler */
@@ -33766,10 +34074,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
                        } else {
 
                        }
-                       if (is_empty) {
-                               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+                       if (UNEXPECTED(EG(exception))) {
+                               HANDLE_EXCEPTION();
+                       } else if (is_empty) {
+                               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+                               ZEND_VM_CONTINUE();
                        } else {
-                               ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+                               ZEND_VM_NEXT_OPCODE();
                        }
                }
        } else {
@@ -33820,6 +34131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
 
        zval *value;
        zval *ref = NULL;
+       int ret;
 
        SAVE_OPLINE();
        value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
@@ -33830,7 +34142,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
                }
                value = Z_REFVAL_P(value);
        }
-       if (i_zend_is_true(value)) {
+
+       ret = i_zend_is_true(value);
+
+       if (UNEXPECTED(EG(exception))) {
+
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
+               HANDLE_EXCEPTION();
+       }
+
+       if (ret) {
                zval *result = EX_VAR(opline->result.var);
 
                ZVAL_COPY_VALUE(result, value);
@@ -33847,10 +34168,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
                                Z_ADDREF_P(result);
                        }
                }
-               ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
+               ZEND_VM_CONTINUE();
        }
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -33948,6 +34270,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
        if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
                zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -33971,6 +34294,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
                                        zval_ptr_dtor(val);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
@@ -33978,6 +34302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
                                zval_ptr_dtor(val);
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -33992,6 +34317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                                if (!EG(exception)) {
                                        zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        }
 
@@ -34000,6 +34326,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                                iter->funcs->rewind(iter);
                                if (UNEXPECTED(EG(exception) != NULL)) {
                                        OBJ_RELEASE(&iter->std);
+                                       UNDEF_RESULT();
                                        HANDLE_EXCEPTION();
                                }
                        }
@@ -34008,6 +34335,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                }
        } else {
                zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -34340,6 +34668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -34894,6 +35223,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -35010,6 +35340,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -35314,6 +35645,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -35392,6 +35724,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -35483,6 +35816,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -35495,6 +35829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -35508,6 +35843,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -35520,6 +35856,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -35533,6 +35870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CV == IS_CONST && retval) {
@@ -35687,6 +36025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CON
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
@@ -35701,6 +36040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CON
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
@@ -35743,6 +36083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -35815,6 +36156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -35841,6 +36183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -35866,6 +36209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -35941,12 +36285,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON
                if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -35973,6 +36319,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -36013,6 +36360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -36146,7 +36494,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -36170,6 +36518,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -36303,7 +36652,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -36327,6 +36676,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -36460,7 +36810,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -36484,6 +36834,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -36617,7 +36968,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -36679,7 +37030,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -36688,6 +37039,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -36770,7 +37122,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -36780,6 +37132,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -36862,7 +37215,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -36872,6 +37225,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -36954,7 +37308,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -36963,6 +37317,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = EX_CONSTANT(opline->op2);
@@ -37651,6 +38006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -37664,6 +38020,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -37850,6 +38207,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -37909,6 +38267,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -37941,6 +38300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -38355,6 +38715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -38547,6 +38908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -38559,6 +38921,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -38572,6 +38935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -38584,6 +38948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -38597,6 +38962,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CV == IS_CONST && retval) {
@@ -38727,6 +39093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER
                zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
 
                if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
 
        } else if (IS_VAR == IS_VAR &&
@@ -38735,6 +39102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER
                zend_error(E_NOTICE, "Only variables should be assigned by reference");
                if (UNEXPECTED(EG(exception) != NULL)) {
                        if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -38850,6 +39218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -38863,6 +39232,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -38930,6 +39300,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -38962,6 +39333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -39155,6 +39527,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -39307,9 +39680,11 @@ fetch_this:
                                        break;
                                case BP_VAR_RW:
                                case BP_VAR_W:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot re-assign $this");
                                        break;
                                case BP_VAR_UNSET:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot unset $this");
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
@@ -39447,6 +39822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -39459,6 +39835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -39472,6 +39849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -39484,6 +39862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -39497,6 +39876,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if (IS_CV == IS_CONST && retval) {
@@ -39601,6 +39981,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
@@ -39615,6 +39996,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
@@ -39676,7 +40058,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -39685,6 +40067,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -39767,7 +40150,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -39777,6 +40160,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -39859,7 +40243,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -39869,6 +40253,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -39951,7 +40336,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -39960,6 +40345,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = NULL;
@@ -40036,12 +40422,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
                        retval_ptr = retval_ref;
                }
                zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (IS_CV == IS_CONST) {
-                               zval_ptr_dtor_nogc(retval_ptr);
-                       }
-               }
 #endif
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -40294,6 +40674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
                        SAVE_OPLINE();
                        result = !i_zend_is_true(value);
                        if (UNEXPECTED(EG(exception))) {
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -40365,6 +40746,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -40378,6 +40760,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -40445,6 +40828,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
 
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -40477,6 +40861,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -40803,6 +41188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -41357,6 +41743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -41473,6 +41860,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -41777,6 +42165,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -41855,6 +42244,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -42013,6 +42403,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
@@ -42027,6 +42418,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_
                        zend_throw_error(NULL, "Cannot use [] for reading");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
@@ -42069,6 +42461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -42141,6 +42534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -42167,6 +42561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -42192,6 +42587,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -42267,12 +42663,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_
                if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
 
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -42299,6 +42697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -42339,6 +42738,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -42472,7 +42872,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -42496,6 +42896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -42629,7 +43030,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -42653,6 +43054,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
                zend_throw_error(NULL, "Using $this when not in object context");
 
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -42786,7 +43188,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -42810,6 +43212,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
                zend_throw_error(NULL, "Using $this when not in object context");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -42943,7 +43346,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -43005,7 +43408,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -43014,6 +43417,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -43096,7 +43500,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -43106,6 +43510,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -43188,7 +43593,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -43198,6 +43603,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -43280,7 +43686,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -43289,6 +43695,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -43395,6 +43802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(
                zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
 
        } else if (IS_CV == IS_VAR &&
@@ -43403,6 +43811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(
                zend_error(E_NOTICE, "Only variables should be assigned by reference");
                if (UNEXPECTED(EG(exception) != NULL)) {
 
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
 
@@ -44090,6 +44499,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -44133,6 +44543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
                zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
 
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -44466,6 +44877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEN
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -44984,6 +45396,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -45100,6 +45513,7 @@ assign_dim_op_convert_to_array:
                                        zend_check_string_offset(dim, BP_VAR_RW);
                                        zend_wrong_string_offset();
                                }
+                               UNDEF_RESULT();
                        } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
                                goto assign_dim_op_convert_to_array;
                        } else {
@@ -45406,6 +45820,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -45485,6 +45900,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -45644,6 +46060,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP
             zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
         }
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
@@ -45658,6 +46075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP
                        zend_throw_error(NULL, "Cannot use [] for reading");
                        zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                container = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
@@ -45700,6 +46118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -45773,6 +46192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -45799,6 +46219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
@@ -45824,6 +46245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -45900,12 +46322,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP
                if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
                        zend_throw_error(NULL, "Cannot use temporary expression in write context");
                        zval_ptr_dtor_nogc(free_op2);
 
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        HANDLE_EXCEPTION();
                }
                zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
@@ -45932,6 +46356,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -45972,6 +46397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -46105,7 +46531,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -46129,6 +46555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -46262,7 +46689,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -46286,6 +46713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -46419,7 +46847,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
        zval_ptr_dtor_nogc(free_op_data);
@@ -46443,6 +46871,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        }
 
@@ -46576,7 +47005,7 @@ fast_assign_obj:
 
        Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
 
-       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), value);
        }
 
@@ -46638,7 +47067,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -46647,6 +47076,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -46729,7 +47159,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -46739,6 +47169,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -46821,7 +47252,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -46831,6 +47262,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
                                zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -46913,7 +47345,7 @@ try_assign_dim_array:
 
                        zend_assign_to_object_dim(object_ptr, dim, value);
 
-                       if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
+                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), value);
                        }
 
@@ -46922,6 +47354,7 @@ try_assign_dim_array:
                                zend_throw_error(NULL, "[] operator not supported for strings");
 
 
+                               UNDEF_RESULT();
                                HANDLE_EXCEPTION();
                        } else {
                                dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -47616,6 +48049,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -48003,7 +48437,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
        USE_OPLINE
        zend_free_op free_op1;
        zval *obj;
-       zend_object *clone_obj;
        zend_class_entry *ce, *scope;
        zend_function *clone;
        zend_object_clone_obj_t clone_call;
@@ -48013,6 +48446,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
 
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -48025,6 +48459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
                                break;
                                }
                        }
+                       ZVAL_UNDEF(EX_VAR(opline->result.var));
                        if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
                                if (UNEXPECTED(EG(exception) != NULL)) {
@@ -48043,6 +48478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
        if (UNEXPECTED(clone_call == NULL)) {
                zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
                zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -48054,6 +48490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
                        if (UNEXPECTED(ce != scope)) {
                                zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
@@ -48063,17 +48500,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
                        if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
                                zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(ce->name), scope ? ZSTR_VAL(scope->name) : "");
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
        }
 
-       clone_obj = clone_call(obj);
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
-       } else {
-               OBJ_RELEASE(clone_obj);
-       }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
 
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -48095,6 +48528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
                }
+               UNDEF_RESULT();
                HANDLE_EXCEPTION();
        } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
                if (RETURN_VALUE_USED(opline)) {
@@ -48135,6 +48569,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_throw_exception_internal(NULL);
+                       UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
@@ -48377,6 +48812,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -48911,6 +49347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -48923,6 +49360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -48936,6 +49374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -48948,6 +49387,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -48961,6 +49401,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
                zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
@@ -49082,6 +49523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -49500,6 +49942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -49513,6 +49956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -49700,6 +50144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -49759,6 +50204,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -49860,6 +50306,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -49872,6 +50319,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -49885,6 +50333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -49897,6 +50346,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -49910,6 +50360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
                zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
@@ -50054,6 +50505,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -50067,6 +50519,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -50135,6 +50588,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -50208,9 +50662,11 @@ fetch_this:
                                        break;
                                case BP_VAR_RW:
                                case BP_VAR_W:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot re-assign $this");
                                        break;
                                case BP_VAR_UNSET:
+                                       ZVAL_UNDEF(result);
                                        zend_throw_error(NULL, "Cannot unset $this");
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
@@ -50348,6 +50804,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -50360,6 +50817,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -50373,6 +50831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                                        zend_string_release(name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -50385,6 +50844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
                                zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
 
@@ -50398,6 +50858,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
                        zend_string_release(name);
                }
                zval_ptr_dtor_nogc(free_op1);
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
@@ -50576,6 +51037,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
                        SAVE_OPLINE();
                        result = !i_zend_is_true(value);
                        if (UNEXPECTED(EG(exception))) {
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                }
@@ -50648,6 +51110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
@@ -50661,6 +51124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                        zend_string_release(Z_STR(tmp));
                                }
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -50729,6 +51193,7 @@ try_instanceof:
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
                                zval_ptr_dtor_nogc(free_op1);
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -50911,6 +51376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEN
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -51477,6 +51943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -51954,6 +52421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -52195,6 +52663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER
                        if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
                                SAVE_OPLINE();
                                zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                                HANDLE_EXCEPTION();
                        } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
                                /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
@@ -52761,6 +53230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
 
@@ -53240,6 +53710,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+               ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }