return get_zval_ptr(op_type, op, execute_data, should_free, type);
}
-static void zend_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr TSRMLS_DC)
+static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr TSRMLS_DC)
{
- if (variable_ptr == &EG(error_zval) || value_ptr == &EG(error_zval)) {
- ZVAL_NULL(variable_ptr);
- } else if (EXPECTED(variable_ptr != value_ptr)) {
- zval tmp;
+ if (EXPECTED(variable_ptr != value_ptr)) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(value_ptr);
- ZVAL_COPY(&tmp, value_ptr);
+ Z_ADDREF_P(value_ptr);
zval_ptr_dtor(variable_ptr);
- ZVAL_COPY_VALUE(variable_ptr, &tmp);
+ ZVAL_COPY_VALUE(variable_ptr, value_ptr);
} else if (!Z_ISREF_P(variable_ptr)) {
ZVAL_NEW_REF(variable_ptr, variable_ptr);
}
}
if (OP1_TYPE == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) {
+ UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
(OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) {
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ if ((OP1_TYPE == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
+ (OP2_TYPE == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ }
if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
if (!OP2_FREE) {
}
if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) {
+ UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
(IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) {
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
+ (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ }
if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
if (!(free_op2.var != NULL)) {
}
if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) {
+ UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
(IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) {
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
+ (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ }
if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
if (!0) {
}
if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) {
+ UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
(IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) {
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
+ (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ }
if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
if (!(free_op2.var != NULL)) {
}
if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) {
+ UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
(IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) {
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
+ (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
+ }
if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
if (!0) {