com php-src: Merge branch 'PHP-7.1': Zend/zend_execute.c Zend/zend_vm_def.h Zend/zend_vm_execute.h

[email protected] (Nikita Popov)
Newsgroups php.cvs
Message-ID <[email protected]>
Commit:    3895aa2f77511520cd532e5775796182f88b75ad
Author:    Nikita Popov <[email protected]>         Sun, 9 Apr 2017 15:35:56 +0200
Parents:   430eea84b84a8c9d733a38cafaa32d494cadf13b 515e1e0ceabb56c55775719e304bcb9c9731ca60
Branches:  master

Link:       http://git.php.net/?p=php-src.git;a=commitdiff;h=3895aa2f77511520cd532e5775796182f88b75ad

Log:
Merge branch 'PHP-7.1'

Changed paths:
  MM  Zend/zend_execute.c
  MM  Zend/zend_vm_def.h
  MM  Zend/zend_vm_execute.h
diff_3895aa2f77511520cd532e5775796182f88b75ad.txt (text/plain, 39.5 KB)
diff --cc Zend/zend_execute.c
index 4511859,6ffe4f4..daaefdf
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@@ -1919,91 -2008,6 +1919,95 @@@ use_read_property
  	}
  }
  
- static zend_always_inline zval* zend_fetch_static_property_address(zend_execute_data *execute_data, zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type)
++static zend_always_inline zval* zend_fetch_static_property_address(zend_execute_data *execute_data, zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type, int type)
 +{
 +	zval *retval;
 +	zend_string *name;
 +	zend_class_entry *ce;
 +
 +	if (varname_type == IS_CONST) {
 +		name = Z_STR_P(varname);
 +	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 +		name = Z_STR_P(varname);
 +		zend_string_addref(name);
 +	} else {
 +		if (varname_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 +			zval_undefined_cv(EX(opline)->op1.var, execute_data);
 +		}
 +		name = zval_get_string(varname);
 +	}
 +
 +	if (op2_type == IS_CONST) {
 +		if (varname_type == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(varname))) != NULL)) {
 +			retval = CACHED_PTR(Z_CACHE_SLOT_P(varname) + sizeof(void*));
 +
 +			/* check if static properties were destoyed */
 +			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));
++				if (type != BP_VAR_IS) {
++					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
++				}
 +				return NULL;
 +			}
 +
 +			return retval;
 +		} else {
 +			zval *class_name = EX_CONSTANT(op2);
 +
 +			if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name))) == NULL)) {
 +				ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 +				if (UNEXPECTED(ce == NULL)) {
 +					if (varname_type != IS_CONST) {
 +						zend_string_release(name);
 +					}
 +					return NULL;
 +				}
 +				CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
 +			}
 +		}
 +	} else {
 +		if (op2_type == IS_UNUSED) {
 +			ce = zend_fetch_class(NULL, op2.num);
 +			if (UNEXPECTED(ce == NULL)) {
 +				if (varname_type != IS_CONST) {
 +					zend_string_release(name);
 +				}
 +				return NULL;
 +			}
 +		} else {
 +			ce = Z_CE_P(EX_VAR(op2.var));
 +		}
 +		if (varname_type == IS_CONST &&
 +		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce)) != NULL) {
 +
 +			/* check if static properties were destoyed */
 +			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));
++				if (type != BP_VAR_IS) {
++					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
++				}
 +				return NULL;
 +			}
 +
 +			return retval;
 +		}
 +	}
 +
- 	retval = zend_std_get_static_property(ce, name, 0);
++	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
 +
 +	if (varname_type != IS_CONST) {
 +		zend_string_release(name);
 +	}
 +
 +	if (UNEXPECTED(retval == NULL)) {
 +		return NULL;
 +	}
 +
 +	if (varname_type == IS_CONST) {
 +		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce, retval);
 +	}
 +
 +	return retval;
 +}
 +
  #if ZEND_INTENSIVE_DEBUGGING
  
  #define CHECK_SYMBOL_TABLES()													\
diff --cc Zend/zend_vm_def.h
index 48c8139,9a63378..d80f1e6
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@@ -1542,13 -1674,91 +1542,17 @@@ ZEND_VM_HELPER(zend_fetch_static_prop_h
  	SAVE_OPLINE();
  	varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE);
 - 	if (OP1_TYPE == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (OP2_TYPE == IS_CONST) {
 -		if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					FREE_OP1();
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			ZEND_VM_C_GOTO(fetch_static_prop_return);
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (OP1_TYPE != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				FREE_OP1();
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (OP2_TYPE == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (OP1_TYPE != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				FREE_OP1();
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (OP1_TYPE == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -				
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					FREE_OP1();
 -					HANDLE_EXCEPTION();
 -				}
 -			}
--
 -			ZEND_VM_C_GOTO(fetch_static_prop_return);
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
++	retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE, type);
++	
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
- 		FREE_OP1();
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (OP1_TYPE != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
+ 			FREE_OP1();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (OP1_TYPE == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
  	FREE_OP1();
diff --cc Zend/zend_vm_execute.h
index 75d7bd8,bb4f50a..bc369ae
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@@ -4876,15 -4851,98 +4876,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = EX_CONSTANT(opline->op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_CONST);
 - 	if (IS_CONST == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_CONST == IS_CONST) {
 -		if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_CONST == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CONST == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_CONST, type);
  
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CONST != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CONST == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
 -	}
 -
 -	if (IS_CONST != IS_CONST) {
 -		zend_string_release(name);
  	}
  
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -6671,15 -6715,98 +6675,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = EX_CONSTANT(opline->op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_VAR);
 - 	if (IS_CONST == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_VAR == IS_CONST) {
 -		if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_VAR == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CONST == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_VAR, type);
  
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CONST != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CONST == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
 -	}
 -
 -	if (IS_CONST != IS_CONST) {
 -		zend_string_release(name);
  	}
  
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -7174,15 -7298,98 +7182,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = EX_CONSTANT(opline->op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_UNUSED);
 - 	if (IS_CONST == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_UNUSED == IS_CONST) {
 -		if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_UNUSED == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CONST != IS_CONST) {
 -					zend_string_release(name);
 -				}
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_UNUSED, type);
  
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CONST == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CONST != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CONST == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
 -	if (IS_CONST != IS_CONST) {
 -		zend_string_release(name);
 -	}
 -
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -35598,15 -37957,98 +35610,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_CONST);
 - 	if (IS_CV == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_CONST == IS_CONST) {
 -		if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_CONST == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CV == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_CONST, type);
  
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CV != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CV == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
 -	if (IS_CV != IS_CONST) {
 -		zend_string_release(name);
 -	}
 -
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -38611,15 -41031,98 +38627,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_VAR);
 - 	if (IS_CV == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_VAR == IS_CONST) {
 -		if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_VAR, type);
  
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_VAR == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CV == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CV != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CV == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
 -	if (IS_CV != IS_CONST) {
 -		zend_string_release(name);
 -	}
 -
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -39446,15 -42090,98 +39466,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_UNUSED);
 - 	if (IS_CV == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_UNUSED == IS_CONST) {
 -		if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_UNUSED == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if (IS_CV != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if (IS_CV == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
++	retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_UNUSED, type);
  
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if (IS_CV != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
  
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if (IS_CV == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
 -	}
 -
 -	if (IS_CV != IS_CONST) {
 -		zend_string_release(name);
  	}
  
 -fetch_static_prop_return:
  	if (type == BP_VAR_R || type == BP_VAR_IS) {
  		ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
  	} else {
@@@ -48917,13 -52460,91 +48941,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST);
 - 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_CONST == IS_CONST) {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_CONST == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
++	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST, type);
  
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
- 		zval_ptr_dtor_nogc(free_op1);
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
+ 			zval_ptr_dtor_nogc(free_op1);
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
  	zval_ptr_dtor_nogc(free_op1);
@@@ -49797,13 -53420,91 +49825,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR);
 - 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_VAR == IS_CONST) {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_VAR == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
++	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR, type);
  
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
- 		zval_ptr_dtor_nogc(free_op1);
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
+ 			zval_ptr_dtor_nogc(free_op1);
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
  	zval_ptr_dtor_nogc(free_op1);
@@@ -50216,13 -53919,91 +50248,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
  	SAVE_OPLINE();
  	varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
- 	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED);
 - 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		name = Z_STR_P(varname);
 -	} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
 -		name = Z_STR_P(varname);
 -		zend_string_addref(name);
 -	} else {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
 -			GET_OP1_UNDEF_CV(varname, BP_VAR_R);
 -		}
 -		name = zval_get_string(varname);
 -	}
 -
 -	if (IS_UNUSED == IS_CONST) {
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
 -			retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
 -
 -			goto fetch_static_prop_return;
 -		} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
 -			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));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -			CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
 -		}
 -	} else {
 -		if (IS_UNUSED == IS_UNUSED) {
 -			ce = zend_fetch_class(NULL, opline->op2.num);
 -			if (UNEXPECTED(ce == NULL)) {
 -				ZEND_ASSERT(EG(exception));
 -				if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -					zend_string_release(name);
 -				}
 -				zval_ptr_dtor_nogc(free_op1);
 -				HANDLE_EXCEPTION();
 -			}
 -		} else {
 -			ce = Z_CE_P(EX_VAR(opline->op2.var));
 -		}
 -		if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 -		    (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
 -
 -			/* check if static properties were destoyed */
 -			if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -				if (type == BP_VAR_IS) {
 -					retval = &EG(uninitialized_zval);
 -				} else {
 -					zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -					zval_ptr_dtor_nogc(free_op1);
 -					HANDLE_EXCEPTION();
 -				}
 -			}
++	retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED, type);
  
 -			goto fetch_static_prop_return;
 -		}
 -	}
 -	retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
  	if (UNEXPECTED(retval == NULL)) {
- 		ZEND_ASSERT(EG(exception));
- 		zval_ptr_dtor_nogc(free_op1);
- 		ZVAL_UNDEF(EX_VAR(opline->result.var));
- 		HANDLE_EXCEPTION();
 -		if (type == BP_VAR_IS) {
 -			retval = &EG(uninitialized_zval);
 -		} else {
 -			ZEND_ASSERT(EG(exception));
 -			if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -				zend_string_release(name);
 -			}
++		if (EG(exception)) {
+ 			zval_ptr_dtor_nogc(free_op1);
++			ZVAL_UNDEF(EX_VAR(opline->result.var));
+ 			HANDLE_EXCEPTION();
++		} else {
++			ZEND_ASSERT(type == BP_VAR_IS);
++			retval = &EG(uninitialized_zval);
+ 		}
 -	} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -		CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
  	}
  
  	zval_ptr_dtor_nogc(free_op1);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.