Skip to content

Four fixes found bringing a real Hono/drizzle service up under Perry (#8930, #8962, #8968, #9289) - #9311

Closed
proggeramlug wants to merge 4 commits into
mainfrom
mb24/perry-fixes
Closed

Four fixes found bringing a real Hono/drizzle service up under Perry (#8930, #8962, #8968, #9289)#9311
proggeramlug wants to merge 4 commits into
mainfrom
mb24/perry-fixes

Conversation

@proggeramlug

Copy link
Copy Markdown
Contributor

Four independent fixes, each with regression tests, found while taking a real TypeScript service (Hono + drizzle + mysql2 + zod + Stripe) from perry compile to a running binary. Every one was discovered by something failing at runtime, not by reading code.

Each commit stands alone and can be reviewed — or reverted — separately.


980b9f267#8962: an imported class installs its private brand twice

+334 / 3 files (284 of them tests)

new Hono()  →  TypeError: Cannot initialize private elements twice on the same object

Minimal trigger, much smaller than the hono case suggested — no inheritance involved:

// base.ts
export class BaseX { #m() { return 1; } call() { return this.#m(); } }
// main.ts
import { BaseX } from "./base";
new BaseX().call();     // throws

Two conditions, both necessary: the class declares a private method or accessor (a private field alone never triggers it), and it is constructed from a different module than the one declaring it. Every single-module shape works, which is why this cannot be reproduced by hand in one file.

Cause: the imported-class stub flattens fields to is_private: false but copies private method names verbatim (it needs them to resolve dispatch symbols), and has_private_instance_brand() is defined purely over #-prefixed method/accessor names. So the stub answers true, and the importing module emits js_private_brand_add at its new on top of the one the defining module's constructor already emits. Harmless for fields — an undefined write the real constructor overwrites — and fatal for the non-idempotent brand.

Fix: Class::is_imported_stub(), and one .filter() in the private-element lookup. Two guard tests pin the boundaries: same-module construction still installs at the new site, and a genuine double-init still throws.


ace855bd6#8930: ELF archive block needs grouping

+136 / 3 files

undefined reference to `<futures_channel::mpsc::SenderTask>::notify'

The obvious diagnosis is wrong. The wrappers are already emitted twice, before and after stdlib, so on paper every reference has somewhere to go. The ld map settles it: 364 stdlib members are pulled, then 92 ext members — the first ext listing pulls nothing at all, because the user objects reference only js_* symbols that stdlib provides. Every ext member arrives from the second listing, on references stdlib had just opened, and the references those members carry back into stdlib have nowhere to go, because ld scans each archive once.

Fix: bracket the archive block in --start-group/--end-group, gated to ELF targets.

Chosen over the codebase's usual "emit the archive twice" trick (which 8837fb7fb preferred for the GTK4 case, and which also fixes this — I tested it): a repeat only covers a one-step cycle, and this graph is LTO-partitioned across hundreds of CGUs in both directions, so the fixed-point semantics is the actual guarantee.

Verified as a no-op where linking already worked: a binary built with and without the group flags is byte-identical (cmp clean, same 232 dynamic symbols), and adds no measurable link time.


362a1a743#8968: private compound reads, and Response headers

+633 / −46, 19 files

Two defects that presented as one symptom: an unmatched hono route returned 200 with an empty body and a custom app.notFound() handler never ran.

A compound or logical assignment to a private member read the wrong slot. lower_assign_target_to_expr addressed the field by its source spelling (#x) while every other private access uses the mangled storage key. So the read missed, silently:

this.#n += 1     → NaN
this.#v ||= d    → ALWAYS stored d
this.#v &&= d    → NEVER stored

hono's Context memoizes as get res() { return this.#res ||= new Response(null, …) }, so every read of c.res discarded the finalized response — including the 404 the not-found handler had just produced. A matched route never reads c.res (the single-handler fast path returns the handler's response directly), which is exactly why only the miss path looked wrong.

c.text()/c.json()/c.html() also lost their Content-Type entirely, while a raw new Response(body, { headers }) kept it — so Response/Headers were fine and the Context path was not. Through @hono/node-server the missing content type became a missing body: c.json() endpoints answered Content-Length: 0.

Fix also replaced a thread-local Cell side channel (which could be clobbered by nested constructors, or hold stale state if initialization threw) with an explicit constructor ABI argument.


328d14814#9289: crypto.scrypt ignores every cost parameter

+405 / −73, 7 files · the security-relevant one

crypto.scrypt(password, salt, keylen, options) discarded the entire options object and always computed with node's defaults.

params node 26 perry (before)
N=2¹² 05f47c22… 33e39503…
N=2¹⁴ 33e39503… 33e39503…
N=2¹⁷ e5581239… 33e39503…
r=4 cd4b3b2d… 33e39503…

One constant digest for every input — node's N=2¹⁴/r=8/p=1 result. The KDF was correct; the options were dropped.

Why this is worse than a wrong answer: it is silent, and it survives an audit. A password hasher records its parameters beside the digest (scrypt$131072$8$1$…), so the database claims a cost that was never paid, and a needsRehash check keyed on those parameters never fires. A caller asking for the OWASP baseline N=2¹⁷ got N=2¹⁴ — an 8× weaker work factor. It also breaks cross-runtime verification: a hash made under node cannot be verified by the same code compiled with Perry, which is how it was found (an admin account created by a node provisioning script could not log in to the compiled API — node verify → true, binary says no).

Fix honours N/r/p/keylen/maxmem with node's aliases, enforces OpenSSL's exact 128 * r * (N + p + 2) boundary, and — the important part — throws instead of substituting defaults. All eight rows now match node byte-for-byte, including the maxmem RangeError.


Verification

Every fix was verified independently of the agent that wrote it, against real application code rather than only its own tests.

  • cargo test --release -p perry --bin perry: 1,052 passed
  • -p perry-codegen -p perry-hir -p perry-stdlib: green
  • cargo fmt --check, file-size check, git diff --check: clean
  • hono service compiles, links, starts, and serves correct status codes, bodies and content types
  • drizzle migrator compiles and applies 47 tables to a real MySQL 8
  • a scrypt hash written by the Perry binary verifies under node

Known pre-existing failure, unrelated: native_link_cache::native_compile_skips_link_on_identical_second_build — confirmed failing on the unpatched parent commit by stashing.

Not included

A fifth bug is still open and unfixed here: #9310 — every mysql2 prepared-statement parameter binds as NULL, which is silent data loss. That one is being worked separately; it is not addressed by this branch.

Ralph Küpper and others added 4 commits August 28, 2026 15:25
…twice (#8962)

`import { Hono } from "hono"; new Hono()` compiled and linked, then threw
`TypeError: Cannot initialize private elements twice on the same object`
during construction. It reduces to two files and no inheritance at all:

    // base.ts
    export class BaseX {
      #m(): number { return 1; }
      call(): number { return this.#m(); }
    }
    // main.ts
    import { BaseX } from "./base";
    new BaseX().call();

The importing module sees the class only as the metadata-only stub
`compile_module` synthesizes for an import (`codegen/mod.rs`, "Build a stub
Class with the minimum fields the codegen needs"). A stub is a name table: it
carries member names so dispatch symbols resolve, and carries no bodies, no
initializers and no constructor. Everything construction actually *does* is
baked into the defining module's standalone `<prefix>__<class>_constructor`
instead — `codegen/method.rs` says so where it emits them, "At the `new
ImportedClass(...)` call site, `lower_new` applies initializers against the
imported class stub — which has none".

That premise held for FIELDS, because the stub flattens every field to
`is_private: false` with `init: None`: the worst `apply_field_initializers_
recursive` could do at the `new` site was write `undefined` into a slot the
real constructor overwrote moments later. It did not hold for the private
BRAND. The stub copies private METHOD and accessor names verbatim, and
`has_private_instance_brand` is defined purely over `#`-prefixed member names,
so a stub answered `true` and the `new` site emitted `js_private_brand_add` on
top of the one the defining module's constructor emits. Installing a class's
brand twice on one object is the error PrivateMethodOrAccessorAdd requires, so
the runtime threw — correctly, at the second install.

Fix: `apply_field_initializers_recursive` skips the private-element decision
for a chain entry that is an imported stub. The duplicate check itself is
untouched: exactly one `js_private_brand_add` survives, in the defining
module's constructor (verified with objdump — the importing module's object
now has none, the defining module's still has one).

Reached both spellings: the class constructed directly (`new BaseX()`), and
the class reached as an ANCESTOR through the `AncestorsOnly` walk, where the
leaf is a local subclass. hono hits the second — `class Hono extends HonoBase`
with `#path`, `#notFoundHandler`, `#clone`, `#addRoute`, `#dispatch` on the
base. Only classes with a private method or accessor were affected; a private
field alone never was, since the stub does not mark fields private.

Tests: `crates/perry/tests/issue_8962_imported_class_private_brand.rs`. Every
case calls the private member after constructing, so a fix that dropped the
second install without leaving the first standing fails them too — the brand
check throws when no brand is present. Two guard cases pin the boundaries:
same-module construction still installs the brand at the `new` site, and a
genuine double initialization (a base ctor returning an object the derived
class already branded) still throws.

Verified: `new Hono()` runs (routing, `route()`, `basePath()`, `fetch`);
`cargo test -p perry --bin perry` 1049/1049; `cargo test -p perry-hir
-p perry-codegen` all green; mb24's `packages/db/src/migrate.ts` still
compiles.

Claude-Session: https://claude.ai/code/session_0145yUtx1jiWHf66QEZh6DzY
…dlib (#8930)

A `bundled-streams` build died with `undefined reference to
<futures_channel::mpsc::SenderTask>::notify` out of `libperry_ext_http.a`,
even though the `libperry_stdlib.a` on the same command line exports that
symbol from its own `futures_channel` member.

The mechanism is archive order, but not the obvious one. The wrapper archives
already appear twice — once before perry-stdlib, once after — so at a glance
every reference has somewhere to go. What the #8930 link map shows is that the
FIRST listing pulls nothing at all: the user objects reference only `js_*`
symbols that perry-stdlib provides, so nothing in the wrapper is undefined yet
when `ld` walks it. All 92 wrapper members that end up in the executable are
pulled from the SECOND listing, on references that stdlib's own members had
just opened (`js_node_http_*`, …) — and the references those members carry
back INTO stdlib have nowhere to go, because GNU `ld` scans each archive once
and never revisits one it has passed.

That was harmless while each wrapper bundled its own copy of everything it
closed over. It becomes a hard error the moment
`strip_bundled_shared_deps_from_well_known_lib` drops a bundled member because
stdlib provides it — a correct decision by the archive index, but one that
only holds if `ld` can still get back to stdlib. That is what `bundled-streams`
changes: it is the feature (enabled by a `fs/promises` or `stream/web` import,
per `stdlib_features::module_to_features`) that pulls futures_channel into
perry-stdlib's own graph, so stdlib starts bundling a name-matching
`futures_channel-*.rcgu.o`, so the wrapper's copy becomes eligible to drop. A
stdlib built without it carries no futures_channel member at all, the wrapper
keeps its copy, and the link stays self-contained. #8939 tightened the pruning
rule to the name-matched stdlib member's own exports; here that member does
export the symbol, so the rule fires correctly and the link still fails. The
bug is on the link line, not in the pruning.

Wrap the perry archive block in `-Wl,--start-group` / `-Wl,--end-group` on ELF
targets so `ld` re-scans it to a fixed point — the guarantee a mutually
recursive archive set needs. Repeating one archive (the codebase's usual
"archive twice" trick) only covers a one-step cycle, and this graph is
LTO-partitioned across hundreds of codegen units on both sides. Members are
still pulled left to right, so the wrappers-before-stdlib and
localized-runtime-last first-definition-wins ordering is unaffected; Mach-O
`ld64` resolves archives to a fixed point already (and rejects the flag) and
`lld-link` / MSVC have no group concept, so both are left alone.

Verified against both reported repros in mb24 — `apps/landing` (hono plus a
compiled `@skelpo/cms-client`) and `apps/api` (hono + ws + mysql2, four
wrapper archives, no `perry.compilePackages` at all). Both fail before and
link after; replaying either final link line with only the two group flags
removed reproduces the exact undefined reference. A case that already linked
(`packages/db/src/migrate.ts`) produces a byte-identical executable with and
without the flags. The link/strip-dedup unit tests pass (68), as do the two
archive-ordering integration tests —
`issue_5920_wrapper_bundled_runtime_async_starvation` (the two-runtime-copies
hazard) and `issue_6715_native_wrapper_precedence`. `native_link_cache` fails
identically on the unpatched parent commit.
Lower the read half of private compound assignments through the class-mangled storage key and the normal private brand guard. Parse dynamic HeadersInit values in Response constructors and carry string-body metadata explicitly through the Response ABI so default content types survive without mutable side-channel state.
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 768 files, which is 468 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1df49270-b178-4a54-a69e-699cca19c439

📥 Commits

Reviewing files that changed from the base of the PR and between fe32b38 and 328d148.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (768)
  • .claude/skills/port-npm-to-perry/SKILL.md
  • .github/workflows/release-packages.yml
  • .github/workflows/simctl-tests.yml
  • .github/workflows/test.yml
  • CONTRIBUTING.md
  • README.md
  • benchmarks/bench_dynamic_property_keys.ts
  • benchmarks/bench_shared_shape_delete.ts
  • benchmarks/compiler_output/workloads.toml
  • benchmarks/honest_bench/harness/run_bench.sh
  • benchmarks/honest_bench/scripts/report.py
  • benchmarks/polyglot/bench.rs
  • changelog.d/8291-node-version-26.5.1.md
  • changelog.d/8944-inline-array-pop-tier.md
  • changelog.d/8947-inline-method-shape-probe.md
  • changelog.d/8952-sso-computed-keys-write-stub.md
  • changelog.d/8964-inline-hot-tls.md
  • changelog.d/8970-private-member-name-fast-reject.md
  • changelog.d/8971-key-scan-kills-read-lane.md
  • changelog.d/8972-array-subclass-fill-args.md
  • changelog.d/8974-array-subclass-elements-default.md
  • changelog.d/8975-single-shape-lookup-per-ic-hit.md
  • changelog.d/8976-elements-loop-guard-kind.md
  • changelog.d/8977-write-stub-two-way.md
  • changelog.d/8979-run-directory-entry.md
  • changelog.d/8980-private-guard-call-site.md
  • changelog.d/8981-dynamic-function-refusal-unwind.md
  • changelog.d/8982-hono-response-state.md
  • changelog.d/8983-feedback-gate-and-shape-field.md
  • changelog.d/8984-private-field-updates.md
  • changelog.d/8985-elements-lean-push-pop.md
  • changelog.d/8986-imported-private-brands.md
  • changelog.d/8987-array-subclass-enumeration.md
  • changelog.d/8988-read-stub-cache.md
  • changelog.d/8989-regex-literal-unicode-whitespace.md
  • changelog.d/8990-url-search-params-header-probe.md
  • changelog.d/8991-plain-collection-iterator.md
  • changelog.d/8992-node-api-entry-verification.md
  • changelog.d/8993-set-delete-index-repair.md
  • changelog.d/8994-namespace-erased-names.md
  • changelog.d/8995-compiled-package-regexp.md
  • changelog.d/8996-elements-inline-push.md
  • changelog.d/8997-intl-locale-timezone.md
  • changelog.d/8998-narrow-iterator-latch.md
  • changelog.d/8999-release-receiver-probe-kinds.md
  • changelog.d/9000-delete-path-hasher-memcpy.md
  • changelog.d/9001-shape-index-inline-slot.md
  • changelog.d/9002-index-migrate-on-delete.md
  • changelog.d/9003-delete-shift-bound.md
  • changelog.d/9004-deterministic-ext-gc-root-tests.md
  • changelog.d/9005-keep-migrated-index.md
  • changelog.d/9007-gc-matrix-fanin-layout.md
  • changelog.d/9009-lint-gate-ci-only-expressions.md
  • changelog.d/9010-changeset-fragment-number.md
  • changelog.d/9012-poll-reach-audit-in-lint.md
  • changelog.d/9013-delete-inplace-owned-keys.md
  • changelog.d/9015-untyped-uint8array-store.md
  • changelog.d/9016-guarded-preinline-source-small.md
  • changelog.d/9017-fused-for-of-next.md
  • changelog.d/9018-update-number-by-construction.md
  • changelog.d/9020-map-tombstone-delete.md
  • changelog.d/9021-computed-read-by-value.md
  • changelog.d/9022-ic-hit-immutable-facts.md
  • changelog.d/9025-set-tombstone-delete.md
  • changelog.d/9026-box-capture-entry-cells.md
  • changelog.d/9027-generator-loop-resume-temporary.md
  • changelog.d/9028-scalar-replace-new-field.md
  • changelog.d/9029-object-tombstone-deletes.md
  • changelog.d/9030-dirty-page-cache-ways.md
  • changelog.d/9031-eval-global-var-declarations.md
  • changelog.d/9032-truthy-object-inline.md
  • changelog.d/9033-push-typed-inversion.md
  • changelog.d/9035-builder-fold-prototype-descriptors.md
  • changelog.d/9036-chained-array-ctor-type.md
  • changelog.d/9038-object-tombstones-default-on.md
  • changelog.d/9041-store-receiver-lanes.md
  • changelog.d/9042-gc-time-share-diag.md
  • changelog.d/9043-default-derived-dynamic-ancestor.md
  • changelog.d/9044-build-cache-codegen-env-vars.md
  • changelog.d/9047-telemetry-master-opt-out.md
  • changelog.d/9048-scalar-aggregate-closure-reference.md
  • changelog.d/9051-extracted-math.md
  • changelog.d/9054-preserve-exported-aggregates.md
  • changelog.d/9060-packed-loop-numeric-accumulator.md
  • changelog.d/9062-lexical-for-head-order.md
  • changelog.d/9063-masked-window-dense-stores.md
  • changelog.d/9064-stable-delete-ic.md
  • changelog.d/9065-small-object-churn.md
  • changelog.d/9066-iterator-reserved-floor.md
  • changelog.d/9067-preserve-shared-delete-index.md
  • changelog.d/9068-iterator-helper-next-read.md
  • changelog.d/9069-all-vouched-guarded-add.md
  • changelog.d/9070-versioned-len-hoist-masked-arith.md
  • changelog.d/9071-callee-binding-resolution.md
  • changelog.d/9073-dynamic-parent-ctor-field-init.md
  • changelog.d/9075-iterator-own-prop-reads.md
  • changelog.d/9076-map-set-foreach-tombstones.md
  • changelog.d/9077-byte-read-oob-undefined.md
  • changelog.d/9082-map-set-foreach-compaction.md
  • changelog.d/9084-packed-loop-read-admissions.md
  • changelog.d/9089-class-expression-self-identity.md
  • changelog.d/9091-unboxed-clone-accumulators.md
  • changelog.d/9092-archive-cache-test-isolation.md
  • changelog.d/9093-collection-iterator-control-methods.md
  • changelog.d/9102-inlined-ctor-body-locals-rooting.md
  • changelog.d/9104-named-class-static-arrow.md
  • changelog.d/9106-for-head-counter-keeps-init-slot.md
  • changelog.d/9111-packed-clone-endgame.md
  • changelog.d/9121-futures-channel-wrapper-provider.md
  • changelog.d/9123-prototype-method-delete-guard.md
  • changelog.d/9127-collection-iterator-close.md
  • changelog.d/9133-opencode-source-compat.md
  • changelog.d/9135-coalesce-unknown-left-gc-root.md
  • changelog.d/9147-followup-class-registry-fast-hash.md
  • changelog.d/9161-packed-clone-foreign-counter-reads.md
  • changelog.d/9167-function-expando-order.md
  • changelog.d/9171-string-array-length.md
  • changelog.d/9176-registry-probe-prefilter.md
  • changelog.d/9177-symbol-registry-range-filter.md
  • changelog.d/9178-lazy-regex-compilation.md
  • changelog.d/9181-uint8array-fixed-size-allocation-keeps-its-view.md
  • changelog.d/9182-native-root-scan-fails-closed.md
  • changelog.d/9185-throw-keeps-packed-fast-path.md
  • changelog.d/9187-lazy-fn-metadata-utf8.md
  • changelog.d/9189-labeled-switch-break.md
  • changelog.d/9190-receiver-own-key-probe.md
  • changelog.d/9191-lazy-stack-map-index.md
  • changelog.d/9192-array-object-prototype.md
  • changelog.d/9194-loop-property-hoist-stack.md
  • changelog.d/9200-tombstone-delete-default-off.md
  • changelog.d/9204-packed-loop-trace.md
  • changelog.d/9205-buffer-isbuffer-uint8array-brand.md
  • changelog.d/9207-dynamic-function-panic-abort-transport.md
  • changelog.d/9208-raw-handle-debt.md
  • changelog.d/9209-ws-ir-only-tests.md
  • changelog.d/9211-runtime-handle-tls.md
  • changelog.d/9213-buffer-prototype-chain.md
  • changelog.d/9214-decl-prototype-reverse-index.md
  • changelog.d/9214-regex-any-char-no-fold.md
  • changelog.d/9217-9218-regexp-ascii-word-dot.md
  • changelog.d/9224-json-parse-single-pass.md
  • changelog.d/9228-assert-regexp-matcher-input.md
  • changelog.d/9233-release-ci-blockers.md
  • changelog.d/9235-packed-loop-throw-fast-path.md
  • changelog.d/9236-dynamic-import-walker-alignment.md
  • changelog.d/9242-release-parity-blockers.md
  • changelog.d/9243-ext-http-cgu-link-regression-test.md
  • changelog.d/9245-stack-map-index-in-cycle-constructor.md
  • changelog.d/9247-prototype-override-consumers.md
  • changelog.d/9257-receiver-region-model.md
  • changelog.d/9260-release-legs.md
  • changelog.d/9262-release-leg-runners.md
  • changelog.d/9270-stable-packed-forwarded-receiver.md
  • changelog.d/9274-length-bound-offset-reads.md
  • changelog.d/9280-fetch-request-registry-test-isolation.md
  • changelog.d/9281-perf-hooks-prototype-dispatch.md
  • changelog.d/9282-node-api-host-buffer-brand.md
  • changelog.d/9283-preinstalled-shape-facts.md
  • changelog.d/9284-cross-module-shape-barriers.md
  • changelog.d/9286-stale-known-failure.md
  • changelog.d/9288-range-tier-conditional-body.md
  • changelog.d/9290-compile-smoke-ext.md
  • changelog.d/9292-winarm-android-staging.md
  • changelog.d/9294-affine-range-index.md
  • changelog.d/9296-renamed-namespace-constructor.md
  • changelog.d/9298-musl-llvm.md
  • changelog.d/9299-elf-section-table-bounded-read.md
  • changelog.d/9301-statement-lowering-stack.md
  • changelog.d/9306-gap-snapshot-oracle.md
  • changelog.d/9309-drop-legacy-index-get.md
  • changelog.d/gate-array-store-bookkeeping-inline.md
  • changelog.d/index-store-skips-a-dead-string-addref.md
  • changelog.d/inline-store-tier-covers-tagged-arrays.md
  • changelog.d/registry-probe-address-filter.md
  • changelog.d/registry-probe-address-window.md
  • changelog.d/typed-array-byte-read-numeric-proofs.md
  • crates/perry-codegen-arkts/src/tests.rs
  • crates/perry-codegen-arkts/tests/phase2_full_app_smoke.rs
  • crates/perry-codegen/src/block.rs
  • crates/perry-codegen/src/codegen/artifacts.rs
  • crates/perry-codegen/src/codegen/boxed_locals.rs
  • crates/perry-codegen/src/codegen/clone_suffix_tests.rs
  • crates/perry-codegen/src/codegen/closure.rs
  • crates/perry-codegen/src/codegen/closure_collect.rs
  • crates/perry-codegen/src/codegen/ctor_arity.rs
  • crates/perry-codegen/src/codegen/declared_string_add_tests.rs
  • crates/perry-codegen/src/codegen/emission_order_tests.rs
  • crates/perry-codegen/src/codegen/entry.rs
  • crates/perry-codegen/src/codegen/entry/tests.rs
  • crates/perry-codegen/src/codegen/function.rs
  • crates/perry-codegen/src/codegen/helpers.rs
  • crates/perry-codegen/src/codegen/method.rs
  • crates/perry-codegen/src/codegen/method_registry.rs
  • crates/perry-codegen/src/codegen/method_trampolines.rs
  • crates/perry-codegen/src/codegen/mod.rs
  • crates/perry-codegen/src/codegen/module_globals_emit.rs
  • crates/perry-codegen/src/codegen/number_exactness_tests.rs
  • crates/perry-codegen/src/codegen/opts.rs
  • crates/perry-codegen/src/codegen/ordinary_param_guard_tests.rs
  • crates/perry-codegen/src/codegen/string_pool.rs
  • crates/perry-codegen/src/collectors/class_accessors.rs
  • crates/perry-codegen/src/collectors/escape_check.rs
  • crates/perry-codegen/src/collectors/hir_facts.rs
  • crates/perry-codegen/src/collectors/hoisted_callback_calls.rs
  • crates/perry-codegen/src/collectors/int_valued_ta_locals.rs
  • crates/perry-codegen/src/collectors/int_valued_ta_locals/tests.rs
  • crates/perry-codegen/src/collectors/integer_locals.rs
  • crates/perry-codegen/src/collectors/mod.rs
  • crates/perry-codegen/src/collectors/number_by_construction.rs
  • crates/perry-codegen/src/collectors/pointer_locals.rs
  • crates/perry-codegen/src/collectors/ptr_shape_entry.rs
  • crates/perry-codegen/src/collectors/ptr_shape_numeric.rs
  • crates/perry-codegen/src/collectors/receiver_regions.rs
  • crates/perry-codegen/src/collectors/receiver_regions_tests.rs
  • crates/perry-codegen/src/dialect/mod.rs
  • crates/perry-codegen/src/dialect/tests.rs
  • crates/perry-codegen/src/expr/array_methods.rs
  • crates/perry-codegen/src/expr/array_pop.rs
  • crates/perry-codegen/src/expr/array_push.rs
  • crates/perry-codegen/src/expr/arrays_finds.rs
  • crates/perry-codegen/src/expr/barrier_stem_census_tests.rs
  • crates/perry-codegen/src/expr/binary.rs
  • crates/perry-codegen/src/expr/call_spread.rs
  • crates/perry-codegen/src/expr/calls/crypto_kdf.rs
  • crates/perry-codegen/src/expr/class_field_inline_guard.rs
  • crates/perry-codegen/src/expr/closure.rs
  • crates/perry-codegen/src/expr/dynamic_add_tree_tests.rs
  • crates/perry-codegen/src/expr/hot_tls.rs
  • crates/perry-codegen/src/expr/index.rs
  • crates/perry-codegen/src/expr/index_get.rs
  • crates/perry-codegen/src/expr/index_get/foreign_counter.rs
  • crates/perry-codegen/src/expr/index_get/guarded_array.rs
  • crates/perry-codegen/src/expr/index_get/inline_dyn_typed_array.rs
  • crates/perry-codegen/src/expr/index_get_claim_tests.rs
  • crates/perry-codegen/src/expr/index_set.rs
  • crates/perry-codegen/src/expr/index_set_packed_loop.rs
  • crates/perry-codegen/src/expr/literals_vars.rs
  • crates/perry-codegen/src/expr/logical_collections.rs
  • crates/perry-codegen/src/expr/masked_window.rs
  • crates/perry-codegen/src/expr/misc_methods.rs
  • crates/perry-codegen/src/expr/mod.rs
  • crates/perry-codegen/src/expr/new_dynamic.rs
  • crates/perry-codegen/src/expr/null_default_numeric_add_tests.rs
  • crates/perry-codegen/src/expr/object_literal.rs
  • crates/perry-codegen/src/expr/property_get.rs
  • crates/perry-codegen/src/expr/property_get/composed_ics.rs
  • crates/perry-codegen/src/expr/property_get/generic_dispatch.rs
  • crates/perry-codegen/src/expr/property_get/helpers.rs
  • crates/perry-codegen/src/expr/property_get/tests.rs
  • crates/perry-codegen/src/expr/proxy_reflect.rs
  • crates/perry-codegen/src/expr/proxy_reflect_write_ic.rs
  • crates/perry-codegen/src/expr/range_facts.rs
  • crates/perry-codegen/src/expr/readonly_collection_tests.rs
  • crates/perry-codegen/src/expr/shadow_slot.rs
  • crates/perry-codegen/src/expr/static_field_meta.rs
  • crates/perry-codegen/src/expr/static_method.rs
  • crates/perry-codegen/src/expr/string_length.rs
  • crates/perry-codegen/src/expr/string_window.rs
  • crates/perry-codegen/src/expr/this_super_call.rs
  • crates/perry-codegen/src/expr/unary.rs
  • crates/perry-codegen/src/expr/unary_bigint_tests.rs
  • crates/perry-codegen/src/expr/v8_interop.rs
  • crates/perry-codegen/src/expr/write_barrier.rs
  • crates/perry-codegen/src/expr/write_pic_barrier_tests.rs
  • crates/perry-codegen/src/inst.rs
  • crates/perry-codegen/src/lib.rs
  • crates/perry-codegen/src/lower_call/alloc_hot_tests.rs
  • crates/perry-codegen/src/lower_call/builtin.rs
  • crates/perry-codegen/src/lower_call/early_branches.rs
  • crates/perry-codegen/src/lower_call/field_init.rs
  • crates/perry-codegen/src/lower_call/method_override.rs
  • crates/perry-codegen/src/lower_call/mod.rs
  • crates/perry-codegen/src/lower_call/namespace_call.rs
  • crates/perry-codegen/src/lower_call/new.rs
  • crates/perry-codegen/src/lower_call/new_alloc.rs
  • crates/perry-codegen/src/lower_call/new_helpers.rs
  • crates/perry-codegen/src/lower_call/typed_shape_bake_tests.rs
  • crates/perry-codegen/src/lower_conditional.rs
  • crates/perry-codegen/src/lower_string_concat.rs
  • crates/perry-codegen/src/native_emit.rs
  • crates/perry-codegen/src/native_root_coverage/mod.rs
  • crates/perry-codegen/src/rooting/mod.rs
  • crates/perry-codegen/src/runtime_decls/mod.rs
  • crates/perry-codegen/src/runtime_decls/objects.rs
  • crates/perry-codegen/src/runtime_decls/stdlib_ffi/data_stores.rs
  • crates/perry-codegen/src/runtime_decls/stdlib_ffi/language_core.rs
  • crates/perry-codegen/src/runtime_decls/stdlib_ffi/third_party.rs
  • crates/perry-codegen/src/runtime_decls/strings.rs
  • crates/perry-codegen/src/runtime_decls/strings_part2.rs
  • crates/perry-codegen/src/stmt/let_stmt.rs
  • crates/perry-codegen/src/stmt/let_stmt_facts.rs
  • crates/perry-codegen/src/stmt/loops.rs
  • crates/perry-codegen/src/stmt/masked_window_region.rs
  • crates/perry-codegen/src/stmt/mod.rs
  • crates/perry-codegen/src/stmt/stable_packed_accumulator.rs
  • crates/perry-codegen/src/stmt/stable_packed_loop.rs
  • crates/perry-codegen/src/stmt/string_length_loop.rs
  • crates/perry-codegen/src/stmt/switch_stmt.rs
  • crates/perry-codegen/src/stmt/versioned_indexed_loop.rs
  • crates/perry-codegen/src/target_layout.rs
  • crates/perry-codegen/src/temp_root_coverage/mod.rs
  • crates/perry-codegen/src/type_analysis/numeric.rs
  • crates/perry-codegen/src/type_analysis/numeric/tests.rs
  • crates/perry-codegen/src/type_analysis/pod.rs
  • crates/perry-codegen/src/type_analysis/predicates.rs
  • crates/perry-codegen/src/type_analysis/refine.rs
  • crates/perry-codegen/src/type_analysis/strings.rs
  • crates/perry-codegen/src/type_analysis/strings/tests.rs
  • crates/perry-codegen/src/typed_shape.rs
  • crates/perry-codegen/tests/app_window_config_options.rs
  • crates/perry-codegen/tests/argless_builtin_extra_args.rs
  • crates/perry-codegen/tests/class_field_store_pointer_test.rs
  • crates/perry-codegen/tests/class_keys_gc_root.rs
  • crates/perry-codegen/tests/constructor_recursion.rs
  • crates/perry-codegen/tests/i64_spec_ternary_recursion.rs
  • crates/perry-codegen/tests/ios_platform_api_lowering.rs
  • crates/perry-codegen/tests/large_object_barriers.rs
  • crates/perry-codegen/tests/loop_safepoint_purity.rs
  • crates/perry-codegen/tests/macos_bundle_chdir_gate.rs
  • crates/perry-codegen/tests/native_proof_buffer_views.rs
  • crates/perry-codegen/tests/native_proof_regressions.rs
  • crates/perry-codegen/tests/native_proof_regressions/invalidation.rs
  • crates/perry-codegen/tests/node_test_mock_property_presence.rs
  • crates/perry-codegen/tests/perry_builtin_name_collision.rs
  • crates/perry-codegen/tests/private_guard_declaring_class.rs
  • crates/perry-codegen/tests/release_boxes_lowering.rs
  • crates/perry-codegen/tests/scalar_replaced_slot_roots.rs
  • crates/perry-codegen/tests/shadow_slot_hygiene.rs
  • crates/perry-codegen/tests/static_symbol_hygiene.rs
  • crates/perry-codegen/tests/string_array_length_9160.rs
  • crates/perry-codegen/tests/temp_root_operand_temporaries.rs
  • crates/perry-codegen/tests/typed_array_rmw_8692.rs
  • crates/perry-codegen/tests/typed_feedback.rs
  • crates/perry-codegen/tests/typed_shape_declared_at_allocation.rs
  • crates/perry-codegen/tests/typed_shape_descriptor.rs
  • crates/perry-codegen/tests/typed_shape_descriptors.rs
  • crates/perry-dispatch/src/system_table.rs
  • crates/perry-ext-commander/src/lib.rs
  • crates/perry-ext-cron/src/lib.rs
  • crates/perry-ext-fastify/src/lib.rs
  • crates/perry-ext-fetch/src/lib.rs
  • crates/perry-ext-fetch/src/tests.rs
  • crates/perry-ext-http/src/server/mod.rs
  • crates/perry-ext-http/src/tests.rs
  • crates/perry-ext-net/src/tests.rs
  • crates/perry-ext-streams/src/lib.rs
  • crates/perry-ext-ws/src/lib.rs
  • crates/perry-hir/src/analysis.rs
  • crates/perry-hir/src/analysis/value_types.rs
  • crates/perry-hir/src/analysis/value_types_tests.rs
  • crates/perry-hir/src/destructuring/var_decl.rs
  • crates/perry-hir/src/destructuring/var_decl_sources.rs
  • crates/perry-hir/src/dynamic_import/binding_origin.rs
  • crates/perry-hir/src/dynamic_import/tests.rs
  • crates/perry-hir/src/dynamic_import/visitors.rs
  • crates/perry-hir/src/ir/decl.rs
  • crates/perry-hir/src/ir/expr.rs
  • crates/perry-hir/src/ir/module.rs
  • crates/perry-hir/src/lib.rs
  • crates/perry-hir/src/lower/builder_fold.rs
  • crates/perry-hir/src/lower/const_fold_fn.rs
  • crates/perry-hir/src/lower/context.rs
  • crates/perry-hir/src/lower/expr_call/array_only_methods.rs
  • crates/perry-hir/src/lower/expr_function.rs
  • crates/perry-hir/src/lower/expr_member.rs
  • crates/perry-hir/src/lower/expr_member/private_guard.rs
  • crates/perry-hir/src/lower/expr_object.rs
  • crates/perry-hir/src/lower/for_multi_decl_tests.rs
  • crates/perry-hir/src/lower/locals.rs
  • crates/perry-hir/src/lower/lower_expr/arm_bin.rs
  • crates/perry-hir/src/lower/lower_expr/arm_class.rs
  • crates/perry-hir/src/lower/lower_expr/arm_ident.rs
  • crates/perry-hir/src/lower/lower_module_fn.rs
  • crates/perry-hir/src/lower/lowering_context.rs
  • crates/perry-hir/src/lower/mod.rs
  • crates/perry-hir/src/lower/module_decl.rs
  • crates/perry-hir/src/lower/module_decl/static_import_bindings.rs
  • crates/perry-hir/src/lower/property_array_hoist.rs
  • crates/perry-hir/src/lower/shared_mutable_capture.rs
  • crates/perry-hir/src/lower/stmt.rs
  • crates/perry-hir/src/lower/stmt_loops.rs
  • crates/perry-hir/src/lower/tests.rs
  • crates/perry-hir/src/lower_decl/body_stmt.rs
  • crates/perry-hir/src/lower_decl/class_captures.rs
  • crates/perry-hir/src/lower_decl/helpers.rs
  • crates/perry-hir/src/lower_decl/mod.rs
  • crates/perry-hir/src/lower_patterns.rs
  • crates/perry-hir/src/lower_types.rs
  • crates/perry-hir/src/monomorph/infer.rs
  • crates/perry-hir/src/stable_hash/expr.rs
  • crates/perry-hir/src/stable_hash/module.rs
  • crates/perry-hir/src/stable_hash/tests.rs
  • crates/perry-hir/tests/builder_fold_prototype_descriptor.rs
  • crates/perry-hir/tests/chained_array_ctor_method_types.rs
  • crates/perry-hir/tests/issue_5833_global_code_cluster.rs
  • crates/perry-parser/src/lib.rs
  • crates/perry-runtime/Cargo.toml
  • crates/perry-runtime/src/arena/quarantine.rs
  • crates/perry-runtime/src/array/indexing.rs
  • crates/perry-runtime/src/array/iter_object.rs
  • crates/perry-runtime/src/array/iterator.rs
  • crates/perry-runtime/src/array/keys_len_cap_tests.rs
  • crates/perry-runtime/src/array/mod.rs
  • crates/perry-runtime/src/array/strict_dense_test_helpers.rs
  • crates/perry-runtime/src/array/subclass.rs
  • crates/perry-runtime/src/array/subclass_elements.rs
  • crates/perry-runtime/src/array/subclass_elements_tests.rs
  • crates/perry-runtime/src/array/subclass_loop_guard.rs
  • crates/perry-runtime/src/array/subclass_tests.rs
  • crates/perry-runtime/src/bigint/arith.rs
  • crates/perry-runtime/src/bigint/tests.rs
  • crates/perry-runtime/src/box.rs
  • crates/perry-runtime/src/buffer/exotic_view.rs
  • crates/perry-runtime/src/buffer/exotic_view_tests.rs
  • crates/perry-runtime/src/buffer/header.rs
  • crates/perry-runtime/src/buffer/header_latch_tests.rs
  • crates/perry-runtime/src/buffer/iter.rs
  • crates/perry-runtime/src/buffer/mod.rs
  • crates/perry-runtime/src/buffer/query.rs
  • crates/perry-runtime/src/builtins/formatting.rs
  • crates/perry-runtime/src/builtins/formatting/boxed_primitives.rs
  • crates/perry-runtime/src/builtins/numbers.rs
  • crates/perry-runtime/src/child_process/mod.rs
  • crates/perry-runtime/src/child_process/v8_serde.rs
  • crates/perry-runtime/src/closure/alloc.rs
  • crates/perry-runtime/src/closure/dispatch/calln.rs
  • crates/perry-runtime/src/closure/dispatch/value_call.rs
  • crates/perry-runtime/src/closure/dynamic_props.rs
  • crates/perry-runtime/src/closure/registry.rs
  • crates/perry-runtime/src/collection_iter_object.rs
  • crates/perry-runtime/src/date.rs
  • crates/perry-runtime/src/dyn_eval/interp.rs
  • crates/perry-runtime/src/dyn_eval/tests.rs
  • crates/perry-runtime/src/error.rs
  • crates/perry-runtime/src/error_tostring_tests.rs
  • crates/perry-runtime/src/exception.rs
  • crates/perry-runtime/src/fast_hash.rs
  • crates/perry-runtime/src/gc/barrier_store.rs
  • crates/perry-runtime/src/gc/copying.rs
  • crates/perry-runtime/src/gc/cycle.rs
  • crates/perry-runtime/src/gc/cycle_malloc_trim.rs
  • crates/perry-runtime/src/gc/dirty_page_cache.rs
  • crates/perry-runtime/src/gc/instruments.rs
  • crates/perry-runtime/src/gc/layout.rs
  • crates/perry-runtime/src/gc/layout/typed_shape.rs
  • crates/perry-runtime/src/gc/layout_slot_visit.rs
  • crates/perry-runtime/src/gc/mod.rs
  • crates/perry-runtime/src/gc/policy.rs
  • crates/perry-runtime/src/gc/roots.rs
  • crates/perry-runtime/src/gc/roots/runtime_handles.rs
  • crates/perry-runtime/src/gc/roots/stack_maps.rs
  • crates/perry-runtime/src/gc/roots/stack_maps_sections.rs
  • crates/perry-runtime/src/gc/tests/barrier.rs
  • crates/perry-runtime/src/gc/tests/copying_side_tables.rs
  • crates/perry-runtime/src/gc/tests/dirty_page_cache.rs
  • crates/perry-runtime/src/gc/tests/helper_stores.rs
  • crates/perry-runtime/src/gc/tests/lazy_intrinsic_towers.rs
  • crates/perry-runtime/src/gc/types.rs
  • crates/perry-runtime/src/intl.rs
  • crates/perry-runtime/src/intl/date_collator.rs
  • crates/perry-runtime/src/intl/icu_dtf.rs
  • crates/perry-runtime/src/intl/list_relative_plural.rs
  • crates/perry-runtime/src/intl/time_zone.rs
  • crates/perry-runtime/src/iterator_helpers.rs
  • crates/perry-runtime/src/iterator_helpers/tests.rs
  • crates/perry-runtime/src/json/mod.rs
  • crates/perry-runtime/src/json/parse_api.rs
  • crates/perry-runtime/src/json/parser.rs
  • crates/perry-runtime/src/json/simd.rs
  • crates/perry-runtime/src/json/stringify.rs
  • crates/perry-runtime/src/json/stringify_shape_template.rs
  • crates/perry-runtime/src/map.rs
  • crates/perry-runtime/src/map_tombstone_tests.rs
  • crates/perry-runtime/src/node_api_host/buffers.rs
  • crates/perry-runtime/src/node_api_host/loader.rs
  • crates/perry-runtime/src/node_stream_constructors/builders.rs
  • crates/perry-runtime/src/node_submodules/diagnostics.rs
  • crates/perry-runtime/src/node_vm.rs
  • crates/perry-runtime/src/node_vm/modules.rs
  • crates/perry-runtime/src/object/alloc.rs
  • crates/perry-runtime/src/object/assert.rs
  • crates/perry-runtime/src/object/class_constructors.rs
  • crates/perry-runtime/src/object/class_gc_roots.rs
  • crates/perry-runtime/src/object/class_image.rs
  • crates/perry-runtime/src/object/class_meta_registry.rs
  • crates/perry-runtime/src/object/class_registry.rs
  • crates/perry-runtime/src/object/class_registry/class_meta.rs
  • crates/perry-runtime/src/object/class_registry/decl_prototype_table.rs
  • crates/perry-runtime/src/object/class_registry/dispatch.rs
  • crates/perry-runtime/src/object/class_registry/gc_roots.rs
  • crates/perry-runtime/src/object/class_registry/parent_static.rs
  • crates/perry-runtime/src/object/class_registry/parent_static/shape_authority_tests_8067.rs
  • crates/perry-runtime/src/object/class_registry/prototype_methods.rs
  • crates/perry-runtime/src/object/class_registry/registration.rs
  • crates/perry-runtime/src/object/class_registry/state.rs
  • crates/perry-runtime/src/object/data_view_registry.rs
  • crates/perry-runtime/src/object/delete_rest.rs
  • crates/perry-runtime/src/object/descriptor_state.rs
  • crates/perry-runtime/src/object/descriptors.rs
  • crates/perry-runtime/src/object/exotic_expando.rs
  • crates/perry-runtime/src/object/field_get_set.rs
  • crates/perry-runtime/src/object/field_get_set/accessors.rs
  • crates/perry-runtime/src/object/field_get_set/array_retargeted_proto.rs
  • crates/perry-runtime/src/object/field_get_set/enumeration.rs
  • crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs
  • crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs
  • crates/perry-runtime/src/object/field_get_set/has_property.rs
  • crates/perry-runtime/src/object/field_get_set/ic_miss.rs
  • crates/perry-runtime/src/object/field_get_set/ic_miss/private_member_access.rs
  • crates/perry-runtime/src/object/field_get_set/prototype_override.rs
  • crates/perry-runtime/src/object/field_set_by_name.rs
  • crates/perry-runtime/src/object/field_set_by_name/fast_paths.rs
  • crates/perry-runtime/src/object/field_set_by_name/tail.rs
  • crates/perry-runtime/src/object/global_fetch.rs
  • crates/perry-runtime/src/object/global_this.rs
  • crates/perry-runtime/src/object/global_this/builtin_thunks.rs
  • crates/perry-runtime/src/object/global_this/fetch_globals.rs
  • crates/perry-runtime/src/object/global_this/populate.rs
  • crates/perry-runtime/src/object/iterator_prototypes.rs
  • crates/perry-runtime/src/object/keys_lookup.rs
  • crates/perry-runtime/src/object/live_slots.rs
  • crates/perry-runtime/src/object/map_set_subclass.rs
  • crates/perry-runtime/src/object/meta_accessors.rs
  • crates/perry-runtime/src/object/mod.rs
  • crates/perry-runtime/src/object/native_call_method.rs
  • crates/perry-runtime/src/object/native_call_method/collection_methods.rs
  • crates/perry-runtime/src/object/native_call_method/handle_methods.rs
  • crates/perry-runtime/src/object/native_module.rs
  • crates/perry-runtime/src/object/native_module/callable_exports.rs
  • crates/perry-runtime/src/object/native_module_dispatch/dispatch_a_c.rs
  • crates/perry-runtime/src/object/object_ops.rs
  • crates/perry-runtime/src/object/object_ops/define_get_accessor.rs
  • crates/perry-runtime/src/object/object_ops/define_properties.rs
  • crates/perry-runtime/src/object/object_ops/define_property.rs
  • crates/perry-runtime/src/object/object_ops/descriptor_helpers.rs
  • crates/perry-runtime/src/object/object_ops/has_own.rs
  • crates/perry-runtime/src/object/object_ops/keys_array.rs
  • crates/perry-runtime/src/object/object_ops/prototype.rs
  • crates/perry-runtime/src/object/object_ops_frozen.rs
  • crates/perry-runtime/src/object/own_key_probe_tests.rs
  • crates/perry-runtime/src/object/polymorphic_index.rs
  • crates/perry-runtime/src/object/read_stub.rs
  • crates/perry-runtime/src/object/reflect_support.rs
  • crates/perry-runtime/src/object/reserved_floor.rs
  • crates/perry-runtime/src/object/shapes.rs
  • crates/perry-runtime/src/object/shapes_reverse_indices.rs
  • crates/perry-runtime/src/object/shapes_slot_list.rs
  • crates/perry-runtime/src/object/shapes_test_support.rs
  • crates/perry-runtime/src/object/shapes_tests.rs
  • crates/perry-runtime/src/object/test_root_helpers.rs
  • crates/perry-runtime/src/object/tests.rs
  • crates/perry-runtime/src/object/this_binding.rs
  • crates/perry-runtime/src/object/tombstone_tests.rs
  • crates/perry-runtime/src/perf_hooks/prototypes.rs
  • crates/perry-runtime/src/proxy.rs
  • crates/perry-runtime/src/proxy/metadata.rs
  • crates/perry-runtime/src/proxy/put_value.rs
  • crates/perry-runtime/src/regex.rs
  • crates/perry-runtime/src/regex/exec.rs
  • crates/perry-runtime/src/regex/grammar.rs
  • crates/perry-runtime/src/regex/lazy.rs
  • crates/perry-runtime/src/regex/match_all.rs
  • crates/perry-runtime/src/regex/match_string.rs
  • crates/perry-runtime/src/regex/repeat_matcher.rs
  • crates/perry-runtime/src/regex/replace_expand.rs
  • crates/perry-runtime/src/regex/tests.rs
  • crates/perry-runtime/src/registry_latch.rs
  • crates/perry-runtime/src/registry_latch_probes.rs
  • crates/perry-runtime/src/set.rs
  • crates/perry-runtime/src/set_tombstone_tests.rs
  • crates/perry-runtime/src/shared_sab.rs
  • crates/perry-runtime/src/stdlib_stubs.rs
  • crates/perry-runtime/src/string/alloc.rs
  • crates/perry-runtime/src/string/append.rs
  • crates/perry-runtime/src/string/concat.rs
  • crates/perry-runtime/src/string/intern.rs
  • crates/perry-runtime/src/string/iter_object.rs
  • crates/perry-runtime/src/string/mod.rs
  • crates/perry-runtime/src/symbol.rs
  • crates/perry-runtime/src/symbol/accessors.rs
  • crates/perry-runtime/src/symbol/gc_roots.rs
  • crates/perry-runtime/src/symbol/get.rs
  • crates/perry-runtime/src/symbol/iterator.rs
  • crates/perry-runtime/src/symbol/properties.rs
  • crates/perry-runtime/src/thread.rs
  • crates/perry-runtime/src/thread_transfer_guard_tests.rs
  • crates/perry-runtime/src/tls_hot.rs
  • crates/perry-runtime/src/typed_feedback.rs
  • crates/perry-runtime/src/typed_feedback/guards.rs
  • crates/perry-runtime/src/typed_feedback/tests.rs
  • crates/perry-runtime/src/typedarray/access.rs
  • crates/perry-runtime/src/typedarray/construct.rs
  • crates/perry-runtime/src/typedarray/element_read_receiver_tests.rs
  • crates/perry-runtime/src/typedarray/mod.rs
  • crates/perry-runtime/src/url/search_params.rs
  • crates/perry-runtime/src/value/addr_class.rs
  • crates/perry-runtime/src/value/dyn_index.rs
  • crates/perry-runtime/src/value/dyn_index_uint8array_tests.rs
  • crates/perry-runtime/src/value/dynamic_arith.rs
  • crates/perry-runtime/src/value/mod.rs
  • crates/perry-runtime/src/value/nanbox.rs
  • crates/perry-runtime/src/value/to_string.rs
  • crates/perry-runtime/src/value/to_string_class_ref.rs
  • crates/perry-stdlib/src/common/dispatch/init.rs
  • crates/perry-stdlib/src/crypto/kdf.rs
  • crates/perry-stdlib/src/crypto/random.rs
  • crates/perry-stdlib/src/fetch/dispatch.rs
  • crates/perry-stdlib/src/fetch/headers.rs
  • crates/perry-stdlib/src/fetch/mod.rs
  • crates/perry-stdlib/src/fetch/response_ctor.rs
  • crates/perry-stdlib/src/fetch/tests.rs
  • crates/perry-transform/src/aggregate_scalar.rs
  • crates/perry-transform/src/aggregate_scalar_closure_tests.rs
  • crates/perry-transform/src/aggregate_scalar_export_tests.rs
  • crates/perry-transform/src/generator/linearize.rs
  • crates/perry-transform/src/generator/lower.rs
  • crates/perry-transform/src/inline/call_inliner.rs
  • crates/perry-transform/src/inline/cross_module.rs
  • crates/perry-transform/src/inline/mod.rs
  • crates/perry-ui-macos/src/file_dialog.rs
  • crates/perry-ui-macos/src/lib_ffi/system.rs
  • crates/perry-ui-macos/src/lib_ffi/window_misc.rs
  • crates/perry-ui-macos/src/widgets/alert.rs
  • crates/perry-ui-macos/src/widgets/combobox.rs
  • crates/perry-ui-macos/src/widgets/webview.rs
  • crates/perry/src/commands/compile/bootstrap.rs
  • crates/perry/src/commands/compile/build_cache.rs
  • crates/perry/src/commands/compile/cjs_wrap/hoist_classes.rs
  • crates/perry/src/commands/compile/cjs_wrap/tests.rs
  • crates/perry/src/commands/compile/cjs_wrap/tests/hoist_scanner.rs
  • crates/perry/src/commands/compile/collect_modules.rs
  • crates/perry/src/commands/compile/collect_modules/feature_detect.rs
  • crates/perry/src/commands/compile/init_order.rs
  • crates/perry/src/commands/compile/link/archive_cache.rs
  • crates/perry/src/commands/compile/link/build_and_run.rs
  • crates/perry/src/commands/compile/link/link_cache.rs
  • crates/perry/src/commands/compile/link/mod.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/run_pipeline.rs
  • crates/perry/src/commands/compile/strip_dedup.rs
  • crates/perry/src/commands/compile/strip_dedup/object_format.rs
  • crates/perry/src/commands/compile/strip_dedup/strip_dedup_tests.rs
  • crates/perry/src/commands/compile/types.rs
  • crates/perry/src/commands/run/entry.rs
  • crates/perry/src/compat_reports.rs
  • crates/perry/src/main.rs
  • crates/perry/src/telemetry.rs
  • crates/perry/tests/array_subclass_fill_args.rs
  • crates/perry/tests/class_inherited_computed_static_in.rs
  • crates/perry/tests/dynamic_add_pair_guard.rs
  • crates/perry/tests/gc_stack_map_index_budgeted_cycle.rs
  • crates/perry/tests/guarded_numeric_arith.rs
  • crates/perry/tests/issue_5247_runtime_error_source_location.rs
  • crates/perry/tests/issue_5763_setprototypeof_chain_end.rs
  • crates/perry/tests/issue_5868_switch_state_machine.rs
  • crates/perry/tests/issue_5951_class_capture_shared_mutable.rs
  • crates/perry/tests/issue_5972_getdevicemodel_object_key.rs
  • crates/perry/tests/issue_6074_rest_dispatch.rs
  • crates/perry/tests/issue_6559_dyn_function_interpreter.rs
  • crates/perry/tests/issue_806_default_derived_ctor_forwarding.rs
  • crates/perry/tests/issue_8655_array_subclass_indexing.rs
  • crates/perry/tests/issue_8690_loop_versioned_arraylike.rs
  • crates/perry/tests/issue_8693_imported_this_specialization.rs
  • crates/perry/tests/issue_8772_short_packed_spread.rs
  • crates/perry/tests/issue_8905_regexp_package_boundary.rs
  • crates/perry/tests/issue_8907_ext_http_cgu_link.rs
  • crates/perry/tests/issue_8953_array_subclass_enumeration.rs
  • crates/perry/tests/issue_8968_private_compound_assignment.rs
  • crates/perry/tests/issue_8968_response_headers.rs
  • crates/perry/tests/issue_9051_extracted_math.rs
  • crates/perry/tests/issue_9052_for_lexical_declarators.rs
  • crates/perry/tests/issue_9053_exported_aggregate.rs
  • crates/perry/tests/issue_9086_collection_iterator_methods.rs
  • crates/perry/tests/issue_9087_class_ref_add.rs
  • crates/perry/tests/issue_9098_collection_iterator_close.rs
  • crates/perry/tests/issue_9101_class_ref_coercion.rs
  • crates/perry/tests/issue_9123_method_delete_invalidation.rs
  • crates/perry/tests/issue_9131_prototype_method_replacement.rs
  • crates/perry/tests/issue_9148_function_expando_order.rs
  • crates/perry/tests/issue_9173_buffer_identity.rs
  • crates/perry/tests/issue_9179_buffer_isbuffer_uint8array.rs
  • crates/perry/tests/issue_9180_decl_prototype_reverse_lookup.rs
  • crates/perry/tests/issue_9184_json_parse_strict.rs
  • crates/perry/tests/issue_9253_affine_range_index.rs
  • crates/perry/tests/issue_9259_length_bound_offset_reads.rs
  • crates/perry/tests/issue_9275_range_conditional_body.rs
  • crates/perry/tests/loop_property_array_hoist.rs
  • crates/perry/tests/module_forward_class_expression.rs
  • crates/perry/tests/namespace_variable_export_abi.rs
  • crates/perry/tests/node_api_host_e2e.rs
  • crates/perry/tests/packed_loop_abrupt_statements.rs
  • crates/perry/tests/packed_loop_error_throw.rs
  • crates/perry/tests/packed_loop_offset_read_accumulator.rs
  • crates/perry/tests/source_graph_export_regressions.rs
  • crates/perry/tests/ws_client_handle_cross_function_dispatch.rs
  • docs/src/cli/telemetry.md
  • docs/src/internals/gc-rooting-invariant.md
  • docs/src/internals/node-api-host.md
  • scripts/build_linux_glibc_2_31.sh
  • scripts/build_linux_musl.sh
  • scripts/check_changeset_fragment.sh
  • scripts/check_file_size.sh
  • scripts/ci_e2e_scope.py
  • scripts/gap_snapshot.py
  • scripts/gc_root_dominance_check.py
  • scripts/gc_runtime_root_holders.json
  • scripts/gc_store_site_inventory.py
  • scripts/linux-musl-llvm22.Dockerfile
  • scripts/local_binding_type_allowlist.json
  • scripts/parity_known_failures.py
  • scripts/raw_handle_debt.py
  • scripts/raw_handle_debt_baseline.txt
  • scripts/regex_9217_9218_differential.mjs
  • scripts/run_gap_tests.sh
  • scripts/run_lint_gates.sh
  • scripts/shape_descriptor_census.py
  • scripts/shape_descriptor_census_baseline.json
  • scripts/string_payload_access_baseline.txt
  • scripts/thread_local_cold_allowlist.json
  • test-files/issue_8904_namespace_materialization/coerce.ts
  • test-files/issue_8904_namespace_materialization/external.ts
  • test-files/issue_8904_namespace_materialization/index.ts
  • test-files/test_gap_8969_private_field_compound_update.ts
  • test-files/test_gap_9050_all_vouched_guarded_add.ts
  • test-files/test_gap_9051_dynamic_parent_ctor_field_init_once.ts
  • test-files/test_gap_9052_class_expr_self_ref_static_private.ts
  • test-files/test_gap_9053_export_getter_descriptor.ts
  • test-files/test_gap_9053_switch_binary_dispatch.ts
  • test-files/test_gap_9089_class_expr_self_private_identity.ts
  • test-files/test_gap_9090_closure_literal_identity.ts
  • test-files/test_gap_9091_native_member_patch_roundtrip.ts
  • test-files/test_gap_9092_bigint_pow2_mod.ts
  • test-files/test_gap_9104_named_class_expr_static_self_capture.ts
  • test-files/test_gap_9142_bigint_array_negation.ts
  • test-files/test_gap_9143_bigint_for_of_compound.ts
  • test-files/test_gap_9163_lazy_regex_semantics.ts
  • test-files/test_gap_9180_receiver_set_own_key_scan.ts
  • test-files/test_gap_9192_array_object_prototype.ts
  • test-files/test_gap_9217_9218_regexp_word_dot.ts
  • test-files/test_gap_cron_cronjob.ts
  • test-files/test_gap_gc_coalesce_local_root.ts
  • test-files/test_gap_gc_inlined_ctor_body_locals_rooting.ts
  • test-files/test_gap_issue_8903_intl_locale_data.ts
  • test-files/test_gap_iterator_helper_next_value_9068.ts
  • test-files/test_gap_iterator_patched_next.ts
  • test-files/test_gap_namespace_type_erasure_8904.ts
  • test-files/test_gap_scalar_replace_new_field.ts
  • test-files/test_gap_string_array_masked_length_9160.ts
  • test-files/test_gap_uint8array_oob_push_9039.ts
  • test-files/test_issue_8902_regex_literal_unicode_whitespace.ts
  • test-files/test_issue_9148_function_expando_order.ts
  • test-files/test_issue_9173_buffer_identity.ts
  • test-files/test_issue_9184_json_parse_strict.ts
  • test-files/test_parity_webassembly_graceful_fail_default.ts
  • test-parity/README.md
  • test-parity/expected/test_parity_method_value_snapshot_bind.txt
  • test-parity/gap_snapshot.json
  • test-parity/gc_repsel_corpus.txt
  • test-parity/known_failures.json
  • test-parity/node-suite/assert/errors/throws-regexp-matcher-input.ts
  • test-parity/parity_matrix_baseline.json
  • changelog.d/0000-inline-array-pop-tier.md
  • changelog.d/0000-inline-method-shape-probe.md
  • changelog.d/0000-node-version-26.5.1.md
  • changelog.d/8930-elf-archive-group.md
  • changelog.d/9289-scrypt-params.md
  • test-parity/node-suite/crypto/scrypt/options.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

proggeramlug added a commit that referenced this pull request Aug 31, 2026
#9311) (#9314)

* fix(link): group the ELF archive block so ld can resolve back into stdlib (#8930)

A `bundled-streams` build died with `undefined reference to
<futures_channel::mpsc::SenderTask>::notify` out of `libperry_ext_http.a`,
even though the `libperry_stdlib.a` on the same command line exports that
symbol from its own `futures_channel` member.

The mechanism is archive order, but not the obvious one. The wrapper archives
already appear twice — once before perry-stdlib, once after — so at a glance
every reference has somewhere to go. What the #8930 link map shows is that the
FIRST listing pulls nothing at all: the user objects reference only `js_*`
symbols that perry-stdlib provides, so nothing in the wrapper is undefined yet
when `ld` walks it. All 92 wrapper members that end up in the executable are
pulled from the SECOND listing, on references that stdlib's own members had
just opened (`js_node_http_*`, …) — and the references those members carry
back INTO stdlib have nowhere to go, because GNU `ld` scans each archive once
and never revisits one it has passed.

That was harmless while each wrapper bundled its own copy of everything it
closed over. It becomes a hard error the moment
`strip_bundled_shared_deps_from_well_known_lib` drops a bundled member because
stdlib provides it — a correct decision by the archive index, but one that
only holds if `ld` can still get back to stdlib. That is what `bundled-streams`
changes: it is the feature (enabled by a `fs/promises` or `stream/web` import,
per `stdlib_features::module_to_features`) that pulls futures_channel into
perry-stdlib's own graph, so stdlib starts bundling a name-matching
`futures_channel-*.rcgu.o`, so the wrapper's copy becomes eligible to drop. A
stdlib built without it carries no futures_channel member at all, the wrapper
keeps its copy, and the link stays self-contained. #8939 tightened the pruning
rule to the name-matched stdlib member's own exports; here that member does
export the symbol, so the rule fires correctly and the link still fails. The
bug is on the link line, not in the pruning.

Wrap the perry archive block in `-Wl,--start-group` / `-Wl,--end-group` on ELF
targets so `ld` re-scans it to a fixed point — the guarantee a mutually
recursive archive set needs. Repeating one archive (the codebase's usual
"archive twice" trick) only covers a one-step cycle, and this graph is
LTO-partitioned across hundreds of codegen units on both sides. Members are
still pulled left to right, so the wrappers-before-stdlib and
localized-runtime-last first-definition-wins ordering is unaffected; Mach-O
`ld64` resolves archives to a fixed point already (and rejects the flag) and
`lld-link` / MSVC have no group concept, so both are left alone.

Verified against both reported repros in mb24 — `apps/landing` (hono plus a
compiled `@skelpo/cms-client`) and `apps/api` (hono + ws + mysql2, four
wrapper archives, no `perry.compilePackages` at all). Both fail before and
link after; replaying either final link line with only the two group flags
removed reproduces the exact undefined reference. A case that already linked
(`packages/db/src/migrate.ts`) produces a byte-identical executable with and
without the flags. The link/strip-dedup unit tests pass (68), as do the two
archive-ordering integration tests —
`issue_5920_wrapper_bundled_runtime_async_starvation` (the two-runtime-copies
hazard) and `issue_6715_native_wrapper_precedence`. `native_link_cache` fails
identically on the unpatched parent commit.

* fix(crypto): honor scrypt cost parameters (#9289)

* refactor(link): split the HarmonyOS native-object scan out of build_and_run.rs

build_and_run.rs was at 1994 lines; #8930's archive-group call takes it over
the 2000-line gate. The HarmonyOS block needs only cmd/target/format, so it
moves to a sibling module unchanged.

---------

Co-authored-by: Claude <ralph3@skelpo.com>
Co-authored-by: Ralph Küpper <ralph@skelpo.com>
@proggeramlug

Copy link
Copy Markdown
Contributor Author

Reviewed all four. Two are already fixed on main, and the other two are merged — details below, because the overlap is worth knowing about.

#8962 (imported class private brand) — already on main via #8986 ("initialize imported private brands once"). Your commit cherry-picks empty against current main.

#8968 (private compound reads / Response headers) — already on main via #8982 ("preserve Hono response state"), with a different implementation. Your commit conflicts in lower_patterns.rs, fetch/headers.rs and fetch/response_ctor.rs: main now has headers_store_from_record_value, where yours generalises to any HeadersInit. Deciding which shape wins is a real judgement call about that API, not a mechanical merge, so I left it rather than resolving it for you.

#8930 (ELF archive grouping) and #9289 (scrypt cost parameters) — merged via #9314, with your original commits and authorship preserved.

I verified the scrypt fix directly rather than taking the table on trust: the parity fixture runs identically under the pinned Node 26.5.1 oracle and the compiled binary, all four sections including the maxmem RangeError. It's also non-vacuous by construction — six distinct digests across N=2¹²…2¹⁷, where the pre-fix code returned one constant, so it could not have matched more than a single row. Nice find; the "silent and survives an audit" framing is exactly right, and a stored parameter string that lies about the work factor is the part that makes it worth prioritising.

One mechanical note: build_and_run.rs sat at 1994 lines, so #8930's 8-line call pushed it over the 2000-line gate. I split the HarmonyOS native-object block into a sibling module in the same PR.

Closing this, since everything in it has now either landed or been superseded. If you want the broader HeadersInit handling from #8968, a fresh PR against current main would be the cleanest route — the generalisation may well still be worth having on top of what #8982 landed.

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.

1 participant