]> granicus.if.org Git - php/commitdiff
Send by reference without duplication
authorDmitry Stogov <dmitry@zend.com>
Wed, 17 Jan 2018 15:50:18 +0000 (18:50 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 17 Jan 2018 15:50:18 +0000 (18:50 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 407194ec87dd51063747ba4b86fdd06a3129d125..5d129a9ae1ddb853fe435051b60286ef8182f2cf 100644 (file)
@@ -4404,19 +4404,19 @@ ZEND_VM_C_LABEL(send_again):
 
                        top = ZEND_CALL_ARG(EX(call), arg_num);
                        if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-                               if (Z_REFCOUNT_P(args) == 1) {
-                                       if (Z_ISREF_P(arg)) {
-                                               Z_ADDREF_P(arg);
-                                       } else {
-                                               ZVAL_MAKE_REF_EX(arg, 2);
-                                       }
+                               if (Z_ISREF_P(arg)) {
+                                       Z_ADDREF_P(arg);
+                                       ZVAL_REF(top, Z_REF_P(arg));
+                               } else if (OP1_TYPE & (IS_VAR|IS_CV)) {
+                                       /* array is already separated above */
+                                       ZVAL_MAKE_REF_EX(arg, 2);
                                        ZVAL_REF(top, Z_REF_P(arg));
                                } else {
-                                       ZVAL_DUP(top, arg);
+                                       Z_TRY_ADDREF_P(arg);
+                                       ZVAL_NEW_REF(top, arg);
                                }
-                       } else if (Z_ISREF_P(arg)) {
-                               ZVAL_COPY(top, Z_REFVAL_P(arg));
                        } else {
+                               ZVAL_DEREF(arg);
                                ZVAL_COPY(top, arg);
                        }
 
index dfa5306514cdeab84f30edf7360c4d9645387cf4..c7b1487967748bf57a8b213d5e48845372793579 100644 (file)
@@ -1234,19 +1234,19 @@ send_again:
 
                        top = ZEND_CALL_ARG(EX(call), arg_num);
                        if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-                               if (Z_REFCOUNT_P(args) == 1) {
-                                       if (Z_ISREF_P(arg)) {
-                                               Z_ADDREF_P(arg);
-                                       } else {
-                                               ZVAL_MAKE_REF_EX(arg, 2);
-                                       }
+                               if (Z_ISREF_P(arg)) {
+                                       Z_ADDREF_P(arg);
+                                       ZVAL_REF(top, Z_REF_P(arg));
+                               } else if (opline->op1_type & (IS_VAR|IS_CV)) {
+                                       /* array is already separated above */
+                                       ZVAL_MAKE_REF_EX(arg, 2);
                                        ZVAL_REF(top, Z_REF_P(arg));
                                } else {
-                                       ZVAL_DUP(top, arg);
+                                       Z_TRY_ADDREF_P(arg);
+                                       ZVAL_NEW_REF(top, arg);
                                }
-                       } else if (Z_ISREF_P(arg)) {
-                               ZVAL_COPY(top, Z_REFVAL_P(arg));
                        } else {
+                               ZVAL_DEREF(arg);
                                ZVAL_COPY(top, arg);
                        }