@@ -7093,30 +7093,37 @@ static int zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
7093
7093
static int ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7094
7094
{
7095
7095
zend_op *opline = EX(opline);
7096
+ zend_free_op free_op1;
7097
+ zval *varptr;
7098
+
7096
7099
if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
7097
7100
if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
7098
7101
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7099
7102
}
7100
7103
} else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
7101
7104
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7102
7105
}
7103
- if ((opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
7104
- !EX_T(opline->op1.u.var).var.fcall_returned_reference) {
7105
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
7106
+
7107
+ varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
7108
+ if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
7109
+ EX_T(opline->op1.u.var).var.fcall_returned_reference) &&
7110
+ varptr != &EG(uninitialized_zval) &&
7111
+ (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) {
7112
+ varptr->is_ref = 1;
7113
+ varptr->refcount++;
7114
+ zend_ptr_stack_push(&EG(argument_stack), varptr);
7106
7115
} else {
7107
- zval *varptr;
7108
- zend_free_op free_op1;
7109
- varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
7116
+ zval *valptr;
7110
7117
7111
- if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) {
7112
- varptr->is_ref = 1;
7113
- varptr->refcount++;
7114
- zend_ptr_stack_push(&EG(argument_stack), varptr);
7115
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
7116
- ZEND_VM_NEXT_OPCODE();
7118
+ zend_error(E_STRICT, "Only variables should be passed by reference");
7119
+ ALLOC_ZVAL(valptr);
7120
+ INIT_PZVAL_COPY(valptr, varptr);
7121
+ if (!0) {
7122
+ zval_copy_ctor(valptr);
7117
7123
}
7118
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference" );
7124
+ zend_ptr_stack_push(&EG(argument_stack), valptr );
7119
7125
}
7126
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
7120
7127
ZEND_VM_NEXT_OPCODE();
7121
7128
}
7122
7129
@@ -19258,30 +19265,37 @@ static int zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
19258
19265
static int ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19259
19266
{
19260
19267
zend_op *opline = EX(opline);
19268
+
19269
+ zval *varptr;
19270
+
19261
19271
if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
19262
19272
if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
19263
19273
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
19264
19274
}
19265
19275
} else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
19266
19276
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
19267
19277
}
19268
- if ((opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
19269
- !EX_T(opline->op1.u.var).var.fcall_returned_reference) {
19270
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
19278
+
19279
+ varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
19280
+ if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
19281
+ EX_T(opline->op1.u.var).var.fcall_returned_reference) &&
19282
+ varptr != &EG(uninitialized_zval) &&
19283
+ (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) {
19284
+ varptr->is_ref = 1;
19285
+ varptr->refcount++;
19286
+ zend_ptr_stack_push(&EG(argument_stack), varptr);
19271
19287
} else {
19272
- zval *varptr;
19273
-
19274
- varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
19275
-
19276
- if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) {
19277
- varptr->is_ref = 1;
19278
- varptr->refcount++;
19279
- zend_ptr_stack_push(&EG(argument_stack), varptr);
19288
+ zval *valptr;
19280
19289
19281
- ZEND_VM_NEXT_OPCODE();
19290
+ zend_error(E_STRICT, "Only variables should be passed by reference");
19291
+ ALLOC_ZVAL(valptr);
19292
+ INIT_PZVAL_COPY(valptr, varptr);
19293
+ if (!0) {
19294
+ zval_copy_ctor(valptr);
19282
19295
}
19283
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference" );
19296
+ zend_ptr_stack_push(&EG(argument_stack), valptr );
19284
19297
}
19298
+
19285
19299
ZEND_VM_NEXT_OPCODE();
19286
19300
}
19287
19301
0 commit comments