Skip to content

Merge train 218: shadowed inherited fields, new(X) shadowing, class-ctor arguments, variable-box release, native-base subclass prototypes and field init, Tier A binding removal (v0.5.1596) - #10652

Merged
proggeramlug merged 30 commits into
mainfrom
train218r
Sep 18, 2026

Conversation

@proggeramlug

@proggeramlug proggeramlug commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

This train lands 10 PRs as v0.5.1596. Each source commit is verified to preserve its patch-id and authorship.

This train's gap phase was re-run, because the first pass was vacuous

The first run reported unexplained_regressions={} having executed zero tests. All ten areas exited rc=2: this train validated in a newly-built second environment whose worktree had no node_modules, and the harness refused to run rather than misreport ERR_MODULE_NOT_FOUND as a Perry regression — the right call, and the reason the emptiness was recoverable rather than a false green that shipped.

The driver's liveness assertion did not catch it. It compared what a filter selected against what test_gap_* matching predicts and asserted ran <= gate_scope, which zero satisfies: the upper bound was guarded and the lower bound was not. That is the "gate runs, subject never did" shape, and it is now closed — the check requires rc != 2, ran > 0 and ran <= gate_scope, and counts DISTINCT test names rather than progress lines, because the harness can emit progress for more than one pass in a single invocation.

Both already-merged trains were checked rather than assumed: 216 and 217 each had zero vacuous areas, every area matching its gate scope exactly.

Validation

Validated head 90c8943bb5. Five-package release build pinned and hash-verified.

  • Crate suites: codegen · runtime 4057 (+2 known release-profile) · stdlib · hir · transform · cli.
  • Gap: 10 gate-scoped areas, every one selecting exactly its test_gap_* count — emitter 3/3, instanceof 13/13, arguments 7/7, prototype, timer 3/3, regex 11/11, replace 9/9, field 25/25, capture 13/13, fetch 9/9. No unexplained regressions.
  • lint was 4 of 83 on the first pass, not the usual 1. Three were real or environmental and are resolved: two unnecessary unsafe blocks in fix(hir,codegen,runtime): make arguments in class constructors reflect the call site #10612's test code failed -D warnings --all-targets (fixed here, and the runtime suite re-run at the fixed head), and Regenerate API docs / API docs drift fail only in a worktree whose target/ is not in-tree — a local artifact of this train's validation environment, not a repo-wide red. What remains is the known public-benchmark freshness step.

Two owner-approved compute trades

Both were measured by their authors in instructions and put to the owner with those numbers before merging.

PR cost why the baseline is invalid
#10612 +19.9% on construct-through-a-value where the ctor reads arguments (12.390B → 14.863B, 2M iters); +2.9% always-paid on dynamic construction the old branch never materialized arguments at all — that is the bug — and its output diverged from Node by 4000; the fix is byte-identical to Node
#10615 +22.3% (5M ctor + 5M static calls) and +24.8% (10M method calls, var captured from a function-nested class) the baseline silently dropped or misdirected the write-back the fix now performs through the shared mutable cell

Off the affected paths both measure as noise (−0.04% closure-heavy, +0.05% compile time). Tracked as #10594, #10602, #10616.

Pin provenance

The gap phase ran against artifacts pinned at ae084402f2; the head then moved by exactly two lines, both inside #[cfg(test)] mod constructor_arg_slot_tests (verified by brace walk to span 1434→EOF), which the release build excludes. A rebuild at the new head hashes differently for perry/libperry_runtime.a/libperry_stdlib.a while libperry_ext_net.a and libperry_ui_macos.a match — the three that moved are exactly the crates built from perry-runtime source, and the only source delta is test-gated, so this is Rust build non-reproducibility at codegen-units=16 rather than a content change.

Issues closed by this train

A merge train closes its source PRs rather than merging them, so the Fixes #N keywords in those PR bodies never evaluate. They are carried here, on the PR that actually merges, so they fire:

Fixes #10595
Fixes #10589
Fixes #10484
Fixes #10464
Fixes #10599
Fixes #10485
Fixes #10489
Fixes #10443
Fixes #10446

Summary by CodeRabbit

  • Bug Fixes

    • Corrected class constructor arguments behavior, inherited field shadowing, captured class variables, native subclass prototype identity, and field initialization for built-in error subclasses.
    • Map and Set operations on invalid receivers now throw catchable TypeErrors instead of crashing.
    • Imported constructors with names matching built-ins now resolve correctly.
  • Performance

    • Improved String.prototype.replace callback performance.
    • Reduced garbage-collection overhead for captured variables.
  • Breaking Changes

    • Removed bare fetch, tursodb, and iroh native bindings.
  • Chores

    • Updated the release version to 0.5.1596.

Ralph Küpper and others added 30 commits September 18, 2026 16:34
A regex replace with a function replacement built a fresh JS array per match to
carry the callback's arguments: `js_array_alloc(0)`, then a push per argument
that reallocated as it grew, each push opening a handle scope and a caught
frame. `call` then read the whole array straight back out into native slots and
dropped it. No user code could observe it -- except through a proxy replacer,
whose `apply` trap does receive the arguments as an array.

The slots `call` builds are already GC roots: it binds each one to the shadow
stack before invoking the replacer. Binding them first and writing the arguments
into them afterwards removes the array entirely. A value is rooted from the
moment it is written, so producing the next argument may allocate and collect,
which is what copying a match's capture strings does. The buffer is sized once
from the program's capture count and reused across matches. A proxy replacer
keeps the array path.

Instructions per workload, control subtracted, same commit, release build, over
1.1-1.5M character subjects with ~200,000 matches each:

  replace with callback, ASCII     70,896,578,215 -> 51,624,603,466   -27.2%
  replace with callback, Unicode   79,956,564,097 -> 61,666,635,190   -22.9%
  replace with a string template   28,421,246,293 -> 28,429,203,739    +0.0%

That is 30.3x -> 22.1x Node 26.5.1 on the ASCII row and 21.1x -> 16.3x on the
Unicode one. The template row is the control: it does not take this path and
does not move.

A profile attributes the saving. Before, the callback path spent 40% of its
instructions in the collector and 11.7% in JS array operations against a
template path that spent ~0% in array operations; the regex engine did the same
work in both (8.2B vs 7.3B instructions), which is what says the difference is
host machinery rather than matching.

`tests.rs` gains a regression test with a measured reason to exist: with the
reset of the reused buffer removed, the whole 3,984-test lib suite still
passed, and `(a)|(b)` over "aba" -- where each match leaves a capture unset that
the previous match set -- returns `<a,undefined><a,b><a,b>` instead of
`<a,undefined><undefined,b><a,undefined>`. The test asserts it reached the
direct path, so it cannot quietly pass against the exec-object fallback.
…slot

An overridden field (`class Sub extends Base { tag = ... }` where `Base`
also declares `tag`) is not deduplicated in the packed inline-slot layout:
the object holds one slot per declaration, ancestor first. The
compile-time-typed read path already resolves to the most-derived slot
("TS shadowing"); every dynamic by-name lookup returned the first
(ancestor's, never-written) slot instead -- observable from an inherited
accessor's `this.field`, a computed `obj[key]` read, and Reflect/has-own
checks.
…d function ctor

lower_new_impl_inner called lower_builtin_new for any class_name absent from
ctx.classes before checking import_function_prefixes. Imported classes
already land in ctx.classes and skip the builtin block; an imported plain
function constructor (Headers, EventEmitter-shaped, ...) never does, so any
unconditional builtin arm (not gated by required_sources) fired regardless
of whether the callee was a bare identifier or wrapped in (X as any) --
peel_new_callee strips that cast before lower_new branches on callee shape.
…(X as any)()

Gap test: Headers/EventEmitter/Stream x function/class declaration x
named/default import x plain-new/cast-new, plus a local-alias control that
already worked. Property-based discriminators, not instanceof -- #10477
(imported non-class instanceof) is not yet fixed on this base and would
conflate the two bugs.

Unit tests: direct Expr::New harness asserting js_new_function_construct
fires (not the builtin arm) once a name resolves to an imported function
constructor, the builtin still fires when unshadowed, a V8-fallback import
of the same name still falls to the builtin, and an imported CLASS of the
same name already shadowed the builtin before this fix (regression guard).
…#10362)

The registry holding an explicit [[Prototype]] for a non-meta-capable owner
was gated only by OBJECT_PROTOTYPES_NONEMPTY, a process-global latch. One
re-prototyped object anywhere armed it for the rest of the run, after which
every traced owner-capable cell paid a lock plus a SipHash probe to ask a
question that is false for almost all of them. A latch is a cliff: it turns
the fast path off for every cell at once, invisibly to any benchmark that
does not contain the trigger.

Bit 6 of _reserved is OBJ_FLAG_NULL_PROTO, which has exactly one setter
(returning *mut ObjectHeader) and seven readers, every one provably
unreachable with a non-GC_TYPE_OBJECT cell: three by an explicit obj_type
check, three by a converter that returns None first, one by a preceding
conjunct in the same && chain. The registry excludes GC_TYPE_OBJECT by
construction, so the bit is free across the registry's whole population, not
only for arrays -- which is why both existing witnesses exercise it, one of
them a lazy array that an array-scoped bit would have missed.

GC_RESIDUAL_PROTO_OWNER is set at the single funnel, under the registry lock
and before the insert: the proof is published before the fact it guards. It is
never cleared, and that is sound. Entries outlive owners only when the owner is
dead; the prune touches only dead owners; both rekey paths keep the entry while
_reserved rides the move (#10381's contract, enforced by
assert_relocation_copied_the_header). One writer under one lock writes both, so
the dangerous direction -- entry present, bit absent -- has no producer. A
GC_TYPE_OBJECT owner that reaches the registry anyway keeps the latch-only
gate, since bit 6 means something else there.

The latch stays as the first test -- one byte load, false for any process that
never re-prototyped a non-object -- and the bit is the second, which is what
stops an ARMED process paying per traced cell.

Sabotage: with the setter made a process-wide no-op, both existing witnesses in
gc/tests/residual_prototype_relocation.rs fail at their real verdicts, the
registry entry no longer following the lazy header nor the array owner. The bit
is load-bearing, not decorative.

Measured on main 9df5075, exact instruction counts: the fixture that arms the
latch -0.408%, and three that do not are flat (+0.015%, -0.060%, -0.021%).
Attributed: -94.3M RandomState::hash_one, -58.2M SipHash write, -36.9M
run_copied_minor_attempt, -30.0M transfer_residual_prototype.
pointer_slots_read is identical between arms: the collector does bit-identical
work.
…ect the call site

HIR stops padding a new-site's argument list to the declared arity for a
constructor that reads `arguments` (`monomorph/defaults.rs`) -- an appended
`undefined` was indistinguishable from one the caller wrote.

Runtime: the four dynamic-construct paths (super-apply caps arm, flat-ctor
replay, and both class-object/registered-class replay paths) now share
`constructor_user_arg_slots`, which packs the synthesized `arguments` slot
from every call arg instead of binding it like a user `...rest` (only the
args past the declared count) -- construction through a value, an imported
class, or a CommonJS class all saw an empty `arguments` before this.

Codegen: constructor ABI (`CtorAbi`: param count, has-rest, has-synthetic-
arguments) is read from the constructor's fixed/rest/arguments layout
instead of inspecting only its last declared parameter, which missed every
capturing constructor -- i.e. every CommonJS class, since Perry adds capture
params mechanically. The ABI threads through constructor-contract
resolution (so a no-own-ctor forwarder inherits its ancestor's full ABI),
imported-class metadata, and cross-module `new`-site arg marshaling, which
can now pack up to two trailing arrays (a user rest, then `arguments`)
instead of assuming at most one.
A let/var a closure captures and something reassigns lives in a malloc-side
box cell, and every registered cell is a strong GC root (scan_box_roots_mut).
Only the async-to-generator transform's terminal Stmt::ReleaseBoxes ever
released one (#7933/#8208/#8303); an ordinary function, method, arrow,
generator, or an async function with no await leaked one registered root
per boxed binding per call, plus everything that binding last pointed at.

Codegen registers every entry slot holding a cell this frame minted
(stmt/boxed_frame_release.rs, new) and the existing return-site rewrite
that already injects js_shadow_frame_pop now also emits js_box_scope_release
before every ret; a declaration inside a loop releases the previous
iteration's cell before minting the next.

Runtime (box/scope_release.rs, new): a cell no closure captured publishes
immediately; a captured cell is marked frame-released in its capture-edge
record and published only when its last capture edge dies via the existing
dead-owner pruning -- the same escape contract #8303 built for async
activations. Two holders the runtime cannot count keep their cells instead
of double-releasing: a sloppy-mode mapped arguments object, and a
plain-async step closure's own activation cells; a step closure's capture
of an enclosing frame's cell is now counted, since the activation token
never covered it.

Fixes a latent GC hole shared with #8303 in the same commit: a full trace
that stops rooting a released cell must still keep it in BOX_YOUNG_ROOTS
while young, because a minor walks only that log -- dropping it left the
next minor with no root for a payload a live closure still reads.
…in prototype

class Sub extends EventEmitter {} left Sub.prototype's [[Prototype]] on
Object.prototype instead of EventEmitter.prototype. class_decl_prototype_value
resolves a registered parent class id by recursing into itself, which bails
for a RESERVED native-builtin parent id (builtin_parent_reserved_class_id in
perry-codegen wires this edge for a native base with no declared-class
registration), silently falling through to the Object.prototype default.

Resolve EventEmitter/EventEmitterAsyncResource's real, closure-identity-keyed
prototype object through the same js_function_prototype_value_for_read path
the existing runtime-function-valued-parent branch already uses, so
Object.getPrototypeOf(Sub.prototype) === EventEmitter.prototype holds by
identity. Fixes #10599.
…s-parent id

builtin_parent_reserved_class_id (perry-codegen) already gained an
"EventEmitter" => 0xFFFF0076 entry (#10592), but not its AsyncResource
variant: class Sub extends EventEmitterAsyncResource {} left
get_parent_class_id(Sub) unresolved entirely (no parent-edge call is ever
emitted), so the perry-runtime getPrototypeOf-identity fallback for
reserved native-builtin parents (#10599) never runs for it -- the same gap
#10592 closed for plain EventEmitter, one id over.
Covers: direct subclass with field+ctor, fieldless no-ctor subclass,
two-level (indirect) subclass, unnamed and named-via-indirection class
expressions, EventEmitterAsyncResource, in/for-in walking the same chain,
own-enumeration non-regression, dispatch still works, an
instanceof-still-holds control (guards #10592), and a class-extends-Array
control (dedicated ArrayHeader path, unaffected by this fix).

Verified: fails on the runtime fix alone (state.rs reverted, standalone)
with every getPrototypeOf/instanceof/`in` assertion false where Node says
true; passes with both the runtime fix and both codegen table entries.

Two pre-existing, unrelated gaps hit while writing this were deliberately
left uncovered (documented inline, not fixed here):
EventEmitterAsyncResource.prototype's own [[Prototype]] does not chain to
EventEmitter.prototype (a native-to-native link, not a user `extends`
subclass), and Object.keys(new Sub()) leaks EventEmitter's prototype
methods as literal own enumerable instance properties instead of Node's
real _events/_eventsCount/_maxListeners own fields (CLAUDE.md "Native
base-class subclassing -- a native base's surface is installed at
super() time"). Both reproduce identically with the fix reverted, so
neither is caused by it.
Class members nested in a function or CommonJS module body captured
enclosing var/let bindings by value snapshot instead of by reference: a
method saw the value the var had at class-declaration time, and writes
from constructors/static methods to a captured var were silently lost.

The desugar_shared_mutable_captures pass (#5951's box-sharing machinery)
decided whether a captured id was safe to box by counting Let
declarations per LocalId and requiring exactly one; a var is declared
twice in HIR (a body-entry predefine slot, then the declaration
statement itself), so every var capture was rejected as ambiguous and
fell back to the stale value-snapshot path. Two functions that each
declared a same-named var plus a same-named class could also collide.

Replace the declaration counter with a DeclCensus/CensusWalker that
walks a region in execution order and asks whether an id denotes ONE
binding (a single declaration, or several redeclarations in the same
closure scope under the same name where the first dominates) rather
than requiring literally one declaration. Redeclarations of an
already-captured id are demoted so the box, not a fresh local, is
written. Captured cells now propagate to nested classes explicitly.

Fixes #10485
Fixes #10489
… typed Map/Set receivers

- #10443: a class whose direct parent is a built-in Error type (or any
  non-user base) never ran its own field initializers when it had its
  own super()-calling constructor; the Error arm of this_super_call.rs
  was the one arm that skipped applying them.
- #10446: .add/.set/.get/... on a statically-typed Set/Map receiver
  lowered straight to js_set_*/js_map_* with no tag check, so an
  undefined/null/primitive receiver dereferenced its unboxed payload
  and segfaulted instead of throwing a catchable TypeError.
Removes the bare-name node-fetch alias binding and the vestigial
in-tree accounting for the tursodb/iroh native bindings, whose actual
implementations already moved to @perryts/tursodb and @perryts/iroh
in v0.5.557. See changelog fragment for details.
Fetch's manifest entries stay (internal dispatch tag for the built-in
Web Fetch API), so mark it in the test-only INTERNAL_MODULE_KEYS
allowlist now that it is no longer a NATIVE_MODULES import specifier.
@proggeramlug
proggeramlug merged commit 6092204 into main Sep 18, 2026
23 of 25 checks passed
@proggeramlug
proggeramlug deleted the train218r branch September 18, 2026 17:56
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: e02295a5-8982-47ef-929e-31d33cc5a57e

📥 Commits

Reviewing files that changed from the base of the PR and between 68a5454 and 90c8943.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (129)
  • CLAUDE.md
  • Cargo.toml
  • changelog.d/10605-replacer-native-args.md
  • changelog.d/10607-shadowed-field-most-derived-slot.md
  • changelog.d/10608-new-cast-builtin-shadow.md
  • changelog.d/10611-residual-proto-owner-bit.md
  • changelog.d/10612-class-ctor-arguments.md
  • changelog.d/10613-box-cell-release.md
  • changelog.d/10614-eventemitter-prototype-identity.md
  • changelog.d/10615-class-member-var-captures.md
  • changelog.d/10617-field-init-collection-receiver-guard.md
  • changelog.d/10618-tier-a-native-binding-removal.md
  • crates/perry-api-manifest/src/entries.rs
  • crates/perry-api-manifest/src/entries/part_1.rs
  • crates/perry-codegen/src/codegen/arguments.rs
  • crates/perry-codegen/src/codegen/closure.rs
  • crates/perry-codegen/src/codegen/constructor_contracts.rs
  • crates/perry-codegen/src/codegen/ctor_arity.rs
  • crates/perry-codegen/src/codegen/function.rs
  • crates/perry-codegen/src/codegen/method.rs
  • crates/perry-codegen/src/codegen/method_static.rs
  • crates/perry-codegen/src/codegen/mod.rs
  • crates/perry-codegen/src/codegen/opts.rs
  • crates/perry-codegen/src/codegen/string_pool.rs
  • crates/perry-codegen/src/expr/arrays_finds.rs
  • crates/perry-codegen/src/expr/bigint_set.rs
  • crates/perry-codegen/src/expr/closure.rs
  • crates/perry-codegen/src/expr/collection_receiver.rs
  • crates/perry-codegen/src/expr/instance_misc1.rs
  • crates/perry-codegen/src/expr/logical_collections.rs
  • crates/perry-codegen/src/expr/math_simple.rs
  • crates/perry-codegen/src/expr/mod.rs
  • crates/perry-codegen/src/expr/property_get.rs
  • crates/perry-codegen/src/expr/readonly_collection_tests.rs
  • crates/perry-codegen/src/expr/string_regex_proc.rs
  • crates/perry-codegen/src/expr/this_super_call.rs
  • crates/perry-codegen/src/function.rs
  • crates/perry-codegen/src/gc_call_effects.rs
  • crates/perry-codegen/src/lib.rs
  • crates/perry-codegen/src/lower_call/field_init.rs
  • crates/perry-codegen/src/lower_call/mod.rs
  • crates/perry-codegen/src/lower_call/new.rs
  • crates/perry-codegen/src/lower_call/new_builtin_shadow_tests.rs
  • crates/perry-codegen/src/lower_call/new_ctor_args.rs
  • crates/perry-codegen/src/lower_call/property_get/map_set.rs
  • crates/perry-codegen/src/lower_call/typed_shape_bake_tests.rs
  • crates/perry-codegen/src/runtime_decls/strings.rs
  • crates/perry-codegen/src/stmt/boxed_frame_release.rs
  • crates/perry-codegen/src/stmt/boxed_frame_release_tests.rs
  • crates/perry-codegen/src/stmt/boxed_local_init.rs
  • crates/perry-codegen/src/stmt/let_stmt.rs
  • crates/perry-codegen/src/stmt/mod.rs
  • crates/perry-codegen/tests/error_subclass_field_init.rs
  • crates/perry-codegen/tests/typed_collection_receiver_guard.rs
  • crates/perry-hir/src/destructuring/var_decl.rs
  • crates/perry-hir/src/lower/context.rs
  • crates/perry-hir/src/lower/expr_assign.rs
  • crates/perry-hir/src/lower/expr_member.rs
  • crates/perry-hir/src/lower/expr_new.rs
  • crates/perry-hir/src/lower/lower_expr/arm_class.rs
  • crates/perry-hir/src/lower/lowering_context.rs
  • crates/perry-hir/src/lower/shared_mutable_capture.rs
  • crates/perry-hir/src/lower/stmt.rs
  • crates/perry-hir/src/lower/tests.rs
  • crates/perry-hir/src/lower/tests/class_member_var_captures.rs
  • crates/perry-hir/src/monomorph/defaults.rs
  • crates/perry-hir/src/monomorph/tests.rs
  • crates/perry-hir/tests/unimplemented_api_check.rs
  • crates/perry-runtime/src/box.rs
  • crates/perry-runtime/src/box/scope_release.rs
  • crates/perry-runtime/src/closure/box_captures.rs
  • crates/perry-runtime/src/closure/mod.rs
  • crates/perry-runtime/src/collection_receiver.rs
  • crates/perry-runtime/src/gc/layout/transfer.rs
  • crates/perry-runtime/src/gc/layout_slot_visit.rs
  • crates/perry-runtime/src/gc/tests/residual_prototype_relocation.rs
  • crates/perry-runtime/src/gc/types.rs
  • crates/perry-runtime/src/lib.rs
  • crates/perry-runtime/src/object/class_constructors.rs
  • crates/perry-runtime/src/object/class_registry/state.rs
  • crates/perry-runtime/src/object/field_get_set/ic_miss.rs
  • crates/perry-runtime/src/object/keys_lookup.rs
  • crates/perry-runtime/src/object/prototype_chain.rs
  • crates/perry-runtime/src/object/shapes.rs
  • crates/perry-runtime/src/object/shapes_tests.rs
  • crates/perry-runtime/src/regex/perex_replace_direct.rs
  • crates/perry-runtime/src/regex/perex_replace_storage.rs
  • crates/perry-runtime/src/regex/tests.rs
  • crates/perry/src/commands/compile/object_cache.rs
  • crates/perry/src/commands/compile/object_cache/object_cache_tests.rs
  • crates/perry/src/commands/compile/optimized_libs/freshness.rs
  • crates/perry/src/commands/compile/run_pipeline.rs
  • crates/perry/src/commands/stdlib_features.rs
  • crates/perry/well_known_bindings.toml
  • docs/api/perry.d.ts
  • docs/src/api/reference.md
  • docs/src/native-libraries/governance.md
  • scripts/addr_class_allowlist.txt
  • scripts/check_file_size.sh
  • scripts/gc_root_dominance_check.py
  • test-files/_helpers/class_member_var_captures_10485.cjs
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_emitter_class_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_emitter_class_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_emitter_fn_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_emitter_fn_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_headers_class_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_headers_class_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_headers_fn_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_headers_fn_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_stream_class_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_stream_class_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_stream_fn_default.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/d_stream_fn_named.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/emitter_class_lib.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/emitter_fn_lib.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/headers_class_lib.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/headers_fn_lib.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/stream_class_lib.ts
  • test-files/_helpers/new_cast_builtin_shadow_10589/stream_fn_lib.ts
  • test-files/fixtures/issue_10484_ctor_arguments/classes.ts
  • test-files/fixtures/issue_10484_ctor_arguments/request.cjs
  • test-files/test_gap_10443_error_subclass_field_init.ts
  • test-files/test_gap_10446_typed_collection_receiver.ts
  • test-files/test_gap_10464_box_cell_release.ts
  • test-files/test_gap_10484_class_constructor_arguments.ts
  • test-files/test_gap_10485_class_member_var_captures.ts
  • test-files/test_gap_10589_new_cast_builtin_shadow.ts
  • test-files/test_gap_10595_inherited_accessor_field_shape.ts
  • test-files/test_gap_10599_eventemitter_prototype_identity.ts
 _______________________________________________________________________________________
< Analyze workflow to improve concurrency. Exploit concurrency in your user's workflow. >
 ---------------------------------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to 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.

Class methods nested in a function or CommonJS module see a stale snapshot of enclosing vars assigned after the class (TypeScript var _a; … _a = X emit) arguments in a class constructor is empty when the class is constructed through a value, and padded to the declared parameter count on a static new Box cells for mutable closure captures are never released outside async state machines: every call leaks a registered GC root plus everything the captured variable points to Calling a method on a Set/Map-typed value that holds undefined crashes with SIGSEGV instead of throwing a catchable TypeError Field initializers never run for a class that extends Error/TypeError/… directly and has its own constructor (fields stay undefined; mongodb segfaults on connect)

1 participant