Skip to content

Fix callable handling and local object reassignment in compiler - #93

Open
Tinywan wants to merge 2 commits into
swoole:masterfrom
Tinywan:fix/first-class-callable-and-inferred-object
Open

Fix callable handling and local object reassignment in compiler#93
Tinywan wants to merge 2 commits into
swoole:masterfrom
Tinywan:fix/first-class-callable-and-inferred-object

Conversation

@Tinywan

Copy link
Copy Markdown

No description provided.

Tinywan added 2 commits September 6, 2026 21:13
PHP 8.1 `foo(...)` builds a Closure from a single VariadicPlaceholder
argument instead of calling foo. Two paths mishandled it:
- checkInternalFunctionArgCount() counted the placeholder as a real
argument, so first-class callables of internal functions requiring 2+
parameters (e.g. `posix_kill(...)`) failed with a bogus "expects at
least N arguments, 1 given".
- The math-function return-type optimization read `$expr->args[0]->value`
on callables such as `round(...)`, crashing on the undefined
VariadicPlaceholder::$value property.
Guard both with isFirstClassCallable() so the expression falls through to
Closure (Type::OBJECT) resolution.
A local variable has no type declaration; its class is inferred from the
first assignment. Re-assigning an unrelated concrete class in a mutually
exclusive branch (e.g. ReflectionFunction in `if` and ReflectionMethod in
`else`) is valid PHP, but was rejected with "Cannot re-assign typed object".
Route both re-assignment sites through reassignInferredObjectVar(), which
widens an inferred local to a generic dynamic object. Parameters, native
objects, and explicitly declared object types keep the strict check.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Tinywan