Skip to content

ci: fix main's mechanical and stale reds (fmt, clippy, tokio-ban, tls-budget, Windows dladdr, stale ledgers); list the GC-audit reds for their authors - #14604

Merged
TheHypnoo merged 12 commits into
PerryTS:mainfrom
raliclo:fix/main-green
Nov 13, 2026

Conversation

@raliclo

@raliclo raliclo commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

main fails lint, check, tokio-ban, tls-budget and wasi-execution on every PR (recently merged PRs carry the same reds). This PR fixes the reds that are mechanical or stale and lists the rest — the GC-safety audits — for the authors to classify, because a wrong verdict there would turn a gate green while removing the check it exists for.

Based on c9b18ad22a (current main). It includes #14593 and #14594; those can be closed if this lands.

What this PR fixes

commit change verified locally (macOS arm64)
c9ed857e1f fix(tests): drop the empty [[package]] left in the next-app-route fixture lock tokio-ban: python3 scripts/tokio_inventory.py --offline KeyError → clean (offline); --self-test and test_tokio_gate.py OK
202599141d fix(runtime): wpfacts_check family SCRATCH uses perry_thread_local! tls-budget: check_thread_locals.py FAIL → OK; --self-test OK; cargo test -p perry-runtime --lib wpfacts_check 10 passed
b1c63a6eaf fix(clippy): the two clippy errors that fail check check: cargo clippy -p perry --bins and the host-compatible workspace clippy (CI command) both exit 0; cargo test -p perry-runtime --lib math 9 passed; constants bit-identical
71816996a1 fix(runtime): dladdr is POSIX; Windows builds take the unknown result lint Windows type-check (E0425 ×4). Not run locally (needs the MSVC SDK via xwin); unix path unchanged
3009c395ec chore(gates): delete ledger entries the gates report as stale only entries each gate itself lists as stale; native_handle_ledger.py --no-raise-vs upstream/main: tables 116→114, none raised
3f9b7ec3e9 test(gc): register the two rooting witnesses of 43d4dd5 in the gc corpus check_test_registration.py and --self-test OK. The two tests were not run under the GC matrix locally
9a26e83c24 docs(agents): keep placeholders out of the path code spans check_gc_doc_claims.py and --self-test OK
50bb907b04 style: cargo fmt --all cargo fmt --all -- --check OK
717501869b chore(gates): re-record six file-size allowlist counts after cargo fmt check_file_size.sh OK; only the six formatting-changed counts

Rules followed: no ceiling or baseline is raised; a ledger entry is deleted only where the gate itself reports it stale and the name does not reappear as a new or moved holder; nothing is classified on the authors' behalf.

The element-identity cargo-test failure is already fixed on main by 398e5b4 (my #14598 took the same approach and is superseded).

What this PR does not fix (needs the authors)

These require a GC-safety verdict per site (what the slot can hold, whether a barrier or root covers it). Output below is from this branch.

gate why it needs the author
Address-classification audit new GcHeader casts and the layout_slot.rs handle floor (the push_pop.rs entry moved with its call into grow_backing_unguarded, split out by 8abbab5; that also fixes the cargo-test failure native_string_validators_use_canonical_classifier)
GC store-site inventory raw slot copies/writes need a GC_STORE_AUDIT(<class>) verdict; the class_field_set witness may have moved rather than vanished
Local binding type-proof audit one unclassified local-type read
Reference-test audit raw pointer-tag test count rose 8→9
SSO string-unboxing inventory proof source changed; fallback path needs re-checking
Object-header shape-descriptor census perry_probe_get bypasses the receiver-layout authority
Runtime GC-pointer holder custody audit new holders, changed pinned sources, unclassified holders (the stale entries are removed by this PR)
… --self-test fails on main too, on the same changed-source pins
Thread-exit custody of address-keyed globals 40 globals without a verdict (the one stale entry is removed by this PR) — full text in a comment below
Poll-capable reach audit ALLOC_RE symbols that call a poll-capable symbol
Native-handle ledger ratchet write_file_input/deferred.rs and gc/life_why.rs (from e6c71cd): each a new table over a ceiling of 0 (the two stale rows are removed by this PR)
GC matrix liveness gate fixture-env routing self-test: compile_env == {"PERRY_WRITE_BARRIERS": "0"} fails
Per-test global sinks asserted-global review sources changed
Raw-handle debt ratchet 1198 sites vs baseline 861 — full text in a comment below
String payload-access inventory 336 lines — full text in a comment below

Other jobs, not touched here:

  • wasi-execution: const _: () = assert!(size_of::<RecordArrayHeader>() == 24) (crates/perry-runtime/src/record_array.rs, wpfacts, codegen, runtime: an Array of value records is a record array (value records VR-4b) #14487) fails on wasm32, where the header holds a 4-byte pointer. Whether codegen relies on the 24 on 32-bit targets decides the fix.
  • gap-suite parity regressions and the gc-stress fan-in failure were not examined.
  • Two lint steps fail only on macOS (Array-type predicate lint self-test: BSD grep; Validate Windows LLVM runtime npm staging: no llvm-objcopy); both pass in CI.
Address-classification audit — addr_class
crates/perry-runtime/src/array/push_pop.rs:285: direct classify_heap_generation; use the canonical tracked/string header classifier
crates/perry-runtime/src/array/push_pop.rs grow_backing_to classify_heap_generation: 0 references, justified count 1 (new call or stale exception)
addr-class RATCHET FAILED — a file gained a site in a rule that is
frozen at its current count. Use the predicates in
crates/perry-runtime/src/value/addr_class.rs (is_handle_band /
is_above_handle_band / try_read_gc_header) instead of a hand-rolled
address floor or a bare is_valid_obj_ptr guard: neither rejects the
fetch/zlib/proxy handle bands on Linux, and dereferencing a handle
segfaults there while macOS silently hides it (#1843, #4004, #4665,
#4800, #6271).

  [handle-floor] crates/perry-runtime/src/layout_slot.rs: 1 site(s), baseline allows 0
      line 85: if arr.is_null() || (arr as usize) < crate::gc::GC_HEADER_SIZE + 0x1000 {

Address-classification audit failed; use the predicates/constants in
crates/perry-runtime/src/value/addr_class.rs (is_handle_band /
is_small_handle / is_proxy_id_band / try_read_gc_header / ...) instead
of re-typing band literals or casting to GcHeader, or add a justified
entry to scripts/addr_class_allowlist.txt:
  crates/perry-runtime/src/arena/alloc_life.rs:289: [gcheader-cast] let h = addr as *const crate::gc::GcHeader;
  crates/perry-runtime/src/arena/alloc_life.rs:401: [gcheader-cast] let header = (data as usize + aligned) as *const crate::gc::GcHeader;
  crates/perry-runtime/src/arena/alloc_life.rs:500: [gcheader-cast] let header = (addr - crate::gc::GC_HEADER_SIZE) as *const crate::gc::GcHeader;
  crates/perry-runtime/src/array/fill_birth.rs:132: [gcheader-cast] let header = (arr as *mut u8).sub(crate::gc::GC_HEADER_SIZE) as *mut crate::gc::GcHeader;
  crates/perry-runtime/src/layout_slot.rs:88: [gcheader-cast] let h = (arr as *mut u8).sub(crate::gc::GC_HEADER_SIZE) as *mut crate::gc::GcHeader;
  crates/perry-runtime/src/wpfacts_check/life_measure.rs:649: [gcheader-cast] let header = (s.addr - crate::gc::GC_HEADER_SIZE) as *const crate::gc::GcHeader;
  crates/perry-runtime/src/wpfacts_check/life_measure.rs:692: [gcheader-cast] unsafe { (*((addr - crate::gc::GC_HEADER_SIZE) as *const crate::gc::GcHeader)).size }
GC store-site inventory — gc_store_site
GC store-site inventory failed; add nearby GC_STORE_AUDIT markers:
  crates/perry-runtime/src/async_module.rs:55: raw slot write: slot.write(value);
  crates/perry-runtime/src/module_require/init_guard_tests.rs:22: raw slot write: guards.write(1);
  crates/perry-runtime/src/module_require/init_guard_tests.rs:23: raw slot write: guards.add(1).write(1);
  crates/perry-runtime/src/record_array.rs:213: raw slot copy: std::ptr::copy_nonoverlapping(
  crates/perry-runtime/src/record_array.rs:239: raw slot copy: std::ptr::copy_nonoverlapping((*header).elems.add(slot as usize * words), dst, words);
  crates/perry-runtime/src/typedarray/slice_ops.rs:258: raw slot write: (base.add(i * 8) as *mut u64).write_unaligned(word);
  crates/perry-runtime/src/typedarray/slice_ops.rs:260: raw slot write: (base.add(total - 8) as *mut u64).write_unaligned(word);

Accepted marker form: // GC_STORE_AUDIT(BARRIERED): reason, with class one of BARRIERED, EXTERNAL_BARRIERED, INIT, POINTER_FREE, ROOT, STACK
Or add a justified entry to scripts/gc_store_site_allowlist.txt.
GC store-site CLAIM verification failed (#8185):
  IR witness registry entry 'class_field_set' matches no emitter call site — stale evidence; delete the registry entry (and its probe) with the site it covered
Local binding type-proof audit — local_binding
local-binding-type audit: unclassified local-type read: crates/perry-codegen/src/proto_constants.rs::iterator_member_site [local_type_hint] at lines 1038
Reference-test audit — reference_test
crates/perry-runtime/src/value/dyn_index.rs js_dyn_index_set_strict: 9 raw pointer-tag tests, justified count 8 (new test or stale exception)
SSO string-unboxing inventory — sso_unbox
SSO review {'path': 'crates/perry-runtime/src/string/concat_parts.rs', 'function': 'concat_parts_general', 'body_sha256': '789e94bde8a9fe6da107c3d2bdf9967d185717885454b07aebb68e349eeb00ed', 'claim': 'Only a part tagged exactly 0x7FFF (STRING_TAG) that passes is_valid_string_ptr is read as a StringHeader. Inline strings carry SHORT_STRING_TAG, miss that arm and the number/int32 arms, and reach js_jsvalue_to_string, which materializes a heap string that is then rooted; no inline payload is dereferenced as a header.', 'rule': 'mask-cast', 'support_files': []}: reviewed function changed; recheck its SSO proof
SSO proof source crates/perry-runtime/src/node_stream_event_emitter.rs: proof source changed; recheck fallback/decline path
SSO proof source crates/perry-runtime/src/string/concat.rs: proof source changed; recheck fallback/decline path
SSO proof source crates/perry-runtime/src/object/builtin_proto_entries.rs: proof source changed; recheck fallback/decline path
SSO proof source crates/perry-runtime/src/object/property_ops/put_value.rs: proof source changed; recheck fallback/decline path
SSO proof source crates/perry-runtime/src/array/join.rs: proof source changed; recheck fallback/decline path
Object-header shape-descriptor census — shape_census
::error::shape_descriptor_census: perry_probe_get bypasses the receiver-layout authority
Runtime GC-pointer holder custody audit — root_holders

gc_runtime_root_holders: NEW identity-ratcheted holders not pinned in
the inventory's `frontier` list. This covers perry-ui* callback tables
and otherwise-unclassified core raw/Perry thread-local declarations.
Register a scanner that reaches the holder, record a researched verdict
where the gated rules apply, or pin existing debt deliberately — with the
understanding that a pinned entry is not a GC-safety verdict.

  crates/perry-runtime/src/arena/alloc_life.rs:114: RNG: Cell<u64>  [rule T]
  crates/perry-runtime/src/buffer/pool.rs:10: POOL_BASE: Cell<u32>  [rule T]
  crates/perry-runtime/src/buffer/pool.rs:11: POOL_SIZE: Cell<u32>  [rule T]
  crates/perry-runtime/src/fs/stream/write_file_input/deferred.rs:40: NEXT_OPERATION: Cell<usize>  [rule T]
  crates/perry-runtime/src/gc/cycle_malloc_trim.rs:255: TEST_MIMALLOC_FORCED_PURGES: Cell<usize>  [rule T]
  crates/perry-runtime/src/gc/cycle_malloc_trim.rs:286: LAST_REGION_GROWTH_PURGE: Cell<Option<Instant>>  [rule T]
  crates/perry-runtime/src/gc/cycle_malloc_trim.rs:322: TEST_REGION_GROWTH_PURGE_CHECKS: Cell<usize>  [rule T]
  crates/perry-runtime/src/object/deferred_namespace.rs:208: READY_STACK: std::cell::RefCell<Vec<usize>>  [rule T]
  crates/perry-runtime/src/object/global_this/populate.rs:1136: BIRTHING: std::cell::Cell<u8>  [rule T]
  crates/perry-runtime/src/promise/spec_combinators.rs:575: FAST_ARM_ELEMENTS: std::cell::Cell<u64>  [rule T]
  crates/perry-stdlib/src/readline/test_support.rs:6: DATA_COUNT: RefCell<usize>  [rule T]
  crates/perry-stdlib/src/readline/test_support.rs:7: KEYPRESS_NAMES: RefCell<Vec<String>>  [rule T]

gc_runtime_root_holders: the inventory itself is malformed. Each of
these entries silences a holder without recording a usable reason.

  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/census.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/cycle.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/arena/inline.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/mod.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/policy.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/allocation_pacing.rs; re-audit the window before updating its pin
  crates/perry-runtime/src/string/intern.rs:INTERN_TABLE: weak cache source changed; re-audit before refreshing pins
Unclassified runtime GC-pointer holders (#7231).

Each of these is a process-global or thread-local whose type can hold a
pointer into the GC heap, and NO registered root scanner in its own file
mentions it. That is either a missing root — which goes bad at collection
#0 and stays bad — or a holder that does not really store a GC pointer.
Decide which, and record the decision in
scripts/gc_runtime_root_holders.json. A list nobody checks is how this
class got here.

  crates/perry-runtime/src/external_family.rs:136: INFO: AtomicUsize  [rule B]
  crates/perry-runtime/src/node_sea.rs:8: SEA_BLOB_FACTORY: AtomicUsize  [rule B]
  crates/perry-runtime/src/object/class_registry/construct.rs:1139: METHOD_CALLS: std::sync::atomic::AtomicUsize  [rule B]
`--self-test` — root_holders_selftest
gc_runtime_root_holders self-test FAILED:
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/census.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/cycle.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/arena/inline.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/mod.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/policy.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/gc/census.rs:PASS1_MARKED: non_moving_snapshot source changed: crates/perry-runtime/src/gc/allocation_pacing.rs; re-audit the window before updating its pin
  - crates/perry-runtime/src/string/intern.rs:INTERN_TABLE: weak cache source changed; re-audit before refreshing pins
Poll-capable reach audit — poll_reach
error: ALLOC_RE symbols that CALL a POLL_CAPABLE_RUNTIME symbol but are not in POLL_CAPABLE_RUNTIME:
  js_array_flat                                    -> js_array_flat_depth
  js_array_flat_depth                              -> js_number_coerce
  js_object_assign_fresh                           -> js_object_assign_one
The checker knows this call's result is a heap value it must track (ALLOC_RE) and knows the thing it calls can re-enter JS or run a moving minor (POLL_CAPABLE_RUNTIME), and refuses to put the two together: a window whose only collection point is one of these classifies MOVING: no, so every `--moving-only` arm -- which is every gated arm, in all four modes -- drops it. That is #7616 exactly. Add the symbol to POLL_CAPABLE_RUNTIME.
=== poll reach: 4506 exported symbols, 1648 with an intra-runtime call edge, 420 matched by ALLOC_RE
Native-handle ledger ratchet — native_ledger
native-handle ledger: 114 tables (ceiling 114), 116 producers (ceiling 116)
::error::native-handle ledger has 1 violation(s)
  crates/perry-runtime/src/fs/stream/write_file_input/deferred.rs: tables 1 exceeds ceiling 0
GC matrix liveness gate — gc_matrix
GC matrix fixture env self-test: PASS (syntax, injection rejection, OFF/control isolation)
Traceback (most recent call last):
  File "scripts/gc_matrix_fixture_env.py", line 138, in <module>
    raise SystemExit(main())
                     ~~~~^^
  File "scripts/gc_matrix_fixture_env.py", line 125, in main
    self_test()
    ~~~~~~~~~^^
  File "scripts/gc_matrix_fixture_env.py", line 113, in self_test
    routing_self_test()
    ~~~~~~~~~~~~~~~~~^^
  File "tests/tooling/infrastructure/gc/gc_matrix_fixture_env_test.py", line 175, in self_test
    check_receipts(root, run_probe(root, matrix))
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "tests/tooling/infrastructure/gc/gc_matrix_fixture_env_test.py", line 88, in check_receipts
    assert compile_env == {"PERRY_WRITE_BARRIERS": "0"}
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
Per-test global sinks — global_sinks
changed asserted-global review source: crates/perry-runtime/src/buffer/backing.rs::LIVE_BACKINGS: crates/perry-runtime/src/test_support.rs
changed asserted-global review source: crates/perry-runtime/src/loop_interrupt.rs::PERRY_LOOP_INTERRUPT_ARMED: crates/perry-runtime/src/loop_interrupt.rs
changed asserted-global review source: crates/perry-runtime/src/loop_interrupt.rs::PERRY_LOOP_INTERRUPT_ARMED: crates/perry-runtime/src/test_support.rs
changed asserted-global review source: crates/perry-runtime/src/object/class_family_birth.rs::LAYOUT: crates/perry-runtime/src/object/class_family_birth.rs
changed asserted-global review source: crates/perry-runtime/src/object/class_family_birth.rs::LAYOUT: crates/perry-runtime/src/object/layout_desc.rs
changed asserted-global review source: crates/perry-runtime/src/object/class_family_birth.rs::LAYOUT: crates/perry-runtime/src/object/layout_desc/store.rs
changed asserted-global review source: crates/perry-runtime/src/object/function_family_birth_tests.rs::LAYOUT: crates/perry-runtime/src/object/layout_desc.rs
changed asserted-global review source: crates/perry-runtime/src/object/function_family_birth_tests.rs::LAYOUT: crates/perry-runtime/src/object/layout_desc/store.rs
changed asserted-global review source: crates/perry-runtime/src/object/own_override.rs::PERRY_OWN_NAMED_PROP_INSTALLED: crates/perry-runtime/src/object/own_override.rs
changed asserted-global review source: crates/perry-runtime/src/object/own_override.rs::PERRY_OWN_NAMED_PROP_INSTALLED: crates/perry-runtime/src/test_support.rs
changed asserted-global review source: crates/perry-runtime/src/tls_os_pool/tests.rs::DROPS: crates/perry-runtime/src/tls_os_pool/tests.rs
changed asserted-global review source: crates/perry-runtime/src/exception.rs::ON: crates/perry-runtime/src/exception.rs
per-test global sinks (#7672): 17 clear helper(s) reached from reset_copying_nursery_runtime_test_state, plus the guards' own module
  reset_for_test                           AGENT_LOOP=thread_local, STAGED=thread_local, STATE=thread_local
  reset_registration_for_tests             REGEX_CACHE=thread_local
  test_clear_all_timer_scanner_roots       (no static storage)
  test_clear_arguments_object_roots        ARGUMENTS_KEYS=thread_local, ARGUMENTS_SHAPES=thread_local, RESTRICTED_CALLEE_PAIR=thread_local
  test_clear_class_side_table_roots        CLASS_DECLARED_STATIC_GLOBAL_SLOTS=thread_local, CLASS_PARENT_CLOSURES=thread_local, CLASS_PROTOTYPE_ADDR_COUNTS=thread_local, CLASS_PROTOTYPE_OBJECTS=thread_local, NEXT_SYNTHETIC_CLASS_ID=per_test
  test_clear_geisterhand_roots             PENDING_ACTIONS=per_test, REGISTRY=per_test
  test_clear_object_cache_roots            FS_CONSTANTS_CACHE=thread_local, GLOBAL_THIS_PTR=per_test, GLOBAL_THIS_READY=per_test, HTTP_METHODS_CACHE=thread_local, OS_CONSTANTS_CACHE=thread_local, OS_CONSTANTS_DLOPEN_CACHE=thread_local, OS_CONSTANTS_ERRNO_CACHE=thread_local, OS_CONSTANTS_PRIORITY_CACHE=thread_local, OS_CONSTANTS_SIGNALS_CACHE=thread_local
  test_clear_parse_roots                   PARSE_ROOTS=thread_local, PARSE_SHAPE_CACHE=thread_local
  test_clear_plugin_roots                  REGISTRY=static
  test_clear_process_event_listeners       PROCESS_EMITTER=thread_local
  test_clear_promise_scanner_roots         CURRENT_MICROTASK_CALLBACK=thread_local, CURRENT_MICROTASK_NEXT=thread_local, CURRENT_MICROTASK_PROMISE=thread_local, CURRENT_MICROTASK_VALUE=thread_local, INLINE_TRAP=thread_local, MICROTASK_PREV_CONTEXTS=thread_local, SCHEDULED_RESOLVES=thread_local, TASK_QUEUE=thread_local
  test_clear_singleton_closure_caches      CAPTURED_MISS_STREAK=thread_local, SINGLETON_CAPTURED_CLOSURES=thread_local, SINGLETON_CLOSURES=thread_local
  test_clear_transition_cache_root         TRANSITION_CACHE_YOUNG=thread_local
  test_clear_trim_cache                    (no static storage)
  test_clear_ui_text_registry_roots        FOREACH_REGISTRY=per_test, STATE_VALUES=per_test
  test_reset_young_pin_latch               YOUNG_PIN_EVER=static
  test_set_console_log_singleton           CONSOLE_LOG_SINGLETON=per_test
  gc/tests/support.rs (the guards themselves) COPYING_NURSERY_TEST_LOCK=lock, FFI_MUTABLE_ROOT_SCANNERS=thread_local, FFI_ROOT_SCANNERS=thread_local, GC_INIT_DONE=thread_local, GC_MALLOC_COUNT_STEP=thread_local, GC_NEXT_MALLOC_TRIGGER=thread_local, GC_NEXT_TRIGGER_BYTES=thread_local, GC_STATS=thread_local, GENERATED_BARRIER_TEST_LOCK=lock, GENERATED_WRITE_BARRIERS_EMITTED=per_test, GLOBAL_ROOTS=thread_local, MALLOC_STATE=thread_local, MUTABLE_ROOT_SCANNERS=thread_local, OLD_ARENA=thread_local, PLUGIN_REGISTRY_TEST_LOCK=lock, PRECISE_ROOT_VERIFICATION=thread_local, ROOT_SCANNERS=thread_local, SHADOW=thread_local, TEST_COPY_ONLY_ROOTS=thread_local, YOUNG_LEAF_COUNTER=static
  -> 0 hazard(s), 3 allowlisted, 62 static(s) classified

Rebasing

style: cargo fmt and the file-size counts are regenerated, not cherry-picked: cargo fmt --all && ./scripts/check_file_size.sh --update.

Checklist

  • I have NOT bumped the workspace version or edited CHANGELOG.md
  • My commits follow the loose feat: / fix: / docs: / chore: prefix convention used in the log
  • I've read CONTRIBUTING.md and agree to the Code of Conduct

🤖 Generated with Claude Code

https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

Summary by CodeRabbit

  • Bug Fixes

    • Improved top-level await module initialization and handling of deferred namespace imports.
    • Improved reliability of promise resolution and value handling during garbage collection.
    • Fixed build and diagnostic compatibility issues on non-Unix platforms.
  • Improvements

    • Expanded coverage for garbage-collection and runtime behavior, helping catch regressions.

@raliclo

raliclo commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Full output of raw_handle on this branch (category: needs the authors).

raw_handle
raw-handle debt sites: 1198 (baseline 861)
::error::per-module raw-handle rules: 128 violation(s)
  crates/perry-runtime/src/array/exotic_snapshot.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/array/flat_clone.rs: raw-handle debt count 5 exceeds its ceiling of 4
  crates/perry-runtime/src/array/from_concat.rs: 7 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/array/immutable.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/array/push_pop/growth.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/async_hooks/resource_methods.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/access.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/cmp.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/detach.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/from.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/iter.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/buffer/u8_codec.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/builtins/console.rs: raw-handle debt count 24 exceeds its ceiling of 7
  crates/perry-runtime/src/closure/entry_bundle.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/closure/registry.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/async_value.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/asynchronous.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/asynchronous/imports.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/callback/batch.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/callback/saved.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/cleanup.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/guest/frame/suspended.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/guest/resource_cleanup.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/guest/resources.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/host_resource.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/http.rs: 6 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/mod.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/persistent/imports.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/persistent/operations.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/persistent/records.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/persistent/submit.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/producer.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/resource.rs: 6 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/value.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/value/retention.rs: 7 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/component/writer.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/event_target.rs: raw-handle debt count 14 exceeds its ceiling of 13
  crates/perry-runtime/src/event_target/message_event.rs: 9 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/fs/dir_glob_watch/watch.rs: raw-handle debt count 4 exceeds its ceiling of 3
  crates/perry-runtime/src/fs/dir_glob_watch/watch_abort.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/fs/fd_ops.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/fs/stream/utf8_stream.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/fs/stream/write_file_input.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/fs/stream/write_file_input/deferred.rs: 6 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/json/raw_json.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/json/replacer.rs: raw-handle debt count 12 exceeds its ceiling of 11
  crates/perry-runtime/src/json/stringify_shape_template.rs: raw-handle debt count 3 exceeds its ceiling of 2
  crates/perry-runtime/src/messaging.rs: 6 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/messaging/broadcast_operations.rs: 6 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/messaging/port_operations.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/messaging/worker_async_dispose.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/messaging/worker_metadata.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/native_payload_birth.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_api_host/metadata/owned.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream.rs: 10 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream/async_iterator.rs: raw-handle debt count 10 exceeds its ceiling of 7
  crates/perry-runtime/src/node_stream/pipe_listeners.rs: 9 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream/proto_methods.rs: 10 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream/readable_from_iterator.rs: 7 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream/write_state.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream_constructors/builders.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream_event_emitter.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream_readwrite.rs: 7 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_stream_state_view.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/node_submodules/mod.rs: raw-handle debt count 5 exceeds its ceiling of 4
  crates/perry-runtime/src/node_v8.rs: 19 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/alloc_basic.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/arguments.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/assert.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/class_registry/construct/class_object.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/class_registry/parent_static/symbol_members.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/class_registry/state.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/deferred_namespace.rs: 10 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/delete_rest.rs: raw-handle debt count 3 exceeds its ceiling of 2
  crates/perry-runtime/src/object/field_get_set/accessors.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_get_set/class_object_props.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_get_set/class_object_template.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_get_set/entries_shape.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs: raw-handle debt count 3 exceeds its ceiling of 2
  crates/perry-runtime/src/object/field_get_set/runtime_read_site.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_get_set/runtime_store_site.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/field_set_by_name/tail.rs: raw-handle debt count 10 exceeds its ceiling of 9
  crates/perry-runtime/src/object/instanceof/shape_ancestry.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/layout_desc.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/layout_desc/store.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/native_method_install.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/native_module/callable_exports.rs: raw-handle debt count 29 exceeds its ceiling of 24
  crates/perry-runtime/src/object/native_module/class_ref_values.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/node_http_prototypes.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/object_ops/define_property.rs: raw-handle debt count 5 exceeds its ceiling of 2
  crates/perry-runtime/src/object/object_ops/descriptor_helpers.rs: raw-handle debt count 8 exceeds its ceiling of 2
  crates/perry-runtime/src/object/overflow.rs: 29 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/property_ops/metadata.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/property_ops/set.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/runtime_layouts.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/shape_store.rs: 30 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/object/string_proto_thunks.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/process/node_module.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/process/worker_restrictions.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/promise/operation_owner.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/promise/settled_step.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/regex/string_compat.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/string/concat.rs: raw-handle debt count 10 exceeds its ceiling of 7
  crates/perry-runtime/src/string/concat_parts.rs: 3 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/string/read.rs: 5 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/string/slice_ops.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/thread/clone_read.rs: 8 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/thread/clone_write.rs: 4 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/typedarray/iterate.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/typedarray/slice_ops.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/typedarray/transform.rs: raw-handle debt count 14 exceeds its ceiling of 2
  crates/perry-runtime/src/typedarray_named.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/typedarray_props.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/validators/received.rs: 2 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/value/dyn_index.rs: raw-handle debt count 5 exceeds its ceiling of 3
  crates/perry-runtime/src/value/dynamic_object.rs: 1 raw-handle debt site(s) in a module with no ceiling. New code must put real work inside RuntimeHandle::across_{mut,const,nanbox} or use with_{mut,const}_ptr; see #7341.
  crates/perry-runtime/src/weakref.rs: raw-handle debt count 10 exceeds its ceiling of 4
  crates/perry-runtime/src/gc/tests/copying.rs: ceiling of 3 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/dead_owner_side_tables.rs: ceiling of 1 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/helper_stores.rs: ceiling of 4 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/runtime_roots/callback_scanners.rs: ceiling of 47 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/runtime_roots/fs_options_object.rs: ceiling of 4 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/runtime_roots/hook_dispatch_handles.rs: ceiling of 3 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/gc/tests/runtime_roots/transient_handles.rs: ceiling of 10 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/node_stream_tests.rs: ceiling of 7 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/node_stream_tests_extra.rs: ceiling of 10 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/node_submodules/test.rs: ceiling of 4 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
  crates/perry-runtime/src/object/global_this_webassembly.rs: ceiling of 5 matches nothing -- the module is clean (or gone). DELETE its line so the cleanup cannot be undone.
Put the allocating call inside RuntimeHandle::across_{mut,const,nanbox}
for a post-call reload; empty `|| ()` closures are still debt.
Use with_{mut,const}_ptr for a scoped argument to a
non-allocating operation / self-rooting runtime entry point.
See #7341 and scripts/raw_handle_debt_files.txt.

@raliclo

raliclo commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Full output of string_payload on this branch (category: needs the authors).

string_payload
String payload-access ratchet increased:
  inline-offset | perry-runtime: baseline 327, found 336
    crates/perry-runtime/src/arkts_callbacks.rs:279: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/from_concat.rs:46: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/from_primitive_tests.rs:159: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/header.rs:435: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/indexing_keyed.rs:72: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/indexing_keyed.rs:446: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/iter_methods.rs:1509: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/iter_methods.rs:1543: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/sort.rs:74: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/array/sort.rs:740: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/bigint/convert.rs:69: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/bigint/tests.rs:526: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/cmp.rs:228: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/cmp.rs:296: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/copy_write.rs:66: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/copy_write.rs:105: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/error_object_tests.rs:10: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/exotic_view_tests.rs:76: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/exotic_view_tests.rs:481: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/from.rs:37: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/from.rs:159: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/query.rs:124: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/query.rs:254: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/query.rs:262: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/buffer/transcode.rs:37: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/arithmetic.rs:414: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:779: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:904: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:1468: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:1539: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:1646: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/console.rs:1724: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting/collections.rs:182: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting/errors.rs:11: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting/util_format.rs:235: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting/util_format.rs:629: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:213: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:559: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:618: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:638: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:1209: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:1324: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/formatting.rs:1437: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/globals.rs:178: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/globals.rs:196: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/globals.rs:221: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/numbers.rs:21: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/numbers.rs:184: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/builtins/table.rs:87: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/bun_compat/mod.rs:111: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/exec.rs:41: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/exec.rs:79: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/exec.rs:249: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/reactor.rs:874: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/v8_serde.rs:1300: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/value_util.rs:117: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/child_process/value_util.rs:158: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/cluster.rs:1655: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/collection_iter.rs:64: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/collection_iter.rs:362: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/color_parse.rs:92: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/date.rs:429: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/dgram.rs:476: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/dns.rs:174: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/error.rs:1184: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/error.rs:1474: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/event_emitter_error.rs:10: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/event_target/honest_tests.rs:38: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/event_target/prototype.rs:308: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/event_target.rs:479: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/exception.rs:644: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/fs/callbacks.rs:772: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/fs/dirent.rs:295: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/fs/mod.rs:1429: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/heap_snapshot.rs:182: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/buffer_bound_method_name.rs:49: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/buffer_bound_method_name.rs:86: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/copying/promoted_remembered_7803.rs:132: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/handle_bound_method_name.rs:74: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/handle_bound_method_name.rs:122: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/runtime_roots/json_shape_template.rs:155: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/runtime_roots/string_slice.rs:97: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/runtime_roots/transient_handles.rs:180: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/gc/tests/support.rs:863: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/geisterhand_registry.rs:275: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/intl/number_format.rs:1199: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/intl/segmenter.rs:104: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/intl.rs:209: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/mod.rs:406: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/mod.rs:908: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/parse_api.rs:397: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/parse_api.rs:525: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/parse_api.rs:554: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/parse_api.rs:946: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/raw_json.rs:155: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/reviver.rs:430: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/reviver.rs:852: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json/stringify_api.rs:433: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json_tape.rs:1169: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/json_tape.rs:1718: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/map.rs:1130: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/media_playback.rs:246: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_inspector.rs:244: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_repl.rs:124: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_stream_readwrite.rs:35: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_stream_readwrite.rs:1768: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/blob.rs:513: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/consumers.rs:256: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/diagnostics/user_props.rs:11: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/diagnostics.rs:344: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/fs_promises.rs:572: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/trace_events.rs:131: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_submodules/trace_events.rs:146: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/node_vm.rs:745: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/arguments.rs:232: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/assert.rs:28: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/assert.rs:39: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/class_registry/class_meta.rs:360: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/class_registry/prototype_objects.rs:402: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/class_value/tests.rs:547: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/collection_proto_thunks.rs:385: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/delete_rest.rs:409: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/descriptor_state/integrity.rs:47: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/descriptor_state.rs:1052: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/descriptors/builders.rs:138: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/descriptors.rs:694: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/descriptors.rs:892: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/accessors.rs:339: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/buffer_own_prop.rs:142: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/field_ops.rs:336: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:123: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:809: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:897: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:936: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:966: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1223: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1296: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1423: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1483: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1548: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1637: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1693: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1763: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name.rs:1924: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:73: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:95: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:124: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:151: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:315: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:459: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:530: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:697: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:981: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1008: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1121: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1141: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1203: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1277: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/get_field_by_name_tail.rs:1317: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:107: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:383: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:568: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:599: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:863: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:1062: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:1558: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/has_property.rs:1587: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/ic_miss.rs:219: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/ic_miss.rs:321: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/ic_miss.rs:339: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/map_set_receiver.rs:31: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set/probe_dispatch.rs:16: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_get_set.rs:396: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/attr_variants.rs:36: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/attr_variants.rs:77: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:84: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:169: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:208: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:341: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:764: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/tail.rs:850: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/write_helpers.rs:18: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/write_helpers.rs:37: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/write_helpers.rs:82: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/write_helpers.rs:99: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name/write_helpers.rs:167: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name.rs:373: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name.rs:433: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name.rs:473: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name.rs:633: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/field_set_by_name.rs:654: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this/array_error.rs:408: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this/declaration_keys_tests.rs:17: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this/fetch_globals.rs:186: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this/math_temporal.rs:560: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this/typed_array.rs:476: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this_webassembly.rs:263: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this_webassembly.rs:1332: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/global_this_webassembly.rs:1347: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/groupby.rs:239: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/http_handle_prototype.rs:52: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/http_handle_prototype.rs:96: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/http_handle_prototype.rs:105: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/keys_lookup.rs:37: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/layout_probe.rs:1381: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_call_method/to_locale_string_tests.rs:33: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_call_method/to_locale_string_tests.rs:174: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module/class_ref_values.rs:86: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module/namespace_builders.rs:152: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module/vtable_impls.rs:19: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module/web_locks.rs:90: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module_dispatch.rs:17: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module_dispatch.rs:31: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/native_module_dispatch.rs:321: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_literal_ops.rs:227: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/define_property.rs:777: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/define_property.rs:960: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/define_property.rs:1028: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/has_own.rs:668: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/has_own.rs:745: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/keys_array.rs:266: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/keys_array.rs:407: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops/keys_array.rs:899: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/object_ops_frozen.rs:709: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/polymorphic_index.rs:607: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/property_key.rs:401: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/property_key.rs:436: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/property_key.rs:510: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/property_ops/metadata.rs:252: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/property_ops/set.rs:335: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/prototype_chain.rs:1057: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/reflect_support.rs:321: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/regex_proto_thunks.rs:340: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/temporal_proto.rs:33: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/tests.rs:66: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/to_string_tag.rs:140: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/to_string_tag.rs:543: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/typed_array_define.rs:93: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/object/typed_array_define.rs:130: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/ohos_napi.rs:204: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/os/chdir.rs:21: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/os/signal.rs:1043: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/os.rs:1583: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/os_process_stream_write.rs:122: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/os_process_streams.rs:1251: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/path/tests.rs:345: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/path.rs:19: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/perf_histogram.rs:509: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/perf_hooks.rs:329: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/plugin.rs:377: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/attributes.rs:124: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/credentials.rs:338: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/env_misc.rs:254: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/env_misc.rs:560: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/env_misc.rs:1026: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/env_misc.rs:1257: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/env_misc.rs:1677: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process/ipc.rs:466: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/process.rs:708: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/promise/async_step.rs:1265: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/promise/combinators.rs:166: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/promise/native_async.rs:881: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/proxy/own_keys.rs:60: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/readline_helpers.rs:157: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/regex/perex_lead.rs:328: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/regex.rs:397: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/regex.rs:450: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/set.rs:460: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/set.rs:461: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/set.rs:520: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/static_plugins.rs:24: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/append.rs:50: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/append.rs:110: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/append.rs:125: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/append.rs:160: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/append.rs:161: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/compare/keys.rs:41: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/compare/keys.rs:70: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/compare/keys.rs:118: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:567: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:606: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:607: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:624: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:631: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:650: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:652: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/intern.rs:660: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:319: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:812: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:860: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:870: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:1011: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/mod.rs:1282: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/string/tests.rs:1744: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/symbol/properties.rs:578: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/symbol.rs:210: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/symbol.rs:596: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/temporal/dispatch.rs:137: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/text.rs:429: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/text.rs:457: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/text.rs:600: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/text.rs:993: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/text.rs:1122: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/thread/clone_write.rs:1565: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/thread/error_stack_clone_tests.rs:93: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/tty.rs:1359: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/tui/ffi.rs:486: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/tui/ffi.rs:911: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/tui/hooks.rs:857: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/typed_feedback.rs:1169: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/typedarray/slice_ops.rs:32: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/ui_text_registry.rs:65: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/update_notify.rs:1628: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/search_params.rs:379: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/url_class.rs:192: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/url_class.rs:215: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/url_class.rs:226: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/url_class.rs:557: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/url/url_class.rs:600: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/util_debuglog.rs:53: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/util_mime.rs:55: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/util_parse_args.rs:845: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/v8.rs:82: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/validators/received.rs:502: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/validators/received.rs:560: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/addr_class.rs:932: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/addr_class.rs:951: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/boxed_text.rs:61: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/dyn_index.rs:148: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/dynamic_array.rs:201: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/nanbox.rs:523: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/to_string.rs:58: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/to_string.rs:584: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/value/to_string_radix.rs:44: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/web_storage.rs:509: [inline-offset] open-coded StringHeader payload offset
    crates/perry-runtime/src/webassembly.rs:159: [inline-offset] open-coded StringHeader payload offset
Run: python3 scripts/string_payload_access_inventory.py --write-baseline

@raliclo

raliclo commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Full output of thread_exit on this branch (category: needs the authors).

thread_exit
thread_exit_address_globals: crates/perry-runtime/src/arena/region.rs:REGIONS: allocation-lifetime source changed: crates/perry-runtime/src/arena/region.rs; re-audit custody
thread_exit_address_globals: crates/perry-runtime/src/arena/region.rs:REGIONS: allocation-lifetime source changed: crates/perry-runtime/src/arena/block.rs; re-audit custody
thread_exit_address_globals: crates/perry-runtime/src/arena/alloc_life.rs:37: `INTERVAL: AtomicUsize` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/async_context.rs:416: `CONTEXT_GUARDS: crate::exception::marks::CatchStackKey<ContextGuardAction>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/contracts.rs:116: `CLAIMS: OnceLock<HashMap<u32, Claim>>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/lib.rs:538: `PUMP_DEPTH: crate::exception::marks::CatchStackKey<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/map.rs:20: `MAP_FOREACH_STACK: crate::exception::marks::CatchStackKey<usize>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/messaging/port_transport.rs:32: `TRANSPORT: LazyLock<Mutex<Transport>>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/node_api_host/loader.rs:179: `LINKED: std::sync::OnceLock<Linked>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/node_stream_constructors/web_adapter.rs:50: `WEB_READABLE_FROM_SOURCE_PTR: AtomicPtr<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/node_stream_constructors/web_adapter.rs:51: `WEB_WRITABLE_FROM_SINK_PTR: AtomicPtr<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/node_stream_constructors/web_adapter.rs:52: `WEB_TRANSFORM_FROM_TRANSFORMER_PTR: AtomicPtr<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/call_method_depth.rs:11: `CALL_METHOD_DEPTH: crate::exception::marks::CatchStackKey<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/class_handles.rs:185: `HTTP_SERVER_HANDLE_KIND_PROBE_PTR: AtomicPtr<()>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/field_get_set/ic_miss/private_member_access.rs:9: `PRIVATE_MEMBER_ACCESS_HINTS: crate::exception::marks::CatchStackKey<PrivateMemberAccessHint>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/field_get_set/ic_miss.rs:499: `PRIVATE_LEXICAL_BRAND_STACK: crate::exception::marks::CatchStackKey<u64>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/native_call_method/namespace_override.rs:14: `RUNNING: crate::exception::marks::CatchStackKey<(String, String)>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/prototype_chain.rs:41: `PROTOTYPE_RESOLUTION_STACK: crate::exception::marks::CatchStackKey<u64>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/this_binding.rs:28: `STATIC_PRIVATE_OWNER_STACK: crate::exception::marks::CatchStackKey<u64>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/object/this_binding.rs:366: `DERIVED_SUPER_BINDING_STACK: crate::exception::marks::CatchStackKey<DerivedSuperBinding>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/set.rs:36: `SET_FOREACH_STACK: crate::exception::marks::CatchStackKey<usize>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/snap_census/runner.rs:59: `ANCHOR: Anchor` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/snap_census/runner.rs:5354: `EXE_TEXT: [std::sync::atomic::AtomicUsize; 3]` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/string/short_pair.rs:161: `TAKEN: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/string/short_pair.rs:162: `DECLINED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/turnloop_pool/mod.rs:222: `FAILED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/family.rs:38: `NEVER: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/family.rs:39: `SITE: AtomicI64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/family.rs:40: `SITE_LEN: AtomicI64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:68: `DEATHS: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:69: `UNBORN: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:70: `NON_YOUNG: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:71: `EXACT: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:72: `CHECKED_MINORS: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:73: `DROPPED_UNOBSERVED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:74: `DIED_IN_CALL: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-runtime/src/wpfacts_check/life.rs:75: `BETS_FAILED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-stdlib/src/crypto/uuid.rs:153: `SEQUENCE: Mutex<Sequence>` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-stdlib/src/turnloop_client/mod.rs:132: `DECLINED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: crates/perry-stdlib/src/turnloop_client/mod.rs:134: `FAILED: AtomicU64` is a process-global static that can hold a heap address and has no thread-exit verdict in thread_exit_address_globals.json. After its thread exits, Arena::drop frees the memory and another thread reuses it (#11471): invalidate it there, make it per-thread, or record why it cannot hold an arena address.
thread_exit_address_globals: 1405 candidates, 170 counter-only, 481 classified by entry, 0 pending_fix group(s), 40 problem(s)

raliclo pushed a commit to raliclo/perry that referenced this pull request Nov 13, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
@coderabbitai

coderabbitai Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

The pull request changes top-level-await module initialization, promise rooting and fact analysis, and non-Unix symbol handling. It also adds a module-scope binding test and GC-rooting witnesses. Most other edits reformat code, reorder declarations, or update supporting repository records.

Changes: Compiler and module initialization

Layer / File(s) Summary
Top-level-await module initialization
crates/perry-codegen/src/codegen/entry/module_init.rs, crates/perry-codegen/src/codegen/entry/*, crates/perry/src/commands/compile/*
Top-level-await programs no longer emit the per-module guarded initializer, evaluation wrapper, dependency initialization calls, or dependency declarations in the affected code-generation block. Related code is reformatted or reordered.
Compiler and transform maintenance
crates/perry-codegen/src/*, crates/perry-transform/src/*, crates/perry-hir/src/*
Most changes reformat existing expressions and tests or reorder declarations. The HIR tests add a case for a block-local binding followed by a store to a module-level name.

Runtime and platform compatibility

Layer / File(s) Summary
Platform symbol handling
crates/perry-runtime/src/arena/alloc_life.rs, crates/perry-runtime/src/gc/life_why.rs, crates/perry-runtime/src/wpfacts_check/life.rs
Unix builds retain dladdr symbol lookup. Non-Unix builds use fallback implementations for image-base and symbol lookup.
Promise and runtime updates
crates/perry-runtime/src/promise/*, crates/perry-runtime/src/object/*, crates/perry-runtime/src/arena/*
js_promise_resolved reloads the promise address from its GC root after allocating the constructor key. Other runtime changes primarily reformat code and tests or reorder declarations.
HTTP and streams
crates/perry-ext-http/src/server/*, crates/perry-stdlib/src/streams/*, crates/perry-ext-zlib/src/stream/tests.rs
HTTP callback calls and stream-related expressions are reformatted. The described call arguments and behavior remain unchanged.

Facts analysis and repository support

Layer / File(s) Summary
Native-promise fact handling and tests
crates/perry-wpfacts/src/solve/*, crates/perry-wpfacts/src/tests/*
For locked native-promise then values, the solver loads the chain into a separate node and filters it through Cons::Defined before connecting the promise’s own field to the read node. One browser-effects test adds a DOMException.prototype receiver assertion.
Documentation and CI records
AGENTS.md, changelog.d/*, scripts/*, tests/parity/*
The parity-test guidance changes its documented path layout. The changelog records reported CI fixes. Repository inventories and file-size counts are updated, and two GC-rooting witnesses are registered.

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Other

Suggested reviewers: proggeramlug

Merge Risk: Low · up to bfc15

This PR mostly reformats code and updates CI records. It also changes how top-level-await modules are initialized and adds non-Unix fallbacks. Nothing indicates a defect, but the top-level-await initialization change and the Windows type-check were not verified locally, so owners should confirm them in CI before relying on them.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title names the main change: a CI fix for main's mechanical and stale failures (fmt, clippy, tokio-ban, tls-budget, Windows dladdr, stale ledgers). The changeset matches: it has fmt-only reflows, …
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The description follows the template's main purpose and gives detailed, relevant context. It has a summary, a table of changes with local verification notes, a clear list of unresolved gate failures, …
Full details: Title check

Explanation

The title names the main change: a CI fix for main's mechanical and stale failures (fmt, clippy, tokio-ban, tls-budget, Windows dladdr, stale ledgers). The changeset matches: it has fmt-only reflows, two clippy fixes, a dladdr Unix gate, a perry_thread_local change, and removal of stale ledger entries. The title also mentions listing the GC-audit failures for their authors, which the description and the changelog-free docs support, though that part is a documentation of unfixed items rather than code changes. The title is long (150 characters) but still specific.

Full details: Description check

Explanation

The description follows the template's main purpose and gives detailed, relevant context. It has a summary, a table of changes with local verification notes, a clear list of unresolved gate failures, and a checklist. It does not follow the template's section headings: it lacks the 'Changes' and 'Related issue' headings, and the 'Test plan' is a results table rather than the template's checkbox list. The description references #14593, #14594, and #14598 but does not use the template's 'Fixes #123' or 'n/a' line. The template's checklist items for CHANGELOG and version bumps are marked. The 'cargo build --release' and 'cargo test --workspace' items are not explicitly confirmed, and the description says the Windows lint type-check was not run locally. Overall, the description is mostly complete and clear, with a few template sections missing or reshaped.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

Recent review info

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8063c422-786f-4449-a619-644e01510950
Commits

Reviewing files that changed from the base of the PR and between bfe1107 and bfc15c5.

Files ignored due to path filters: 4

  • crates/perry-wpfacts/src/gen/glue.rs is excluded by !**/gen/**
  • crates/perry-wpfacts/src/gen/native_result.rs is excluded by !**/gen/**
  • crates/perry-wpfacts/src/gen/walk.rs is excluded by !**/gen/**
  • tests/integration/release/packages/next-app-route/provider/Cargo.lock is excluded by !**/*.lock
Files selected for processing: 18

  • crates/perry-codegen/src/codegen/entry.rs
  • crates/perry-codegen/src/collectors/life_census.rs
  • crates/perry-codegen/src/collectors/life_claims.rs
  • crates/perry-codegen/src/verify_facts/life_measure.rs
  • crates/perry-runtime/src/arena/alloc_life.rs
  • crates/perry-runtime/src/gc/cycle/registered_root_scan.rs
  • crates/perry-runtime/src/gc/heap_snapshot.rs
  • crates/perry-runtime/src/gc/life_why.rs
  • crates/perry-runtime/src/gc/mod.rs
  • crates/perry-runtime/src/gc/oldgen.rs
  • crates/perry-runtime/src/object/field_get_set.rs
  • crates/perry-runtime/src/object/native_module/callable_exports/buffer_constructor.rs
  • crates/perry-runtime/src/value/dynamic_object.rs
  • crates/perry-runtime/src/wpfacts_check.rs
  • crates/perry-runtime/src/wpfacts_check/life.rs
  • crates/perry-runtime/src/wpfacts_check/life_measure.rs
  • crates/perry-runtime/src/wpfacts_check/life_regions.rs
  • scripts/check_file_size.sh
Files skipped from review as they are similar to previous changes: 10

  • crates/perry-codegen/src/codegen/entry.rs
  • crates/perry-codegen/src/collectors/life_census.rs
  • crates/perry-codegen/src/collectors/life_claims.rs
  • crates/perry-codegen/src/verify_facts/life_measure.rs
  • crates/perry-runtime/src/gc/mod.rs
  • crates/perry-runtime/src/object/field_get_set.rs
  • crates/perry-runtime/src/object/native_module/callable_exports/buffer_constructor.rs
  • crates/perry-runtime/src/value/dynamic_object.rs
  • crates/perry-runtime/src/wpfacts_check.rs
  • crates/perry-runtime/src/wpfacts_check/life_measure.rs

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.

@raliclo

raliclo commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Once this is in (or whichever parts you take), these PRs are independent of it and only waiting on the shared reds; each has its own unit test with a mutation check:

I will rebase each on main after this lands so they can be merged one at a time. #14595 is the design question behind #14597 (compile async bodies to WASM instead of the JS emitter); happy to follow whichever direction you choose there.

ralic and others added 10 commits November 13, 2026 09:21
…ture lock

PerryTS#14482 removed the perry-uuid entry from
tests/integration/release/packages/next-app-route/provider/Cargo.lock by hand
and kept its `[[package]]` header, so two headers sat back to back. TOML reads
that as a package table with no keys, and `scripts/tokio_inventory.py
--offline` (the `tokio-ban` job) dies on `package["name"]` with KeyError on
every PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
(cherry picked from commit cfbb112)
74304a9 added a raw `thread_local!` to
crates/perry-runtime/src/wpfacts_check/family.rs, which
`scripts/check_thread_locals.py` refuses, so `tls-budget /
self-test-checkers` fails on every PR. `crate::perry_thread_local!` takes the
same syntax and the same `.with()` calls, as `wpfacts_check/life.rs` already
does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
(cherry picked from commit 50d4c70)
- perry-wpfacts solve/strs.rs: STRS_K is usize::MAX (the cap is off, model.rs),
  so `len() > STRS_K` is always false and absurd_extreme_comparisons denies it.
  Allowed on the two functions with the reason; behaviour unchanged.
- perry-runtime math.rs js_math_exp: INV_LN2 and E are written as
  std::f64::consts::LOG2_E and ::E (approx_constant). Same bits:
  0x3FF71547652B82FE and 0x4005BF0A8B145769.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
alloc_life::image_base and wpfacts_check::life::symbol call libc::dladdr /
Dl_info unconditionally, so `cargo xwin check -p perry-runtime` (lint:
Type-check Windows runtime and stdlib) fails with E0425. Off unix they return
the values both already return when dladdr finds nothing: 0 and "?".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Each gate names these as matching nothing any more and asks for deletion;
only those entries are removed, no ceiling or baseline is raised.

- native_handle_ledger.txt: turnloop_h2/mod.rs and turnloop_serve/conn.rs
  (ledger 1 table, measured 0). Tables 116 -> 114 vs main, none raised.
- gc_runtime_root_holders.json: 11 holders under "no longer match an
  uncovered holder" (IN_FLIGHT, CP_LIVE_COUNT, CP_REFED_COUNT,
  MAP_FOREACH_STACK, RUNNING, SET_FOREACH_STACK, NEXT_PORT_ID, ACTIVE,
  PENDING x2, DRIVERS). None reappears among new or unclassified holders.
- thread_exit_address_globals.json: fn_metadata_owner.rs INDEX ("stale entry
  - no such candidate static").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
test_gap_gc_namespace_call_callee_rooting and
test_gap_gc_scalar_ctor_arg_rooting were added by 43d4dd5 but not listed in
tests/parity/gc_repsel_corpus.txt, so gc_repsel_matrix.sh never ran them and
check_test_registration.py fails lint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
check_gc_doc_claims.py checks that a code span starting with a repo root names
an existing path; `tests/parity/<root>/<subject>/` and
`tests/parity/snapshots/<platform>-<mode>/<subject>.json` do not, so lint fails.
The existing directory stays in the code span and the placeholder pattern
moves to its own span. Wording otherwise unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Mechanical: `cargo fmt --all` on main (222 files), which the `lint` job's
"Check formatting" step rejects. No hand edits; regenerate with
`cargo fmt --all` when rebasing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
`cargo fmt --all` changed the code-line count of six allowlisted files;
check_file_size.sh asserts exact counts. Only those six entries change
(`./scripts/check_file_size.sh --update`), all from formatting:
codegen/mod.rs 3677->3709, stmt/loops.rs 8456->8453, object/shapes.rs
4937->4944, snap_census/runner.rs 4749->4768, stdlib streams.rs 2448->2454,
run_pipeline.rs 6363->6366.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p
@TheHypnoo
TheHypnoo merged commit ed15abd into PerryTS:main Nov 13, 2026
69 checks passed
TheHypnoo pushed a commit that referenced this pull request Nov 13, 2026
…eilings, two integration expectations (#14631)

* fix(runtime): RecordArrayHeader size assertion holds on wasm32

`const _: () = assert!(size_of::<RecordArrayHeader>() == 24)` (#14487) pins
the 64-bit layout; on wasm32 the `elems` pointer is 4 bytes and the head is 20,
so `wasi-execution` fails building the runtime for wasm32-wasip1 with E0080.
The head is reached only through the `js_record_array_*` entries and the GC
through `elems_slot` (`addr_of_mut!`), so nothing depends on the width: the
assertion now pins four u32 counts followed by the pointer with no padding
(16 + pointer size), keeping the capacity (+4) and elems (+16) offsets.

Checked by compiling the header and both assertions alone for
wasm32-wasip1 and aarch64-apple-darwin: the old one fails on wasm32 with the
CI message, the new one holds on both. `cargo test -p perry-runtime --lib
record_array`: 16 passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

* style: cargo fmt --all

`crates/perry-runtime/src/lib.rs` landed unformatted after #14604; the lint
job's "Check formatting" step rejects it. Mechanical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

* chore(gates): delete the raw-handle ceilings the gate reports as matching nothing

raw_handle_debt.py lists eleven per-module ceilings whose module now has no
debt site ("matches nothing -- DELETE its line so the cleanup cannot be
undone"): global_this_webassembly.rs and ten test modules under
perry-runtime (gc/tests/..., node_stream_tests*.rs, node_submodules/test.rs).
Only those lines go; `--no-raise-vs upstream/main`: baseline 861 -> 861,
module ceilings 107 -> 96, none raised.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

* test(wasm): two integration expectations follow console.log's one-line output

#14625 made `console.log(a, b)` print its arguments on one line, as Node does,
but left 20_string_from_char_code.expected and
22_cross_module_nested_object.expected in the old one-value-per-line form, so
tests/integration/wasm/run_wasm_tests.sh fails both on main. The new contents
are Node's output (the cross-module case run with explicit `.ts` imports), and
the compiled programs print exactly that; the suite is back to 28 pass / 4
fail with the long-standing set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

* chore: changelog entry for #14631

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUQanVsnitcrmYLAWWPc3p

---------

Co-authored-by: Ralic Lo <raliclo@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

3 participants