]> granicus.if.org Git - php/commitdiff
Fix SEND_USER as well
authorNikita Popov <nikic@php.net>
Mon, 18 Apr 2016 20:45:38 +0000 (22:45 +0200)
committerNikita Popov <nikic@php.net>
Mon, 18 Apr 2016 20:45:38 +0000 (22:45 +0200)
Missed copy&paste code here

Zend/tests/call_user_func_array_prefer_ref.phpt
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 9c1d822d6994d0a810a48b5bda6f7ad5cdef9c99..d7a5fd913a11241e2564bb4b679097ada4f63add 100644 (file)
@@ -10,6 +10,11 @@ namespace {
     call_user_func_array('array_multisort', $args);
     var_dump($args);
     unset($args);
+
+    $array = [3, 2, 1];
+    call_user_func('array_multisort', $array);
+    var_dump($array);
+    unset($array);
 }
 
 namespace Foo {
@@ -19,6 +24,11 @@ namespace Foo {
     call_user_func_array('array_multisort', $args);
     var_dump($args);
     unset($args);
+
+    $array = [3, 2, 1];
+    call_user_func('array_multisort', $array);
+    var_dump($array);
+    unset($array);
 }
 
 ?>
@@ -34,6 +44,14 @@ array(1) {
     int(1)
   }
 }
+array(3) {
+  [0]=>
+  int(3)
+  [1]=>
+  int(2)
+  [2]=>
+  int(1)
+}
 array(1) {
   [0]=>
   array(3) {
@@ -45,3 +63,11 @@ array(1) {
     int(1)
   }
 }
+array(3) {
+  [0]=>
+  int(3)
+  [1]=>
+  int(2)
+  [2]=>
+  int(1)
+}
index 6ca584d69fb330497fc0ac4cb0973239c359fd84..1b1137df83fc7839c0cbb7d8c35eec0770aa9f0f 100644 (file)
@@ -4655,7 +4655,6 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
                if (UNEXPECTED(!Z_ISREF_P(arg))) {
-
                        if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
 
                                zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
@@ -4678,21 +4677,15 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
                                FREE_OP1();
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                        }
-
-                       ZVAL_NEW_REF(arg, arg);
                }
-               Z_ADDREF_P(arg);
        } else {
                if (Z_ISREF_P(arg) &&
                    !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
                        /* don't separate references for __call */
                        arg = Z_REFVAL_P(arg);
                }
-               if (Z_OPT_REFCOUNTED_P(arg)) {
-                       Z_ADDREF_P(arg);
-               }
        }
-       ZVAL_COPY_VALUE(param, arg);
+       ZVAL_COPY(param, arg);
 
        FREE_OP1();
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
index 90c3d0fa19cfe76aeeee5e7676c64674a75cd419..98fa5e5e729e6cbb7612e134612d38b11e4f8dc2 100644 (file)
@@ -15331,7 +15331,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
                if (UNEXPECTED(!Z_ISREF_P(arg))) {
-
                        if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
 
                                zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
@@ -15354,21 +15353,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
                                zval_ptr_dtor_nogc(free_op1);
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                        }
-
-                       ZVAL_NEW_REF(arg, arg);
                }
-               Z_ADDREF_P(arg);
        } else {
                if (Z_ISREF_P(arg) &&
                    !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
                        /* don't separate references for __call */
                        arg = Z_REFVAL_P(arg);
                }
-               if (Z_OPT_REFCOUNTED_P(arg)) {
-                       Z_ADDREF_P(arg);
-               }
        }
-       ZVAL_COPY_VALUE(param, arg);
+       ZVAL_COPY(param, arg);
 
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -28945,7 +28938,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
                if (UNEXPECTED(!Z_ISREF_P(arg))) {
-
                        if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
 
                                zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
@@ -28967,21 +28959,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
 
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                        }
-
-                       ZVAL_NEW_REF(arg, arg);
                }
-               Z_ADDREF_P(arg);
        } else {
                if (Z_ISREF_P(arg) &&
                    !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
                        /* don't separate references for __call */
                        arg = Z_REFVAL_P(arg);
                }
-               if (Z_OPT_REFCOUNTED_P(arg)) {
-                       Z_ADDREF_P(arg);
-               }
        }
-       ZVAL_COPY_VALUE(param, arg);
+       ZVAL_COPY(param, arg);
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }