Skip to content

Commit 292a1ae

Browse files
committed
Support union types for args in gen stubs
Using this requires care! The zpp implementation for this union must be consistent with the arginfo implementation! Apart from array|object, this is probably only the case for int|float right now.
1 parent 0cec268 commit 292a1ae

File tree

4 files changed

+32
-42
lines changed

4 files changed

+32
-42
lines changed

Zend/zend_API.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ typedef struct _zend_fcall_info_cache {
109109
{ #name, ZEND_TYPE_INIT_CODE(IS_CALLABLE, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) },
110110
#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) \
111111
{ #name, ZEND_TYPE_INIT_CODE(type_hint, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) },
112+
#define ZEND_ARG_TYPE_MASK(pass_by_ref, name, type_mask) \
113+
{ #name, ZEND_TYPE_INIT_MASK(type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) },
112114
#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) \
113115
{ #name, ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(pass_by_ref, 1)) },
114116
#define ZEND_ARG_VARIADIC_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) \

ext/standard/basic_functions.stub.php

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -80,50 +80,32 @@ function uasort(array &$arg, callable $cmp_function): bool {}
8080

8181
function uksort(array &$arg, callable $cmp_function): bool {}
8282

83-
/**
84-
* @param array|object $arg
85-
* @return mixed
86-
*/
87-
function end(array &$arg) {}
83+
/** @return mixed */
84+
function end(array|object &$arg) {}
8885

89-
/**
90-
* @param array|object $arg
91-
* @return mixed
92-
*/
93-
function prev(&$arg) {}
86+
/** @return mixed */
87+
function prev(array|object &$arg) {}
9488

95-
/**
96-
* @param array|object $arg
97-
* @return mixed
98-
*/
99-
function next(&$arg) {}
89+
/** @return mixed */
90+
function next(array|object &$arg) {}
10091

101-
/**
102-
* @param array|object $arg
103-
* @return mixed
104-
*/
105-
function reset(&$arg) {}
92+
/** @return mixed */
93+
function reset(array|object &$arg) {}
10694

107-
/**
108-
* @param array|object $arg
109-
* @return mixed
110-
*/
111-
function current($arg) {}
95+
/** @return mixed */
96+
function current(array|object $arg) {}
11297

113-
/** @param array|object $arg */
114-
function key($arg): int|string|null {}
98+
function key(array|object $arg): int|string|null {}
11599

116100
/** @return mixed */
117101
function min($arg, ...$args) {}
118102

119103
/** @return mixed */
120104
function max($arg, ...$args) {}
121105

122-
/** @param array|object $input */
123-
function array_walk(&$input, callable $funcname, $userdata = null): bool {}
106+
function array_walk(array|object &$input, callable $funcname, $userdata = null): bool {}
124107

125-
/** @param array|object $input */
126-
function array_walk_recursive(&$input, callable $funcname, $userdata = null): bool {}
108+
function array_walk_recursive(array|object &$input, callable $funcname, $userdata = null): bool {}
127109

128110
function in_array($needle, array $haystack, bool $strict = false): bool {}
129111

ext/standard/basic_functions_arginfo.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,23 +107,21 @@ ZEND_END_ARG_INFO()
107107
#define arginfo_uksort arginfo_usort
108108

109109
ZEND_BEGIN_ARG_INFO_EX(arginfo_end, 0, 0, 1)
110-
ZEND_ARG_TYPE_INFO(1, arg, IS_ARRAY, 0)
110+
ZEND_ARG_TYPE_MASK(1, arg, MAY_BE_ARRAY|MAY_BE_OBJECT)
111111
ZEND_END_ARG_INFO()
112112

113-
ZEND_BEGIN_ARG_INFO_EX(arginfo_prev, 0, 0, 1)
114-
ZEND_ARG_INFO(1, arg)
115-
ZEND_END_ARG_INFO()
113+
#define arginfo_prev arginfo_end
116114

117-
#define arginfo_next arginfo_prev
115+
#define arginfo_next arginfo_end
118116

119-
#define arginfo_reset arginfo_prev
117+
#define arginfo_reset arginfo_end
120118

121119
ZEND_BEGIN_ARG_INFO_EX(arginfo_current, 0, 0, 1)
122-
ZEND_ARG_INFO(0, arg)
120+
ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT)
123121
ZEND_END_ARG_INFO()
124122

125123
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_key, 0, 1, MAY_BE_LONG|MAY_BE_STRING|MAY_BE_NULL)
126-
ZEND_ARG_INFO(0, arg)
124+
ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT)
127125
ZEND_END_ARG_INFO()
128126

129127
ZEND_BEGIN_ARG_INFO_EX(arginfo_min, 0, 0, 1)
@@ -134,7 +132,7 @@ ZEND_END_ARG_INFO()
134132
#define arginfo_max arginfo_min
135133

136134
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_walk, 0, 2, _IS_BOOL, 0)
137-
ZEND_ARG_INFO(1, input)
135+
ZEND_ARG_TYPE_MASK(1, input, MAY_BE_ARRAY|MAY_BE_OBJECT)
138136
ZEND_ARG_TYPE_INFO(0, funcname, IS_CALLABLE, 0)
139137
ZEND_ARG_INFO(0, userdata)
140138
ZEND_END_ARG_INFO()

scripts/dev/gen_stub.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,7 @@ function funcInfoToCode(FuncInfo $funcInfo): string {
532532
$argKind = $argInfo->isVariadic ? "ARG_VARIADIC" : "ARG";
533533
$argType = $argInfo->type;
534534
if ($argType !== null) {
535-
$simpleArgType = $argType->tryToSimpleType();
536-
if ($simpleArgType !== null) {
535+
if (null !== $simpleArgType = $argType->tryToSimpleType()) {
537536
if ($simpleArgType->isBuiltin) {
538537
$code .= sprintf(
539538
"\tZEND_%s_TYPE_INFO(%s, %s, %s, %d)\n",
@@ -547,6 +546,15 @@ function funcInfoToCode(FuncInfo $funcInfo): string {
547546
$simpleArgType->toEscapedName(), $argType->isNullable()
548547
);
549548
}
549+
} else if (null !== $representableType = $argType->tryToRepresentableType()) {
550+
if ($representableType->classType !== null) {
551+
throw new Exception('Unimplemented');
552+
}
553+
$code .= sprintf(
554+
"\tZEND_%s_TYPE_MASK(%s, %s, %s)\n",
555+
$argKind, $argInfo->getSendByString(), $argInfo->name,
556+
$representableType->toTypeMask()
557+
);
550558
} else {
551559
throw new Exception('Unimplemented');
552560
}

0 commit comments

Comments
 (0)