diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2016-12-07 00:41:07 +0300 | 
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2016-12-07 00:41:07 +0300 | 
| commit | e8109e09aaca9617806f41ae4d5b92460e077769 (patch) | |
| tree | 56b10cff677d0b95a671101c18e4492ac17fb907 | |
| parent | 6c614cb14cb8ee52106e5bbb1d680073d7b6de11 (diff) | |
| download | php-git-e8109e09aaca9617806f41ae4d5b92460e077769.tar.gz | |
Fixed memory leaks caused by exceptions thrown from destructors.
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | Zend/tests/foreach_empty_loop_leak.phpt | 23 | ||||
| -rw-r--r-- | Zend/tests/temporary_cleaning_013.phpt | 311 | ||||
| -rw-r--r-- | Zend/tests/temporary_cleaning_014.phpt | 13 | ||||
| -rw-r--r-- | Zend/zend_execute.c | 16 | ||||
| -rw-r--r-- | Zend/zend_operators.c | 59 | ||||
| -rw-r--r-- | Zend/zend_vm_def.h | 175 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 873 | 
8 files changed, 1218 insertions, 254 deletions
| @@ -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 index 0000000000..70b391181b --- /dev/null +++ b/Zend/tests/foreach_empty_loop_leak.phpt @@ -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 index 0000000000..34e4080f56 --- /dev/null +++ b/Zend/tests/temporary_cleaning_013.phpt @@ -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 index 0000000000..a64f5a1d95 --- /dev/null +++ b/Zend/tests/temporary_cleaning_014.phpt @@ -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 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a2df1ef048..4c107ff263 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 2d6df66a68..9f62db9aaa 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -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; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6e2f31a442..da819894ac 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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();  	}  } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f1e9e6fd84..7727abd9ee 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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();  	} | 
