]> granicus.if.org Git - php/commitdiff
Fixed bug #30407 (Strange behaviour of default arguments)
authorDmitry Stogov <dmitry@php.net>
Thu, 10 Feb 2005 11:45:24 +0000 (11:45 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 10 Feb 2005 11:45:24 +0000 (11:45 +0000)
NEWS
Zend/tests/bug30407.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index 71372b85128bb192f5785f05483e9bc59276819d..157c336c17144e6996c48f9bde87e811f5fd9428 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -67,6 +67,7 @@ PHP                                                                        NEWS
 - Fixed bug in mysql::client_version(). (Georg)
 - Fixed ZTS destruction. (Marcus)
 - Fixed bug #31478 (segfault with empty() / isset()). (Moriyoshi)
+- Fixed bug #30407 (Strange behaviour of default arguments). (Dmitry)
 - Fixed bug #29728 (Reflection API Feature: Default parameter value). (Marcus)
 - Fixed bug #29522 (accessing properties without connection). (Georg)
 - Fixed bug #29335 (fetch functions now use MYSQLI_BOTH as default). (Georg)
diff --git a/Zend/tests/bug30407.phpt b/Zend/tests/bug30407.phpt
new file mode 100644 (file)
index 0000000..6dcc6b3
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #30407 (Strange behaviour of default arguments)
+--FILE--
+<?php
+
+function haricow($a = 'one') {
+       var_dump($a);
+       $a = 'two';
+}
+
+haricow();
+haricow();
+?>
+===DONE===
+--EXPECT--
+string(3) "one"
+string(3) "one"
+===DONE===
index 31c41658ba433afb6fc4ca9650ce5103a02bb9c9..ad6c7e4774a904261130676caf3229802bdcd002 100644 (file)
@@ -2197,7 +2197,6 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
        zval **param, *assignment_value;
        zend_uint arg_num = opline->op1.u.constant.value.lval;
        zend_free_op free_res;
-       zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
 
        if (zend_ptr_stack_get_arg(arg_num, (void **) &param TSRMLS_CC)==FAILURE) {
                if (opline->op2.u.constant.type == IS_CONSTANT || opline->op2.u.constant.type==IS_CONSTANT_ARRAY) {
@@ -2219,8 +2218,10 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
                        assignment_value = &opline->op2.u.constant;
                }
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
-               zend_receive(var_ptr, assignment_value TSRMLS_CC);
+               zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);
        } else {
+               zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
+
                assignment_value = *param;
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
                if (PZVAL_IS_REF(assignment_value)) {
index 29d5101c0ab4d118303fe25db60547cf1a774994..ab53117ca756e23bd2d98dae125375a32d28b8d2 100644 (file)
@@ -638,7 +638,6 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        zval **param, *assignment_value;
        zend_uint arg_num = opline->op1.u.constant.value.lval;
        zend_free_op free_res;
-       zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
 
        if (zend_ptr_stack_get_arg(arg_num, (void **) &param TSRMLS_CC)==FAILURE) {
                if (opline->op2.u.constant.type == IS_CONSTANT || opline->op2.u.constant.type==IS_CONSTANT_ARRAY) {
@@ -660,8 +659,10 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        assignment_value = &opline->op2.u.constant;
                }
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
-               zend_receive(var_ptr, assignment_value TSRMLS_CC);
+               zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);
        } else {
+               zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
+
                assignment_value = *param;
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
                if (PZVAL_IS_REF(assignment_value)) {
@@ -29910,7 +29911,6 @@ static int ZEND_RECV_INIT_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        zval **param, *assignment_value;
        zend_uint arg_num = opline->op1.u.constant.value.lval;
        zend_free_op free_res;
-       zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
 
        if (zend_ptr_stack_get_arg(arg_num, (void **) &param TSRMLS_CC)==FAILURE) {
                if (opline->op2.u.constant.type == IS_CONSTANT || opline->op2.u.constant.type==IS_CONSTANT_ARRAY) {
@@ -29932,8 +29932,10 @@ static int ZEND_RECV_INIT_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        assignment_value = &opline->op2.u.constant;
                }
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
-               zend_receive(var_ptr, assignment_value TSRMLS_CC);
+               zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);
        } else {
+               zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
+
                assignment_value = *param;
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);
                if (PZVAL_IS_REF(assignment_value)) {