}
ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+
+ if (!EG(return_value_ptr_ptr)) {
+ if (OP1_TYPE == IS_TMP_VAR) {
+ FREE_OP1();
+ }
+ } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */
+ if (OP1_TYPE == IS_CONST ||
+ (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ FREE_OP1_IF_VAR();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
+}
+
+ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
zval *retval_ptr;
zend_free_op free_op1;
SAVE_OPLINE();
- if (UNEXPECTED(EG(active_op_array)->return_reference == ZEND_RETURN_REF)) {
+ do {
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- ZEND_VM_C_GOTO(return_by_value);
+
+ retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ if (!EG(return_value_ptr_ptr)) {
+ if (OP1_TYPE == IS_TMP_VAR) {
+ FREE_OP1();
+ }
+ } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ break;
}
retval_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
EX_T(opline->op1.var).var.fcall_returned_reference) {
} else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
- if (OP1_TYPE == IS_VAR && !OP1_FREE) {
- PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
- }
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- ZEND_VM_C_GOTO(return_by_value);
+ if (EG(return_value_ptr_ptr)) {
+ retval_ptr = *retval_ptr_ptr;
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ break;
}
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
}
- FREE_OP1_IF_VAR();
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- } else {
-ZEND_VM_C_LABEL(return_by_value):
-
- retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
-
- if (!EG(return_value_ptr_ptr)) {
- if (OP1_TYPE == IS_TMP_VAR) {
- FREE_OP1();
- }
- } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */
- if (OP1_TYPE == IS_CONST ||
- EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
- (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
- zval *ret;
+ } while (0);
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- zval_copy_ctor(ret);
- *EG(return_value_ptr_ptr) = ret;
- } else {
- *EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- *EG(return_value_ptr_ptr) = ret;
- }
- FREE_OP1_IF_VAR();
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
+ FREE_OP1_IF_VAR();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
}
static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+
+
+ SAVE_OPLINE();
+ retval_ptr = opline->op1.zv;
+
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CONST == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
+ if (IS_CONST == IS_CONST ||
+ (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *retval_ptr;
SAVE_OPLINE();
- if (UNEXPECTED(EG(active_op_array)->return_reference == ZEND_RETURN_REF)) {
+ do {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+
+ retval_ptr = opline->op1.zv;
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CONST == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ break;
}
retval_ptr_ptr = NULL;
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
EX_T(opline->op1.var).var.fcall_returned_reference) {
} else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
- if (IS_CONST == IS_VAR && !0) {
- PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
- }
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+ if (EG(return_value_ptr_ptr)) {
+ retval_ptr = *retval_ptr_ptr;
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ break;
}
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
- }
-
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- } else {
-return_by_value:
-
- retval_ptr = opline->op1.zv;
-
- if (!EG(return_value_ptr_ptr)) {
- if (IS_CONST == IS_TMP_VAR) {
-
- }
- } else if (!0) { /* Not a temp var */
- if (IS_CONST == IS_CONST ||
- EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
- (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- zval_copy_ctor(ret);
- *EG(return_value_ptr_ptr) = ret;
- } else {
- *EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- *EG(return_value_ptr_ptr) = ret;
+ *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
}
+ } while (0);
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- }
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
static int ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ retval_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_TMP_VAR == IS_TMP_VAR) {
+ zval_dtor(free_op1.var);
+ }
+ } else if (!1) { /* Not a temp var */
+ if (IS_TMP_VAR == IS_CONST ||
+ (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *retval_ptr;
zend_free_op free_op1;
SAVE_OPLINE();
- if (UNEXPECTED(EG(active_op_array)->return_reference == ZEND_RETURN_REF)) {
+ do {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+
+ retval_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_TMP_VAR == IS_TMP_VAR) {
+ zval_dtor(free_op1.var);
+ }
+ } else if (!1) { /* Not a temp var */
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ break;
}
retval_ptr_ptr = NULL;
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
EX_T(opline->op1.var).var.fcall_returned_reference) {
} else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
- if (IS_TMP_VAR == IS_VAR && !1) {
- PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
- }
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+ if (EG(return_value_ptr_ptr)) {
+ retval_ptr = *retval_ptr_ptr;
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ break;
}
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
- }
-
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- } else {
-return_by_value:
-
- retval_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
-
- if (!EG(return_value_ptr_ptr)) {
- if (IS_TMP_VAR == IS_TMP_VAR) {
- zval_dtor(free_op1.var);
- }
- } else if (!1) { /* Not a temp var */
- if (IS_TMP_VAR == IS_CONST ||
- EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
- (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- zval_copy_ctor(ret);
- *EG(return_value_ptr_ptr) = ret;
- } else {
- *EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- *EG(return_value_ptr_ptr) = ret;
+ *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
}
+ } while (0);
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- }
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
static int ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ retval_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_VAR == IS_TMP_VAR) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
+ } else if (!0) { /* Not a temp var */
+ if (IS_VAR == IS_CONST ||
+ (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *retval_ptr;
zend_free_op free_op1;
SAVE_OPLINE();
- if (UNEXPECTED(EG(active_op_array)->return_reference == ZEND_RETURN_REF)) {
+ do {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+
+ retval_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_VAR == IS_TMP_VAR) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
+ } else if (!0) { /* Not a temp var */
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ break;
}
retval_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
EX_T(opline->op1.var).var.fcall_returned_reference) {
} else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
- if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
- PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
- }
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+ if (EG(return_value_ptr_ptr)) {
+ retval_ptr = *retval_ptr_ptr;
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ break;
}
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- } else {
-return_by_value:
-
- retval_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
-
- if (!EG(return_value_ptr_ptr)) {
- if (IS_VAR == IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- }
- } else if (!0) { /* Not a temp var */
- if (IS_VAR == IS_CONST ||
- EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
- (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
- zval *ret;
+ } while (0);
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- zval_copy_ctor(ret);
- *EG(return_value_ptr_ptr) = ret;
- } else {
- *EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- *EG(return_value_ptr_ptr) = ret;
- }
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- }
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
static int ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+
+
+ SAVE_OPLINE();
+ retval_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
+
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CV == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
+ if (IS_CV == IS_CONST ||
+ (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *retval_ptr;
SAVE_OPLINE();
- if (UNEXPECTED(EG(active_op_array)->return_reference == ZEND_RETURN_REF)) {
+ do {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+
+ retval_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CV == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ zval_copy_ctor(ret);
+ *EG(return_value_ptr_ptr) = ret;
+ } else {
+ zval *ret;
+
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, retval_ptr);
+ *EG(return_value_ptr_ptr) = ret;
+ }
+ break;
}
retval_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
EX_T(opline->op1.var).var.fcall_returned_reference) {
} else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
- if (IS_CV == IS_VAR && !0) {
- PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
- }
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- goto return_by_value;
+ if (EG(return_value_ptr_ptr)) {
+ retval_ptr = *retval_ptr_ptr;
+ *EG(return_value_ptr_ptr) = retval_ptr;
+ Z_ADDREF_P(retval_ptr);
+ }
+ break;
}
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
- }
-
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- } else {
-return_by_value:
-
- retval_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
-
- if (!EG(return_value_ptr_ptr)) {
- if (IS_CV == IS_TMP_VAR) {
-
- }
- } else if (!0) { /* Not a temp var */
- if (IS_CV == IS_CONST ||
- EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
- (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- zval_copy_ctor(ret);
- *EG(return_value_ptr_ptr) = ret;
- } else {
- *EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- zval *ret;
-
- ALLOC_ZVAL(ret);
- INIT_PZVAL_COPY(ret, retval_ptr);
- *EG(return_value_ptr_ptr) = ret;
+ *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
}
+ } while (0);
- return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- }
+ return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
static int ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZEND_CLONE_SPEC_CV_HANDLER,
ZEND_CLONE_SPEC_CV_HANDLER,
ZEND_CLONE_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
+ ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,