ZVAL_NULL(ret);
//??? ret->var.ptr_ptr = &ret->var.ptr;
-//??? ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+ ret->var_flags = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0 ? IS_VAR_RET_REF : 0;
if (!zend_execute_internal) {
/* saves one function call if zend_execute_internal is not used */
ZVAL_NULL(return_value);
//??? ret->var.ptr_ptr = &ret->var.ptr;
-//??? ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+ return_value->var_flags = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0 ? IS_VAR_RET_REF : 0;
}
if (UNEXPECTED((EG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0)) {
} else {
//??? Z_UNSET_ISREF_P(EX_T(opline->result.var).var.ptr);
//??? Z_SET_REFCOUNT_P(EX_T(opline->result.var).var.ptr, 1);
-//??? EX_T(opline->result.var).var.fcall_returned_reference = 0;
+ EX_VAR(opline->result.var)->var_flags = 0;
//??? EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
}
}
}
if (IS_CONST == IS_VAR && !Z_ISREF_P(retval_ptr)) {
-//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
-//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ (retval_ptr->var_flags & IS_VAR_RET_REF)) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
+ } else {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
ZVAL_NEW_REF(EX(return_value), &tmp);
}
break;
-//??? }
+ }
}
if (EX(return_value)) {
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CONST == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CONST == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CONST == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CONST == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CONST == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
}
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(retval_ptr)) {
-//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
-//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ (retval_ptr->var_flags & IS_VAR_RET_REF)) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
+ } else {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
ZVAL_NEW_REF(EX(return_value), &tmp);
}
break;
-//??? }
+ }
}
if (EX(return_value)) {
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_TMP_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
}
if (IS_VAR == IS_VAR && !Z_ISREF_P(retval_ptr)) {
-//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
-//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ (retval_ptr->var_flags & IS_VAR_RET_REF)) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
+ } else {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
ZVAL_NEW_REF(EX(return_value), &tmp);
}
break;
-//??? }
+ }
}
if (EX(return_value)) {
}
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
-//???
-#if 0
if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
- EX_T(opline->op1.var).var.fcall_returned_reference) &&
- (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
- Z_SET_ISREF_P(varptr);
- if (IS_VAR == IS_CV) {
- Z_ADDREF_P(varptr);
- }
- zend_vm_stack_push(varptr TSRMLS_CC);
-#else
- if (Z_ISREF_P(varptr)) {
- if (IS_VAR == IS_CV) {
- Z_ADDREF_P(varptr);
- }
- zend_vm_stack_push(varptr TSRMLS_CC);
- } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) {
- ZVAL_NEW_REF(varptr, varptr);
- if (IS_VAR == IS_CV) {
- Z_ADDREF_P(varptr);
+ (varptr->var_flags & IS_VAR_RET_REF)) &&
+ (!Z_REFCOUNTED_P(varptr) ||
+ Z_ISREF_P(varptr) ||
+ Z_REFCOUNT_P(varptr) == 1)) {
+
+ if (Z_ISREF_P(varptr)) {
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
+ } else {
+ ZVAL_NEW_REF(varptr, varptr);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
}
zend_vm_stack_push(varptr TSRMLS_CC);
-#endif
} else {
zval val;
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
if (IS_VAR == IS_VAR &&
value_ptr &&
!Z_ISREF_P(value_ptr) &&
- opline->extended_value == ZEND_RETURNS_FUNCTION /*???&&
- !EX_T(opline->op2.var).var.fcall_returned_reference*/) {
+ opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !(value_ptr->var_flags & IS_VAR_RET_REF)) {
if (!(free_op2.var != NULL)) {
PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
if (IS_CV == IS_VAR &&
value_ptr &&
!Z_ISREF_P(value_ptr) &&
- opline->extended_value == ZEND_RETURNS_FUNCTION /*???&&
- !EX_T(opline->op2.var).var.fcall_returned_reference*/) {
+ opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !(value_ptr->var_flags & IS_VAR_RET_REF)) {
if (!0) {
PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_VAR == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_UNUSED == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_UNUSED == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_UNUSED == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_UNUSED == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_UNUSED == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
}
if (IS_CV == IS_VAR && !Z_ISREF_P(retval_ptr)) {
-//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
-//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ (retval_ptr->var_flags & IS_VAR_RET_REF)) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
+ } else {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
ZVAL_NEW_REF(EX(return_value), &tmp);
}
break;
-//??? }
+ }
}
if (EX(return_value)) {
}
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
-//???
-#if 0
if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
- EX_T(opline->op1.var).var.fcall_returned_reference) &&
- (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
- Z_SET_ISREF_P(varptr);
- if (IS_CV == IS_CV) {
- Z_ADDREF_P(varptr);
- }
- zend_vm_stack_push(varptr TSRMLS_CC);
-#else
- if (Z_ISREF_P(varptr)) {
- if (IS_CV == IS_CV) {
- Z_ADDREF_P(varptr);
- }
- zend_vm_stack_push(varptr TSRMLS_CC);
- } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) {
- ZVAL_NEW_REF(varptr, varptr);
- if (IS_CV == IS_CV) {
- Z_ADDREF_P(varptr);
+ (varptr->var_flags & IS_VAR_RET_REF)) &&
+ (!Z_REFCOUNTED_P(varptr) ||
+ Z_ISREF_P(varptr) ||
+ Z_REFCOUNT_P(varptr) == 1)) {
+
+ if (Z_ISREF_P(varptr)) {
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
+ } else {
+ ZVAL_NEW_REF(varptr, varptr);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
}
zend_vm_stack_push(varptr TSRMLS_CC);
-#endif
} else {
zval val;
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CV == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CV == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
if (IS_VAR == IS_VAR &&
value_ptr &&
!Z_ISREF_P(value_ptr) &&
- opline->extended_value == ZEND_RETURNS_FUNCTION /*???&&
- !EX_T(opline->op2.var).var.fcall_returned_reference*/) {
+ opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !(value_ptr->var_flags & IS_VAR_RET_REF)) {
if (!(free_op2.var != NULL)) {
PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CV == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CV == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
if (IS_CV == IS_VAR &&
value_ptr &&
!Z_ISREF_P(value_ptr) &&
- opline->extended_value == ZEND_RETURNS_FUNCTION /*???&&
- !EX_T(opline->op2.var).var.fcall_returned_reference*/) {
+ opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !(value_ptr->var_flags & IS_VAR_RET_REF)) {
if (!0) {
PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
if (IS_CV == IS_VAR && !Z_ISREF_P(value_ptr)
-//??? && !(opline->extended_value == ZEND_RETURNS_FUNCTION
-//??? && EX_T(opline->op1.var).var.fcall_returned_reference)
+ && !(opline->extended_value == ZEND_RETURNS_FUNCTION
+ && (value_ptr->var_flags & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");