}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr);
-//??? don't increment refcount of overloaded element
- if (IS_VAR != IS_VAR || EXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) == IS_INDIRECT)) {
+ if (Z_ISREF_P(varptr)) {
Z_ADDREF_P(varptr);
+ } else {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr);
+//??? don't increment refcount of overloaded element
+ if (IS_VAR != IS_VAR ||
+ EXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) == IS_INDIRECT)) {
+ Z_ADDREF_P(varptr);
+ }
}
zend_vm_stack_push(varptr TSRMLS_CC);
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
} else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(value_ptr);
}
- if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
+ if (IS_VAR == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_REFERENCE)) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
} else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(value_ptr);
}
- if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
+ if (IS_VAR == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_REFERENCE)) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr);
-//??? don't increment refcount of overloaded element
- if (IS_CV != IS_VAR || EXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) == IS_INDIRECT)) {
+ if (Z_ISREF_P(varptr)) {
Z_ADDREF_P(varptr);
+ } else {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr);
+//??? don't increment refcount of overloaded element
+ if (IS_CV != IS_VAR ||
+ EXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) == IS_INDIRECT)) {
+ Z_ADDREF_P(varptr);
+ }
}
zend_vm_stack_push(varptr TSRMLS_CC);
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
} else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(value_ptr);
}
- if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
+ if (IS_CV == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_REFERENCE)) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
zval *retval_ptr = EX_VAR(opline->result.var);
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
+ zval *retval_ind = retval_ptr;
+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
if (!Z_ISREF_P(retval_ptr)) {
if (Z_REFCOUNTED_P(retval_ptr)) {
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
}
/* We are going to assign the result by reference */
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
zval *retval_ptr = EX_VAR(opline->result.var);
+ zval *retval_ind = retval_ptr;
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval)) {
+ if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZVAL_NEW_REF(retval_ptr, retval_ptr);
}
Z_ADDREF_P(retval_ptr);
+ if (retval_ind != retval_ptr) {
+ ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
+ }
}
}
} else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(value_ptr);
}
- if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
+ if (IS_CV == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_REFERENCE)) {
zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
}