[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-cvs
Subject:    [PHP-CVS] [php-src] master: Merge branch 'PHP-8.0' into PHP-8.1
From:       Nikita Popov <noreply () php ! net>
Date:       2021-09-30 12:56:38
Message-ID: H2dKKmZUag7576FzWLTpuiqwyPhAeTUgXiukAXcqJs0 () main ! php ! net
[Download RAW message or body]

Author: Nikita Popov (nikic)
Date: 2021-09-30T14:56:44+02:00

Commit: https://github.com/php/php-src/commit/02244d5ee6d33baa4018354d042bb680fd7486d0
 Raw diff: https://github.com/php/php-src/commit/02244d5ee6d33baa4018354d042bb680fd7486d0.diff


Merge branch 'PHP-8.0' into PHP-8.1

* PHP-8.0:
  Create reference wrappers in SEND_UNPACK if necessary

Changed paths:
  A  Zend/tests/unpack_iterator_by_ref_type_check.phpt
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h


Diff:

diff --git a/Zend/tests/unpack_iterator_by_ref_type_check.phpt \
b/Zend/tests/unpack_iterator_by_ref_type_check.phpt new file mode 100644
index 000000000000..2fef31056bdc
--- /dev/null
+++ b/Zend/tests/unpack_iterator_by_ref_type_check.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Unpack iterator by reference with type check
+--FILE--
+<?php
+function test(T &$a) {
+}
+function gen() {
+    yield null;
+}
+try {
+    test(...gen());
+} catch (TypeError $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Warning: Cannot pass by-reference argument 1 of test() by unpacking a Traversable, \
passing by-value instead in %s on line %d +test(): Argument #1 ($a) must be of type \
                T, null given, called in %s on line %d
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 5a74e30ccb77..672734c2b782 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -5145,6 +5145,9 @@ ZEND_VM_C_LABEL(send_again):
 						break;
 					}
 
+					ZVAL_DEREF(arg);
+					Z_TRY_ADDREF_P(arg);
+
 					if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
 						zend_error(
 							E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
@@ -5153,9 +5156,11 @@ ZEND_VM_C_LABEL(send_again):
 							EX(call)->func->common.scope ? "::" : "",
 							ZSTR_VAL(EX(call)->func->common.function_name)
 						);
+						ZVAL_NEW_REF(top, arg);
+					} else {
+						ZVAL_COPY_VALUE(top, arg);
 					}
 
-					ZVAL_COPY_DEREF(top, arg);
 					zend_string_release(name);
 				} else {
 					if (have_named_params) {
@@ -5164,6 +5169,11 @@ ZEND_VM_C_LABEL(send_again):
 						break;
 					}
 
+					zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
+					top = ZEND_CALL_ARG(EX(call), arg_num);
+					ZVAL_DEREF(arg);
+					Z_TRY_ADDREF_P(arg);
+
 					if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
 						zend_error(
 							E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
@@ -5172,12 +5182,11 @@ ZEND_VM_C_LABEL(send_again):
 							EX(call)->func->common.scope ? "::" : "",
 							ZSTR_VAL(EX(call)->func->common.function_name)
 						);
+						ZVAL_NEW_REF(top, arg);
+					} else {
+						ZVAL_COPY_VALUE(top, arg);
 					}
 
-
-					zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
-					top = ZEND_CALL_ARG(EX(call), arg_num);
-					ZVAL_COPY_DEREF(top, arg);
 					ZEND_CALL_NUM_ARGS(EX(call))++;
 				}
 
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 17634ef8c317..a861aabc3017 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2258,6 +2258,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL \
ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_  break;
 					}
 
+					ZVAL_DEREF(arg);
+					Z_TRY_ADDREF_P(arg);
+
 					if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
 						zend_error(
 							E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
@@ -2266,9 +2269,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL \
ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_  EX(call)->func->common.scope ? "::" : "",
 							ZSTR_VAL(EX(call)->func->common.function_name)
 						);
+						ZVAL_NEW_REF(top, arg);
+					} else {
+						ZVAL_COPY_VALUE(top, arg);
 					}
 
-					ZVAL_COPY_DEREF(top, arg);
 					zend_string_release(name);
 				} else {
 					if (have_named_params) {
@@ -2277,6 +2282,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL \
ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_  break;
 					}
 
+					zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
+					top = ZEND_CALL_ARG(EX(call), arg_num);
+					ZVAL_DEREF(arg);
+					Z_TRY_ADDREF_P(arg);
+
 					if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
 						zend_error(
 							E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
@@ -2285,12 +2295,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL \
ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_  EX(call)->func->common.scope ? "::" : "",
 							ZSTR_VAL(EX(call)->func->common.function_name)
 						);
+						ZVAL_NEW_REF(top, arg);
+					} else {
+						ZVAL_COPY_VALUE(top, arg);
 					}
 
-
-					zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
-					top = ZEND_CALL_ARG(EX(call), arg_num);
-					ZVAL_COPY_DEREF(top, arg);
 					ZEND_CALL_NUM_ARGS(EX(call))++;
 				}
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic