From 696d08c623ee3255cd8035043404c610eb90bd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 9 Aug 2026 20:31:37 +0200 Subject: [PATCH 1/4] fix(gc): initialize keys_array on both js_object_clone_with_extra branches (#7683) The slot was left holding whatever the reused hole contained until set_object_keys_array at the end of the function -- but js_array_alloc runs in between, and it can collect. The collector reads that slot as a child edge via object::gc_keys_array_slot. Claude-Session: https://claude.ai/code/session_01Y1QZ5wUP9gRSwpiweT4Wix --- crates/perry-runtime/src/object/alloc.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/crates/perry-runtime/src/object/alloc.rs b/crates/perry-runtime/src/object/alloc.rs index d7af244b9e..b67fd5ed69 100644 --- a/crates/perry-runtime/src/object/alloc.rs +++ b/crates/perry-runtime/src/object/alloc.rs @@ -754,6 +754,15 @@ pub unsafe extern "C" fn js_object_clone_with_extra( (*new_ptr).field_count = 0; // GC_STORE_AUDIT(INIT): fresh object starts with no per-object meta record (#6759 B). (*new_ptr).meta = ptr::null_mut(); + // GC_STORE_AUDIT(INIT): freshly allocated clone starts with no keys-array + // edge (#7683). This MUST precede the `js_array_alloc` below: that call + // allocates, so it can collect, and the collector reads this slot + // through `object::gc_keys_array_slot` as a child edge. Every sibling + // allocator in this file already nulls it here; this function was the + // one that did not, and `arena_alloc_gc_old`'s fast path deliberately + // reuses a swept, NON-zeroed hole (#7437), so the slot holds real + // leftover heap bytes rather than zeros. + (*new_ptr).keys_array = ptr::null_mut(); let fields_ptr = (new_ptr as *mut u8).add(header_size) as *mut u64; for i in 0..phys_slots as usize { // GC_STORE_AUDIT(INIT): freshly allocated clone field slot is initialized pointer-free. @@ -786,6 +795,15 @@ pub unsafe extern "C" fn js_object_clone_with_extra( (*new_ptr).field_count = src_field_count; // GC_STORE_AUDIT(INIT): fresh object starts with no per-object meta record (#6759 B). (*new_ptr).meta = ptr::null_mut(); + // GC_STORE_AUDIT(INIT): freshly allocated clone starts with no keys-array + // edge (#7683). This MUST precede the `js_array_alloc` below: that call + // allocates, so it can collect, and the collector reads this slot + // through `object::gc_keys_array_slot` as a child edge. Every sibling + // allocator in this file already nulls it here; this function was the + // one that did not, and `arena_alloc_gc_old`'s fast path deliberately + // reuses a swept, NON-zeroed hole (#7437), so the slot holds real + // leftover heap bytes rather than zeros. + (*new_ptr).keys_array = ptr::null_mut(); // Copy source fields (as raw f64/u64 words — preserves NaN-boxing) let src_fields = (src_ptr as *const u8).add(header_size) as *const u64; From c57a2a09ca23db8ea4d63a1a9e907ccc1375c46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 9 Aug 2026 20:52:45 +0200 Subject: [PATCH 2/4] test(gc): assert clone_with_extra's keys_array custody at the source (#7683) The runtime version of this test passed with the fix deleted -- the window is inside the function and a fresh block is zeroed. The invariant is only decidable in the source, so check it there. Claude-Session: https://claude.ai/code/session_01Y1QZ5wUP9gRSwpiweT4Wix --- changelog.d/7726-clone-keys-array-init.md | 15 +++ .../src/gc/tests/clone_keys_array_init.rs | 100 ++++++++++++++++++ crates/perry-runtime/src/gc/tests/mod.rs | 1 + 3 files changed, 116 insertions(+) create mode 100644 changelog.d/7726-clone-keys-array-init.md create mode 100644 crates/perry-runtime/src/gc/tests/clone_keys_array_init.rs diff --git a/changelog.d/7726-clone-keys-array-init.md b/changelog.d/7726-clone-keys-array-init.md new file mode 100644 index 0000000000..aa562588bd --- /dev/null +++ b/changelog.d/7726-clone-keys-array-init.md @@ -0,0 +1,15 @@ +### Fixed + +- **`js_object_clone_with_extra` published a half-built object whose `keys_array` slot held recycled heap bytes (#7683).** Both branches initialise `object_type`, `class_id`, `parent_class_id`, `field_count` and `meta` immediately after allocation, then set `keys_array` only at the end via `set_object_keys_array`. Between those two points sits `crate::array::js_array_alloc`. + + That call **allocates, so it can collect** — and the collector reads exactly this slot as a child edge (`object::gc_keys_array_slot`, enumerated by `gc_child_slots`). A collection landing in that window scans a pointer the mutator never wrote. + + The bytes are not zero. `arena_alloc_gc_old`'s fast path deliberately reuses a swept, **non-zeroed** hole (#7437: *"reuse a swept same-size hole … otherwise a block with any live object never yields its dead bytes back"*), so the slot holds real leftover heap content from whatever last occupied it. Whether that content happens to look like a plausible-but-unmapped address depends on allocation history — which is the shape of the ~1-in-102 `typed_feedback::object_shape` SIGSEGV reported in #7683. + + Every sibling allocator in `object/alloc.rs` already nulls the slot at this point. This function was the one that did not. + + **On the test, and why it checks source rather than behaviour.** The runtime version was written first: force a collection into the window (`force_next_general_arena_alloc_slow` + `GC_OLD_RECLAIM_PENDING`, the levers #7251 established), then assert the published clone's `keys_array` is sane. **It passed with the fix deleted.** Two independent reasons: by the time the function returns, `set_object_keys_array` has written the slot correctly, so nothing observable survives the window; and a fresh arena block is zeroed, so even inside the window the garbage reads as null unless the allocation lands in a recycled old-space hole with the right history. + + Reproducing it in-suite therefore needs a specific swept-hole layout **and** a collection landing in a few-instruction window. That is exactly why the fix is a by-construction initialisation rather than a guard, and why the guard asserts the invariant where it is decidable — the source, in the style of `scripts/gc_pin_sites.py`'s custody check for `GC_FLAG_PINNED`. Removing either initialisation fails the test. + + One note for anyone writing a similar source-level check: the first version matched the phrase `arena_alloc_gc` inside **its own explanatory comment**, registering a third allocation site and failing against correct code. It now strips comments before scanning. A source check that reads its own documentation as code is worse than no check. diff --git a/crates/perry-runtime/src/gc/tests/clone_keys_array_init.rs b/crates/perry-runtime/src/gc/tests/clone_keys_array_init.rs new file mode 100644 index 0000000000..584b59f37f --- /dev/null +++ b/crates/perry-runtime/src/gc/tests/clone_keys_array_init.rs @@ -0,0 +1,100 @@ +//! #7683: `js_object_clone_with_extra` published a half-built object whose +//! `keys_array` slot still held whatever the reused hole contained. +//! +//! # The hazard +//! +//! Both branches set `object_type`, `class_id`, `parent_class_id`, +//! `field_count` and `meta` immediately after allocation, then set +//! `keys_array` only at the END, via `set_object_keys_array`. In between sits +//! `crate::array::js_array_alloc`. +//! +//! That call ALLOCATES, so it can collect — and the collector reads exactly +//! this slot as a child edge (`object::gc_keys_array_slot`, enumerated by +//! `gc_child_slots`). A collection landing in that window scans a pointer the +//! mutator never wrote. +//! +//! The bytes are not zero. `arena_alloc_gc_old`'s fast path deliberately +//! reuses a swept, NON-zeroed hole (#7437: "reuse a swept same-size hole … +//! otherwise a block with any live object never yields its dead bytes back"), +//! so the slot holds real leftover heap content. Whether it happens to look +//! like a plausible-but-unmapped address depends on allocation history — +//! the shape of the ~1-in-102 `typed_feedback::object_shape` SIGSEGV in #7683. +//! +//! # Why this test is a SOURCE check and not a runtime one +//! +//! I wrote the runtime version first: force a collection into the window with +//! `force_next_general_arena_alloc_slow` + `GC_OLD_RECLAIM_PENDING`, then +//! assert the published clone's `keys_array` is sane. **It passed with the fix +//! deleted** — vacuous, and for two independent reasons. By the time the +//! function returns, `set_object_keys_array` has written the slot correctly, +//! so nothing observable survives the window; and a fresh arena block is +//! zeroed, so even inside the window the garbage would read as null unless the +//! allocation lands in a recycled old-space hole with the right history. +//! +//! Reproducing it in-suite therefore needs a specific swept-hole layout AND a +//! collection landing in a few-instruction window. That is exactly why the fix +//! is a by-construction initialisation rather than a guard — and why the test +//! that guards it asserts the invariant at the only place it is decidable: the +//! source. Same idea as `scripts/gc_pin_sites.py`'s custody check for +//! `GC_FLAG_PINNED`. + +/// Every object-allocating branch of `js_object_clone_with_extra` must +/// initialise `keys_array` BEFORE the `js_array_alloc` that can collect. +#[test] +fn clone_with_extra_initializes_keys_array_before_it_can_collect() { + let src = include_str!("../../object/alloc.rs"); + let start = src + .find("pub unsafe extern \"C\" fn js_object_clone_with_extra") + .expect("js_object_clone_with_extra must exist"); + // The function ends at the next item at column 0 after its body. + let body = &src[start..]; + let end = body[1..] + .find("\npub ") + .map(|i| i + 1) + .unwrap_or(body.len()); + let body = &body[..end]; + // Strip comments BEFORE scanning. Without this the check matches prose: + // the very comment this fix added says "arena_alloc_gc_old's fast path", + // which registered as a third allocation site and made the test fail + // against correct code. A source-level check that reads its own + // documentation as code is worse than no check. + let body: String = body + .lines() + .map(|l| l.split("//").next().unwrap_or("")) + .collect::>() + .join("\n"); + let body = body.as_str(); + + // Each branch allocates, then eventually calls js_array_alloc. + let alloc_sites: Vec = body + .match_indices("= arena_alloc_gc") + .map(|(i, _)| i) + .collect(); + assert!( + !alloc_sites.is_empty(), + "no arena_alloc_gc site found — this test is anchored on the wrong \ + function or the allocator was renamed; fix the anchor rather than \ + deleting the check" + ); + + for site in alloc_sites { + let after = &body[site..]; + let init = after.find("keys_array = ptr::null_mut()"); + let collect_point = after.find("js_array_alloc"); + let (Some(init), Some(collect_point)) = (init, collect_point) else { + panic!( + "#7683: an allocation site in js_object_clone_with_extra has \ + no `keys_array = ptr::null_mut()` before its `js_array_alloc`.\n\ + init={init:?} js_array_alloc={collect_point:?}\n\ + js_array_alloc can collect, and the collector reads keys_array \ + as a child edge — so the slot must be written first." + ); + }; + assert!( + init < collect_point, + "#7683: keys_array is initialised AFTER the js_array_alloc that \ + can collect (init at +{init}, js_array_alloc at +{collect_point}). \ + A collection in that window scans an unwritten pointer." + ); + } +} diff --git a/crates/perry-runtime/src/gc/tests/mod.rs b/crates/perry-runtime/src/gc/tests/mod.rs index 004304f462..a6066f0bb9 100644 --- a/crates/perry-runtime/src/gc/tests/mod.rs +++ b/crates/perry-runtime/src/gc/tests/mod.rs @@ -35,6 +35,7 @@ mod scan_fallback; mod shadow_stack_ops; mod smoke; pub(super) mod support; +mod clone_keys_array_init; mod teardown; mod telemetry_verifier; mod temp_roots; From 0bf3f2d12d3b06f711b080f399f30d6219abdf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 9 Aug 2026 21:31:49 +0200 Subject: [PATCH 3/4] chore: annotate the keys_array init stores for the GC store-site inventory Claude-Session: https://claude.ai/code/session_01Y1QZ5wUP9gRSwpiweT4Wix --- crates/perry-runtime/src/gc/tests/mod.rs | 2 +- crates/perry-runtime/src/object/alloc.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/perry-runtime/src/gc/tests/mod.rs b/crates/perry-runtime/src/gc/tests/mod.rs index a6066f0bb9..f54eb4fe7d 100644 --- a/crates/perry-runtime/src/gc/tests/mod.rs +++ b/crates/perry-runtime/src/gc/tests/mod.rs @@ -4,6 +4,7 @@ mod barrier_arming; mod barrier_decoded_parent; mod budgeted_step_api; mod buffer_side_tables; +mod clone_keys_array_init; mod contract; mod copying; mod copying_side_tables; @@ -35,7 +36,6 @@ mod scan_fallback; mod shadow_stack_ops; mod smoke; pub(super) mod support; -mod clone_keys_array_init; mod teardown; mod telemetry_verifier; mod temp_roots; diff --git a/crates/perry-runtime/src/object/alloc.rs b/crates/perry-runtime/src/object/alloc.rs index b67fd5ed69..831ab131b4 100644 --- a/crates/perry-runtime/src/object/alloc.rs +++ b/crates/perry-runtime/src/object/alloc.rs @@ -762,6 +762,7 @@ pub unsafe extern "C" fn js_object_clone_with_extra( // one that did not, and `arena_alloc_gc_old`'s fast path deliberately // reuses a swept, NON-zeroed hole (#7437), so the slot holds real // leftover heap bytes rather than zeros. + // GC_STORE_AUDIT(INIT): freshly allocated clone starts with no keys-array edge. (*new_ptr).keys_array = ptr::null_mut(); let fields_ptr = (new_ptr as *mut u8).add(header_size) as *mut u64; for i in 0..phys_slots as usize { @@ -803,6 +804,7 @@ pub unsafe extern "C" fn js_object_clone_with_extra( // one that did not, and `arena_alloc_gc_old`'s fast path deliberately // reuses a swept, NON-zeroed hole (#7437), so the slot holds real // leftover heap bytes rather than zeros. + // GC_STORE_AUDIT(INIT): freshly allocated clone starts with no keys-array edge. (*new_ptr).keys_array = ptr::null_mut(); // Copy source fields (as raw f64/u64 words — preserves NaN-boxing) From 7c65e77fc924b37038fb218b15b492e3e6ba4832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 9 Aug 2026 21:31:52 +0200 Subject: [PATCH 4/4] chore: bump version to 0.5.1423 Claude-Session: https://claude.ai/code/session_01Y1QZ5wUP9gRSwpiweT4Wix --- CLAUDE.md | 2 +- Cargo.lock | 152 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 3 files changed, 78 insertions(+), 78 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 77b65a7b4b..063cc3e12e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Perry is a native TypeScript compiler written in Rust that compiles TypeScript source code directly to native executables. It uses SWC for TypeScript parsing and LLVM for code generation. -**Current Version:** 0.5.1422 +**Current Version:** 0.5.1423 ## TypeScript Parity Status diff --git a/Cargo.lock b/Cargo.lock index 97c03c2ead..e25029016f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5547,7 +5547,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perry" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "base64", @@ -5607,14 +5607,14 @@ dependencies = [ [[package]] name = "perry-api-manifest" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "serde", ] [[package]] name = "perry-audio-miniaudio" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "cc", "libc", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "perry-codegen" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "inkwell", @@ -5639,7 +5639,7 @@ dependencies = [ [[package]] name = "perry-codegen-arkts" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-hir", @@ -5647,7 +5647,7 @@ dependencies = [ [[package]] name = "perry-codegen-glance" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-hir", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "perry-codegen-js" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-dispatch", @@ -5664,7 +5664,7 @@ dependencies = [ [[package]] name = "perry-codegen-swiftui" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-hir", @@ -5672,7 +5672,7 @@ dependencies = [ [[package]] name = "perry-codegen-wasm" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "base64", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "perry-codegen-wear-tiles" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-hir", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "perry-container-compose" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "async-trait", @@ -5721,14 +5721,14 @@ dependencies = [ [[package]] name = "perry-container-e2e" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", ] [[package]] name = "perry-diagnostics" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "serde", "serde_json", @@ -5736,7 +5736,7 @@ dependencies = [ [[package]] name = "perry-dispatch" -version = "0.5.1422" +version = "0.5.1423" [[package]] name = "perry-doc-fixture-my-bindings" @@ -5747,7 +5747,7 @@ dependencies = [ [[package]] name = "perry-doc-tests" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "clap", @@ -5762,7 +5762,7 @@ dependencies = [ [[package]] name = "perry-ext-ads" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "block2", "objc2", @@ -5772,7 +5772,7 @@ dependencies = [ [[package]] name = "perry-ext-argon2" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "argon2", "perry-ffi", @@ -5780,7 +5780,7 @@ dependencies = [ [[package]] name = "perry-ext-axios" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "reqwest", @@ -5789,7 +5789,7 @@ dependencies = [ [[package]] name = "perry-ext-bcrypt" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bcrypt", "perry-ffi", @@ -5797,7 +5797,7 @@ dependencies = [ [[package]] name = "perry-ext-better-sqlite3" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "rusqlite", @@ -5805,7 +5805,7 @@ dependencies = [ [[package]] name = "perry-ext-cheerio" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "scraper", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "perry-ext-commander" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "perry-runtime", @@ -5821,7 +5821,7 @@ dependencies = [ [[package]] name = "perry-ext-cron" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "chrono", "cron", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "perry-ext-dayjs" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "chrono", "perry-ffi", @@ -5839,7 +5839,7 @@ dependencies = [ [[package]] name = "perry-ext-decimal" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "rust_decimal", @@ -5847,7 +5847,7 @@ dependencies = [ [[package]] name = "perry-ext-dotenv" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "serde_json", @@ -5855,7 +5855,7 @@ dependencies = [ [[package]] name = "perry-ext-ethers" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "rand 0.10.1", @@ -5863,7 +5863,7 @@ dependencies = [ [[package]] name = "perry-ext-events" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "perry-runtime", @@ -5871,14 +5871,14 @@ dependencies = [ [[package]] name = "perry-ext-exponential-backoff" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-fastify" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bytes", "http-body-util", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "perry-ext-fetch" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bytes", "lazy_static", @@ -5909,7 +5909,7 @@ dependencies = [ [[package]] name = "perry-ext-http" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bytes", "h2", @@ -5933,7 +5933,7 @@ dependencies = [ [[package]] name = "perry-ext-ioredis" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "lazy_static", "perry-ffi", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "perry-ext-jsonwebtoken" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "jsonwebtoken", @@ -5954,7 +5954,7 @@ dependencies = [ [[package]] name = "perry-ext-lru-cache" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "lru", "perry-ffi", @@ -5963,7 +5963,7 @@ dependencies = [ [[package]] name = "perry-ext-moment" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "chrono", "perry-ffi", @@ -5971,7 +5971,7 @@ dependencies = [ [[package]] name = "perry-ext-mongodb" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bson", "futures-util", @@ -5983,7 +5983,7 @@ dependencies = [ [[package]] name = "perry-ext-mysql2" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "chrono", "perry-ffi", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "perry-ext-nanoid" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "nanoid", "perry-ffi", @@ -6002,7 +6002,7 @@ dependencies = [ [[package]] name = "perry-ext-net" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "bytes", "perry-ffi", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "perry-ext-node-forge" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "const-oid 0.9.6", "der 0.7.10", @@ -6034,7 +6034,7 @@ dependencies = [ [[package]] name = "perry-ext-nodemailer" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "lettre", "perry-ffi", @@ -6044,7 +6044,7 @@ dependencies = [ [[package]] name = "perry-ext-pdf" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "printpdf", @@ -6052,7 +6052,7 @@ dependencies = [ [[package]] name = "perry-ext-pg" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "sqlx", @@ -6061,7 +6061,7 @@ dependencies = [ [[package]] name = "perry-ext-ratelimit" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "governor", "perry-ffi", @@ -6069,7 +6069,7 @@ dependencies = [ [[package]] name = "perry-ext-sharp" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "fast_image_resize", "image", @@ -6079,14 +6079,14 @@ dependencies = [ [[package]] name = "perry-ext-slugify" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-streams" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "lazy_static", "perry-ffi", @@ -6095,7 +6095,7 @@ dependencies = [ [[package]] name = "perry-ext-undici" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "perry-runtime", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "perry-ext-uuid" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "uuid", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "perry-ext-validator" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ffi", "regex", @@ -6122,7 +6122,7 @@ dependencies = [ [[package]] name = "perry-ext-ws" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "futures-util", "lazy_static", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "perry-ext-zlib" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "brotli", "flate2", @@ -6145,7 +6145,7 @@ dependencies = [ [[package]] name = "perry-ffi" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "dashmap", "once_cell", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "perry-hir" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-api-manifest", @@ -6172,7 +6172,7 @@ dependencies = [ [[package]] name = "perry-parser" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-diagnostics", @@ -6184,7 +6184,7 @@ dependencies = [ [[package]] name = "perry-runtime" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "base64", @@ -6226,14 +6226,14 @@ dependencies = [ [[package]] name = "perry-runtime-static" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-runtime", ] [[package]] name = "perry-stdlib" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "aes 0.8.4", "aes 0.9.1", @@ -6328,14 +6328,14 @@ dependencies = [ [[package]] name = "perry-stdlib-static" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-stdlib", ] [[package]] name = "perry-transform" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "perry-hir", @@ -6344,14 +6344,14 @@ dependencies = [ [[package]] name = "perry-ui" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ui-model", ] [[package]] name = "perry-ui-android" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "itoa", @@ -6368,7 +6368,7 @@ dependencies = [ [[package]] name = "perry-ui-geisterhand" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "rand 0.10.1", "serde", @@ -6378,7 +6378,7 @@ dependencies = [ [[package]] name = "perry-ui-gtk4" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "cairo-rs 0.22.0", @@ -6401,7 +6401,7 @@ dependencies = [ [[package]] name = "perry-ui-ios" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "block2", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "perry-ui-macos" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "block2", @@ -6432,7 +6432,7 @@ dependencies = [ [[package]] name = "perry-ui-model" -version = "0.5.1422" +version = "0.5.1423" [[package]] name = "perry-ui-test" @@ -6443,11 +6443,11 @@ dependencies = [ [[package]] name = "perry-ui-testkit" -version = "0.5.1422" +version = "0.5.1423" [[package]] name = "perry-ui-tvos" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "block2", @@ -6463,7 +6463,7 @@ dependencies = [ [[package]] name = "perry-ui-visionos" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "block2", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "perry-ui-watchos" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "block2", "libc", @@ -6492,7 +6492,7 @@ dependencies = [ [[package]] name = "perry-ui-windows" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "base64", "libc", @@ -6509,14 +6509,14 @@ dependencies = [ [[package]] name = "perry-ui-windows-winui" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "perry-ui-windows", ] [[package]] name = "perry-updater" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "anyhow", "base64", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "perry-wasm-host" -version = "0.5.1422" +version = "0.5.1423" dependencies = [ "wasmi", ] diff --git a/Cargo.toml b/Cargo.toml index 002f5cb6dd..e27e5dc83b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -315,7 +315,7 @@ codegen-units = 16 codegen-units = 16 [workspace.package] -version = "0.5.1422" +version = "0.5.1423" edition = "2021" license = "MIT" repository = "https://github.com/PerryTS/perry"