You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 08e3736
Browse filesBrowse the repository at this point in the historyBrowse files
Pin the closure node in ClosureTypeResolver's object-id keyed cache
PHP hands out the spl_object_id() of a freed object again. The parsed file's
nodes live for its whole analysis, but a closure node that is built or parsed
and dropped mid-file - by a handler desugaring a call, or by an extension or
a test walking its own nodes through NodeScopeResolver - frees its id, and
the next closure allocated may get it. With an equal context key the cache
then answered the freed node's types for an unrelated closure: that is what
flaked ExpressionResultTest's `(fn() => exit())();` on the 7.4 and 8.0 jobs,
where an earlier data set's `fn() => yield (exit());` left a
Generator<int, never, mixed, void> return type behind and the immediately
invoked arrow function read it before walking its own body.
Each entry now pins the node it was built for and answers for that very
node only.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKj5Zgji9eL5MoSuaTEJxF
0 commit comments