From: Dmitry Stogov Date: Mon, 19 Sep 2005 16:02:21 +0000 (+0000) Subject: Fixed parameter passing incompatibilities. X-Git-Tag: php-5.1.0RC2~227 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=46488c8bb4d746a778d8842878acd83819dac58b;p=php Fixed parameter passing incompatibilities. Now it is possible to call array_pop(explode("&","1&2&3")) again. --- diff --git a/Zend/tests/bug33257.phpt b/Zend/tests/bug33257.phpt index b3e98003a3..012faf350b 100755 --- a/Zend/tests/bug33257.phpt +++ b/Zend/tests/bug33257.phpt @@ -14,4 +14,10 @@ array_splice(X::getArr(), 1, 1); print_r(X::getArr()); ?> --EXPECTF-- -Fatal error: Only variables can be passed by reference in %sbug33257.php on line 10 +Strict Standards: Only variables should be passed by reference in %sbug33257.php on line 10 +Array +( + [0] => a + [1] => b + [2] => c +) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index eb61bbba6d..86d50db5fe 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2185,6 +2185,9 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY) ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) { zend_op *opline = EX(opline); + zend_free_op free_op1; + zval *varptr; + if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */ if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) { ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper); @@ -2192,23 +2195,27 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) { ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper); } - if ((opline->extended_value & ZEND_ARG_SEND_FUNCTION) && - !EX_T(opline->op1.u.var).var.fcall_returned_reference) { - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + + varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.u.var).var.fcall_returned_reference) && + varptr != &EG(uninitialized_zval) && + (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { + varptr->is_ref = 1; + varptr->refcount++; + zend_ptr_stack_push(&EG(argument_stack), varptr); } else { - zval *varptr; - zend_free_op free_op1; - varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); + zval *valptr; - if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { - varptr->is_ref = 1; - varptr->refcount++; - zend_ptr_stack_push(&EG(argument_stack), varptr); - FREE_OP1_IF_VAR(); - ZEND_VM_NEXT_OPCODE(); + zend_error(E_STRICT, "Only variables should be passed by reference"); + ALLOC_ZVAL(valptr); + INIT_PZVAL_COPY(valptr, varptr); + if (!IS_OP1_TMP_FREE()) { + zval_copy_ctor(valptr); } - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + zend_ptr_stack_push(&EG(argument_stack), valptr); } + FREE_OP1_IF_VAR(); ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9d52c39d37..32f91d6029 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -7093,6 +7093,9 @@ static int zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS) static int ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + zend_free_op free_op1; + zval *varptr; + if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */ if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) { return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -7100,23 +7103,27 @@ static int ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) { return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); } - if ((opline->extended_value & ZEND_ARG_SEND_FUNCTION) && - !EX_T(opline->op1.u.var).var.fcall_returned_reference) { - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + + varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.u.var).var.fcall_returned_reference) && + varptr != &EG(uninitialized_zval) && + (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { + varptr->is_ref = 1; + varptr->refcount++; + zend_ptr_stack_push(&EG(argument_stack), varptr); } else { - zval *varptr; - zend_free_op free_op1; - varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); + zval *valptr; - if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { - varptr->is_ref = 1; - varptr->refcount++; - zend_ptr_stack_push(&EG(argument_stack), varptr); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; - ZEND_VM_NEXT_OPCODE(); + zend_error(E_STRICT, "Only variables should be passed by reference"); + ALLOC_ZVAL(valptr); + INIT_PZVAL_COPY(valptr, varptr); + if (!0) { + zval_copy_ctor(valptr); } - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + zend_ptr_stack_push(&EG(argument_stack), valptr); } + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; ZEND_VM_NEXT_OPCODE(); } @@ -19258,6 +19265,9 @@ static int zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS) static int ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + + zval *varptr; + if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */ if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) { return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -19265,23 +19275,27 @@ static int ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) { return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); } - if ((opline->extended_value & ZEND_ARG_SEND_FUNCTION) && - !EX_T(opline->op1.u.var).var.fcall_returned_reference) { - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + + varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.u.var).var.fcall_returned_reference) && + varptr != &EG(uninitialized_zval) && + (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { + varptr->is_ref = 1; + varptr->refcount++; + zend_ptr_stack_push(&EG(argument_stack), varptr); } else { - zval *varptr; - - varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); - - if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) { - varptr->is_ref = 1; - varptr->refcount++; - zend_ptr_stack_push(&EG(argument_stack), varptr); + zval *valptr; - ZEND_VM_NEXT_OPCODE(); + zend_error(E_STRICT, "Only variables should be passed by reference"); + ALLOC_ZVAL(valptr); + INIT_PZVAL_COPY(valptr, varptr); + if (!0) { + zval_copy_ctor(valptr); } - zend_error_noreturn(E_ERROR, "Only variables can be passed by reference"); + zend_ptr_stack_push(&EG(argument_stack), valptr); } + ZEND_VM_NEXT_OPCODE(); }