mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Merge branch 'PHP-8.1' into PHP-8.2
This commit is contained in:
commit
a45bef0ac6
@ -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) \
|
||||
|
@ -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(
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
8
ext/zend_test/test_arginfo.h
generated
8
ext/zend_test/test_arginfo.h
generated
@ -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
|
||||
};
|
||||
|
||||
|
44
ext/zend_test/tests/variadic_arguments.phpt
Normal file
44
ext/zend_test/tests/variadic_arguments.phpt
Normal 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)
|
Loading…
Reference in New Issue
Block a user