Skip to content

Commit a45bef0

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
2 parents 1616ae2 + 2922d67 commit a45bef0

File tree

6 files changed

+82
-5
lines changed

6 files changed

+82
-5
lines changed

Zend/zend_API.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ typedef struct _zend_fcall_info_cache {
142142
{ #name, ZEND_TYPE_INIT_MASK(type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
143143
#define ZEND_ARG_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask, default_value) \
144144
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
145-
#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask, default_value) \
146-
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), default_value },
145+
#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask) \
146+
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
147147

148148
/* Arginfo structures with object type information */
149149
#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, class_name, allow_null) \

build/gen_stub.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3882,10 +3882,10 @@ function funcInfoToCode(FileInfo $fileInfo, FuncInfo $funcInfo): string {
38823882
$arginfoType = $argType->toArginfoType();
38833883
if ($arginfoType->hasClassType()) {
38843884
$code .= sprintf(
3885-
"\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s, %s)\n",
3885+
"\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s%s)\n",
38863886
$argKind, $argInfo->getSendByString(), $argInfo->name,
38873887
$arginfoType->toClassTypeString(), $arginfoType->toTypeMask(),
3888-
$argInfo->getDefaultValueAsArginfoString()
3888+
!$argInfo->isVariadic ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
38893889
);
38903890
} else {
38913891
$code .= sprintf(

ext/zend_test/test.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,31 @@ static ZEND_METHOD(_ZendTestClass, returnsThrowable)
548548
zend_throw_error(NULL, "Dummy");
549549
}
550550

551+
static ZEND_METHOD(_ZendTestClass, variadicTest) {
552+
int argc, i;
553+
zval *args = NULL;
554+
555+
ZEND_PARSE_PARAMETERS_START(0, -1)
556+
Z_PARAM_VARIADIC('*', args, argc)
557+
ZEND_PARSE_PARAMETERS_END();
558+
559+
for (i = 0; i < argc; i++) {
560+
zval *arg = args + i;
561+
562+
if (Z_TYPE_P(arg) == IS_STRING) {
563+
continue;
564+
}
565+
if (Z_TYPE_P(arg) == IS_OBJECT && instanceof_function(Z_OBJ_P(arg)->ce, zend_ce_iterator)) {
566+
continue;
567+
}
568+
569+
zend_argument_type_error(i + 1, "must be of class Iterator or a string, %s given", zend_zval_type_name(arg));
570+
RETURN_THROWS();
571+
}
572+
573+
object_init_ex(return_value, zend_get_called_scope(execute_data));
574+
}
575+
551576
static ZEND_METHOD(_ZendTestChildClass, returnsThrowable)
552577
{
553578
ZEND_PARSE_PARAMETERS_NONE();

ext/zend_test/test.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public function __toString(): string {}
4343
public function returnsStatic(): static {}
4444

4545
public function returnsThrowable(): Throwable {}
46+
47+
static public function variadicTest(string|Iterator ...$elements) : static {}
4648
}
4749

4850
class _ZendTestChildClass extends _ZendTestClass

ext/zend_test/test_arginfo.h

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
Verify that variadic arguments create proper stub
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
8+
$reflection = new ReflectionMethod("_ZendTestClass", "variadicTest");
9+
$arguments = $reflection->getParameters();
10+
11+
echo (string) $arguments[0], "\n";
12+
var_dump($arguments[0]->isVariadic());
13+
14+
$type = $arguments[0]->getType();
15+
16+
var_dump($type instanceof ReflectionUnionType);
17+
18+
echo "\n";
19+
20+
$types = $type->getTypes();
21+
22+
var_dump($types[0]->getName());
23+
var_dump($types[0] instanceof ReflectionNamedType);
24+
var_dump($types[0]->allowsNull());
25+
26+
echo "\n";
27+
28+
var_dump($types[1]->getName());
29+
var_dump($types[1] instanceof ReflectionNamedType);
30+
var_dump($types[1]->allowsNull());
31+
32+
?>
33+
--EXPECTF--
34+
Parameter #0 [ <optional> Iterator|string ...$elements ]
35+
bool(true)
36+
bool(true)
37+
38+
string(8) "Iterator"
39+
bool(true)
40+
bool(false)
41+
42+
string(6) "string"
43+
bool(true)
44+
bool(false)

0 commit comments

Comments
 (0)