Merge branch 'PHP-8.1' into PHP-8.2

This commit is contained in:
Derick Rethans 2023-03-09 13:37:19 +00:00
commit a45bef0ac6
6 changed files with 82 additions and 5 deletions

View File

@ -142,8 +142,8 @@ typedef struct _zend_fcall_info_cache {
{ #name, ZEND_TYPE_INIT_MASK(type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
#define ZEND_ARG_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask, default_value) \
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask, default_value) \
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), default_value },
#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask) \
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
/* Arginfo structures with object type information */
#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, class_name, allow_null) \

View File

@ -3882,10 +3882,10 @@ function funcInfoToCode(FileInfo $fileInfo, FuncInfo $funcInfo): string {
$arginfoType = $argType->toArginfoType();
if ($arginfoType->hasClassType()) {
$code .= sprintf(
"\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s, %s)\n",
"\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s%s)\n",
$argKind, $argInfo->getSendByString(), $argInfo->name,
$arginfoType->toClassTypeString(), $arginfoType->toTypeMask(),
$argInfo->getDefaultValueAsArginfoString()
!$argInfo->isVariadic ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
);
} else {
$code .= sprintf(

View File

@ -548,6 +548,31 @@ static ZEND_METHOD(_ZendTestClass, returnsThrowable)
zend_throw_error(NULL, "Dummy");
}
static ZEND_METHOD(_ZendTestClass, variadicTest) {
int argc, i;
zval *args = NULL;
ZEND_PARSE_PARAMETERS_START(0, -1)
Z_PARAM_VARIADIC('*', args, argc)
ZEND_PARSE_PARAMETERS_END();
for (i = 0; i < argc; i++) {
zval *arg = args + i;
if (Z_TYPE_P(arg) == IS_STRING) {
continue;
}
if (Z_TYPE_P(arg) == IS_OBJECT && instanceof_function(Z_OBJ_P(arg)->ce, zend_ce_iterator)) {
continue;
}
zend_argument_type_error(i + 1, "must be of class Iterator or a string, %s given", zend_zval_type_name(arg));
RETURN_THROWS();
}
object_init_ex(return_value, zend_get_called_scope(execute_data));
}
static ZEND_METHOD(_ZendTestChildClass, returnsThrowable)
{
ZEND_PARSE_PARAMETERS_NONE();

View File

@ -43,6 +43,8 @@ namespace {
public function returnsStatic(): static {}
public function returnsThrowable(): Throwable {}
static public function variadicTest(string|Iterator ...$elements) : static {}
}
class _ZendTestChildClass extends _ZendTestClass

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: a542841a2a34886c1ff4dc2154c322b5efbde35a */
* Stub hash: 189db7e45ac72c06cbe324043ab5716955ac554b */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
@ -127,6 +127,10 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class__ZendTestClass_returnsThrowable, 0, 0, Throwable, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestClass_variadicTest, 0, 0, IS_STATIC, 0)
ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(0, elements, Iterator, MAY_BE_STRING)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class__ZendTestChildClass_returnsThrowable, 0, 0, Exception, 0)
ZEND_END_ARG_INFO()
@ -196,6 +200,7 @@ static ZEND_METHOD(_ZendTestClass, is_object);
static ZEND_METHOD(_ZendTestClass, __toString);
static ZEND_METHOD(_ZendTestClass, returnsStatic);
static ZEND_METHOD(_ZendTestClass, returnsThrowable);
static ZEND_METHOD(_ZendTestClass, variadicTest);
static ZEND_METHOD(_ZendTestChildClass, returnsThrowable);
static ZEND_METHOD(_ZendTestTrait, testMethod);
static ZEND_METHOD(ZendTestParameterAttribute, __construct);
@ -261,6 +266,7 @@ static const zend_function_entry class__ZendTestClass_methods[] = {
ZEND_ME(_ZendTestClass, __toString, arginfo_class__ZendTestClass___toString, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED)
ZEND_ME(_ZendTestClass, returnsStatic, arginfo_class__ZendTestClass_returnsStatic, ZEND_ACC_PUBLIC)
ZEND_ME(_ZendTestClass, returnsThrowable, arginfo_class__ZendTestClass_returnsThrowable, ZEND_ACC_PUBLIC)
ZEND_ME(_ZendTestClass, variadicTest, arginfo_class__ZendTestClass_variadicTest, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_FE_END
};

View File

@ -0,0 +1,44 @@
--TEST--
Verify that variadic arguments create proper stub
--EXTENSIONS--
zend_test
--FILE--
<?php
$reflection = new ReflectionMethod("_ZendTestClass", "variadicTest");
$arguments = $reflection->getParameters();
echo (string) $arguments[0], "\n";
var_dump($arguments[0]->isVariadic());
$type = $arguments[0]->getType();
var_dump($type instanceof ReflectionUnionType);
echo "\n";
$types = $type->getTypes();
var_dump($types[0]->getName());
var_dump($types[0] instanceof ReflectionNamedType);
var_dump($types[0]->allowsNull());
echo "\n";
var_dump($types[1]->getName());
var_dump($types[1] instanceof ReflectionNamedType);
var_dump($types[1]->allowsNull());
?>
--EXPECTF--
Parameter #0 [ <optional> Iterator|string ...$elements ]
bool(true)
bool(true)
string(8) "Iterator"
bool(true)
bool(false)
string(6) "string"
bool(true)
bool(false)