From 78f4cd3f20b707066450f7f8a1e9b9b4bb8aea33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 10 Aug 2026 12:00:23 +0200 Subject: [PATCH 1/2] fix(array): a replaced Array.prototype[Symbol.iterator] drives spread, call-spread and Array.from (#7542) --- .../7759-array-proto-iterator-spread.md | 15 +++++++ crates/perry-runtime/src/array/from_concat.rs | 13 ++++++ crates/perry-runtime/src/array/iterator.rs | 44 +++++++++++++++++++ crates/perry-runtime/src/array/mod.rs | 4 +- crates/perry-runtime/src/array/push_pop.rs | 20 +++++++++ crates/perry-runtime/src/object/arguments.rs | 10 +++++ 6 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 changelog.d/7759-array-proto-iterator-spread.md diff --git a/changelog.d/7759-array-proto-iterator-spread.md b/changelog.d/7759-array-proto-iterator-spread.md new file mode 100644 index 0000000000..537982cf18 --- /dev/null +++ b/changelog.d/7759-array-proto-iterator-spread.md @@ -0,0 +1,15 @@ +### Fixed + +- **A replaced `Array.prototype[Symbol.iterator]` now drives every spread form (#7542).** `[...arr]`, `[0, ...arr, 9]`, `f(...arr)` and `Array.from(arr)` all took element-copy fast paths that never consult the iteration protocol, so a patched prototype method was ignored and the builtin element copy was returned. Node yields whatever the patched method yields. + + The issue's diagnosis needed correcting in two places, both of which changed the fix. First, `note_array_proto_iterator_write` **does** fire — instrumented, it is called 49 times during a run and exactly one call matches and sets the flag, so the flag was never the problem. Second, the generic `[Symbol.iterator]` walk in `array_from_spread_value` does **not** miss for a plain array: `js_object_get_symbol_property` synthesizes the BUILT-IN `Symbol.iterator` for an array receiver (a `js_class_method_bind` by name) instead of reading the prototype slot, so the walk resolves the builtin, calls it, and returns the element copy. A guard added to the `js_array_is_array` arm *after* that walk — where the issue points — is dead code; measured, it is never reached. + + So the guard goes **before** the walk, and at each of the four entry points that reach an array by a different route: `array_from_spread_value` (`[...arr]`), `js_array_from_value` (`Array.from`, whose array arm ends in a raw `js_array_clone`), `js_array_push_spread_f64` (spread into an existing array), and `js_array_like_to_array` (call-spread, which decides how many arguments a callee receives). Each delegates to `js_get_iterator`, the one implementation that consults the patched prototype per GetIterator, so the entry points cannot answer differently for the same receiver. + + An **own** `arr[Symbol.iterator]` still wins: the shortcut stands aside when the receiver carries its own method, because `js_get_iterator`'s patched branch reads the prototype only and would otherwise throw "not iterable" for an array with an own method once the prototype slot is deleted. + + Untouched in every ordinary program: `array_proto_iterator_modified()` is sticky-false until user code writes the prototype slot, and #7533's dense fast path already declines when it is set. + + **No gap test, deliberately.** Any test that patches `Array.prototype[Symbol.iterator]` takes the ORACLE down under the parity harness — node builds a `SafeMap` from an iterable and gets the patched value, so `node` exits 1 with `per_context/primordials` and the comparison runs against a crashed reference. Restoring the original first is not available either: reading `Array.prototype[Symbol.iterator]` back yields a prototype-bound method (`next is not a function` when called with `this === arr`), and `getOwnPropertyDescriptor` on a prototype symbol returns `undefined`. Both are pre-existing and filed separately. The fix is verified by direct byte-for-byte comparison against `node --experimental-strip-types` instead. + + Also not fixed here, and filed separately: `for…of` over a *typed local* still ignores the patched method. That is a codegen dense index loop with no runtime call at all — a different mechanism from the four entry points above, needing its own guard. diff --git a/crates/perry-runtime/src/array/from_concat.rs b/crates/perry-runtime/src/array/from_concat.rs index 8655091549..43ee8035c8 100644 --- a/crates/perry-runtime/src/array/from_concat.rs +++ b/crates/perry-runtime/src/array/from_concat.rs @@ -87,6 +87,19 @@ pub extern "C" fn js_array_from_value(boxed: f64) -> *mut ArrayHeader { // segfaulted. Materialize to a heap StringHeader so every pointer // extraction downstream is valid; the per-codepoint path in // `js_array_clone` then behaves exactly as it does for a literal. + // #7542: `Array.from(arr)` is `GetIterator(arr)` + drain, so a patched + // `Array.prototype[Symbol.iterator]` drives it exactly as it drives spread. + // This function's array arm ends in a raw `js_array_clone` — a shallow + // element copy that never consults the protocol — so the guard has to be + // here rather than downstream. `array_from_spread_value` already routes the + // patched case through `js_get_iterator`; reuse it so the two entry points + // cannot answer differently for the same receiver. + if crate::array::array_proto_iterator_modified() + && crate::array::js_array_is_array(boxed).to_bits() == crate::value::TAG_TRUE + { + return crate::array::js_array_clone_for_spread(boxed); + } + let jsval = crate::value::JSValue::from_bits(bits); if jsval.is_short_string() { let hdr = crate::string::js_string_materialize_to_heap(boxed); diff --git a/crates/perry-runtime/src/array/iterator.rs b/crates/perry-runtime/src/array/iterator.rs index 7670c2a993..6b4c51b099 100644 --- a/crates/perry-runtime/src/array/iterator.rs +++ b/crates/perry-runtime/src/array/iterator.rs @@ -707,6 +707,18 @@ fn object_like_iterator_result(value: f64) -> bool { raw >= 0x10000 } +/// #7542: does this value carry its OWN `[Symbol.iterator]`? An own method +/// shadows the prototype, so the patched-prototype shortcut must stand aside +/// for it and let the ordinary `@@iterator` walk resolve it. +fn array_has_own_iterator(value: f64) -> bool { + let iter_sym = crate::symbol::well_known_symbol("iterator"); + if iter_sym.is_null() { + return false; + } + let sym_value = f64::from_bits(crate::value::JSValue::pointer(iter_sym as *const u8).bits()); + unsafe { crate::symbol::has_own_symbol_property(value, sym_value) } +} + pub(crate) fn array_from_spread_value(value: f64) -> *mut ArrayHeader { use crate::value::{js_nanbox_get_pointer, js_nanbox_pointer, JSValue, POINTER_MASK}; @@ -780,6 +792,38 @@ pub(crate) fn array_from_spread_value(value: f64) -> *mut ArrayHeader { return crate::array::dense_spread_copy(value()); } + // #7542: `Array.prototype[Symbol.iterator] = fn` must drive the spread, as + // it already drives `for…of` over a literal and destructuring. + // + // This has to run BEFORE the generic `[Symbol.iterator]` walk below, not + // after it. The walk does NOT miss for a plain array — contrary to how this + // looked from the outside, `js_object_get_symbol_property` synthesizes the + // BUILT-IN `Symbol.iterator` for an array receiver (a `js_class_method_bind` + // by name) rather than reading the prototype slot, so the walk resolves the + // builtin, calls it, and returns the element copy. A guard placed after the + // walk is dead code: measured, it is never reached. + // + // `js_get_iterator` is the one implementation that consults the patched + // prototype under this flag (per GetIterator: read the method off + // `Array.prototype`, call it with `this === val`, TypeError when deleted or + // non-callable). Delegate rather than restate it — two copies of a spec + // sequence that must agree is how this diverged in the first place. + // + // Placed after the dense fast path, which already declines when the flag is + // set (`flat_clone.rs`), and after the string/class-ref arms above, which + // are not arrays. The unpatched path is untouched: the flag is sticky-false + // until user code writes the prototype slot. + // An OWN `arr[Symbol.iterator]` still wins over the prototype, so this must + // not preempt the walk below for that case: `js_get_iterator`'s patched + // branch reads the PROTOTYPE only, and would throw "not iterable" for an + // array carrying its own method once the prototype slot has been deleted. + if crate::array::array_proto_iterator_modified() + && crate::array::js_array_is_array(value()).to_bits() == crate::value::TAG_TRUE + && !array_has_own_iterator(value()) + { + return js_iterator_to_array(crate::symbol::js_get_iterator(value())); + } + if let Some(entries) = entries_array_for_small_handle_id(raw_ptr() as i64) { return entries; } diff --git a/crates/perry-runtime/src/array/mod.rs b/crates/perry-runtime/src/array/mod.rs index a9e5086188..541721a51a 100644 --- a/crates/perry-runtime/src/array/mod.rs +++ b/crates/perry-runtime/src/array/mod.rs @@ -52,8 +52,8 @@ pub use self::element_shape::{ #[cfg(test)] pub(crate) use self::element_shape::{test_element_shape_record_exists, test_serialize}; pub use self::flat_clone::{ - js_array_clone, js_array_entries, js_array_flat, js_array_flat_depth, js_array_keys, - js_array_values, + js_array_clone, js_array_clone_for_spread, js_array_entries, js_array_flat, + js_array_flat_depth, js_array_keys, js_array_values, }; pub use self::from_concat::{ array_from_full, array_of_full, js_array_concat_variadic, js_array_from_mapped, diff --git a/crates/perry-runtime/src/array/push_pop.rs b/crates/perry-runtime/src/array/push_pop.rs index 79416c9d67..ad5814ef34 100644 --- a/crates/perry-runtime/src/array/push_pop.rs +++ b/crates/perry-runtime/src/array/push_pop.rs @@ -710,6 +710,26 @@ pub extern "C" fn js_array_push_spread_f64( if source.is_null() { return target; } + // #7542: call-spread (`f(...arr)`) is `GetIterator(arr)` + drain, so a + // patched `Array.prototype[Symbol.iterator]` decides how many arguments the + // callee receives. The element copy below never consults the protocol, so + // `f(...[1,2,3])` passed 3 arguments where node passes whatever the patched + // iterator yields (1). + // + // Materialize through the protocol and copy THAT, rather than concatenating: + // this helper appends into `target` in place and returns it, and callers + // rely on that identity. `js_array_clone_for_spread` is the same entry point + // `[...arr]` uses, so the two spread forms cannot disagree. + let source = if crate::array::array_proto_iterator_modified() { + let boxed = crate::value::js_nanbox_pointer(source as i64); + let materialized = crate::array::js_array_clone_for_spread(boxed); + if materialized.is_null() { + return target; + } + materialized as *const ArrayHeader + } else { + source + }; let scope = crate::gc::RuntimeHandleScope::new(); let source_handle = scope.root_raw_const_ptr(source); unsafe { diff --git a/crates/perry-runtime/src/object/arguments.rs b/crates/perry-runtime/src/object/arguments.rs index 2e0583fa5f..6c8e5040b4 100644 --- a/crates/perry-runtime/src/object/arguments.rs +++ b/crates/perry-runtime/src/object/arguments.rs @@ -528,7 +528,17 @@ pub extern "C" fn js_array_like_to_array(value: f64) -> *mut ArrayHeader { return crate::buffer::buffer_to_array(raw as *const crate::buffer::BufferHeader); } // A real Array → fast path (no protocol overhead). + // + // #7542: unless `Array.prototype[Symbol.iterator]` was replaced, in + // which case call-spread (`f(...arr)`) must drive the patched method — + // it decides how many arguments the callee receives, so `f(...[1,2,3])` + // passed 3 where node passes 1. `array_proto_iterator_modified()` is a + // sticky flag that is false until user code writes the prototype slot, + // so the fast path is untouched in every ordinary program. if crate::array::js_array_is_array(value).to_bits() == crate::value::TAG_TRUE { + if crate::array::array_proto_iterator_modified() { + return crate::array::js_array_clone_for_spread(value); + } return crate::array::clean_arr_ptr(raw as *const ArrayHeader) as *mut ArrayHeader; } // Generic iterable with a user `[Symbol.iterator]` (Map/Set, generator From b3568c1f8c6743fc5dab8292cd3abe0e288f744b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 10 Aug 2026 13:11:12 +0200 Subject: [PATCH 2/2] chore: bump version to 0.5.1445 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 69d27ca3e3..8a5bbe5fc7 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.1444 +**Current Version:** 0.5.1445 ## TypeScript Parity Status diff --git a/Cargo.lock b/Cargo.lock index b9ce96cf0d..569a14fb48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5547,7 +5547,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perry" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "base64", @@ -5607,14 +5607,14 @@ dependencies = [ [[package]] name = "perry-api-manifest" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "serde", ] [[package]] name = "perry-audio-miniaudio" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "cc", "libc", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "perry-codegen" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "inkwell", @@ -5639,7 +5639,7 @@ dependencies = [ [[package]] name = "perry-codegen-arkts" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-hir", @@ -5647,7 +5647,7 @@ dependencies = [ [[package]] name = "perry-codegen-glance" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-hir", @@ -5655,7 +5655,7 @@ dependencies = [ [[package]] name = "perry-codegen-js" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-dispatch", @@ -5664,7 +5664,7 @@ dependencies = [ [[package]] name = "perry-codegen-swiftui" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-hir", @@ -5672,7 +5672,7 @@ dependencies = [ [[package]] name = "perry-codegen-wasm" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "base64", @@ -5684,7 +5684,7 @@ dependencies = [ [[package]] name = "perry-codegen-wear-tiles" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-hir", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "perry-container-compose" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "async-trait", @@ -5721,14 +5721,14 @@ dependencies = [ [[package]] name = "perry-container-e2e" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", ] [[package]] name = "perry-diagnostics" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "serde", "serde_json", @@ -5736,7 +5736,7 @@ dependencies = [ [[package]] name = "perry-dispatch" -version = "0.5.1444" +version = "0.5.1445" [[package]] name = "perry-doc-fixture-my-bindings" @@ -5747,7 +5747,7 @@ dependencies = [ [[package]] name = "perry-doc-tests" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "clap", @@ -5762,7 +5762,7 @@ dependencies = [ [[package]] name = "perry-ext-ads" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "block2", "objc2", @@ -5772,7 +5772,7 @@ dependencies = [ [[package]] name = "perry-ext-argon2" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "argon2", "perry-ffi", @@ -5780,7 +5780,7 @@ dependencies = [ [[package]] name = "perry-ext-axios" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "reqwest", @@ -5789,7 +5789,7 @@ dependencies = [ [[package]] name = "perry-ext-bcrypt" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bcrypt", "perry-ffi", @@ -5797,7 +5797,7 @@ dependencies = [ [[package]] name = "perry-ext-better-sqlite3" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "rusqlite", @@ -5805,7 +5805,7 @@ dependencies = [ [[package]] name = "perry-ext-cheerio" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "scraper", @@ -5813,7 +5813,7 @@ dependencies = [ [[package]] name = "perry-ext-commander" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "perry-runtime", @@ -5821,7 +5821,7 @@ dependencies = [ [[package]] name = "perry-ext-cron" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "chrono", "cron", @@ -5831,7 +5831,7 @@ dependencies = [ [[package]] name = "perry-ext-dayjs" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "chrono", "perry-ffi", @@ -5839,7 +5839,7 @@ dependencies = [ [[package]] name = "perry-ext-decimal" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "rust_decimal", @@ -5847,7 +5847,7 @@ dependencies = [ [[package]] name = "perry-ext-dotenv" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "serde_json", @@ -5855,7 +5855,7 @@ dependencies = [ [[package]] name = "perry-ext-ethers" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "rand 0.10.1", @@ -5863,7 +5863,7 @@ dependencies = [ [[package]] name = "perry-ext-events" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "perry-runtime", @@ -5871,14 +5871,14 @@ dependencies = [ [[package]] name = "perry-ext-exponential-backoff" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-fastify" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bytes", "http-body-util", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "perry-ext-fetch" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bytes", "lazy_static", @@ -5909,7 +5909,7 @@ dependencies = [ [[package]] name = "perry-ext-http" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bytes", "h2", @@ -5933,7 +5933,7 @@ dependencies = [ [[package]] name = "perry-ext-ioredis" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "lazy_static", "perry-ffi", @@ -5943,7 +5943,7 @@ dependencies = [ [[package]] name = "perry-ext-jsonwebtoken" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "jsonwebtoken", @@ -5954,7 +5954,7 @@ dependencies = [ [[package]] name = "perry-ext-lru-cache" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "lru", "perry-ffi", @@ -5963,7 +5963,7 @@ dependencies = [ [[package]] name = "perry-ext-moment" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "chrono", "perry-ffi", @@ -5971,7 +5971,7 @@ dependencies = [ [[package]] name = "perry-ext-mongodb" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bson", "futures-util", @@ -5983,7 +5983,7 @@ dependencies = [ [[package]] name = "perry-ext-mysql2" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "chrono", "perry-ffi", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "perry-ext-nanoid" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "nanoid", "perry-ffi", @@ -6002,7 +6002,7 @@ dependencies = [ [[package]] name = "perry-ext-net" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "bytes", "perry-ffi", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "perry-ext-node-forge" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "const-oid 0.9.6", "der 0.7.10", @@ -6034,7 +6034,7 @@ dependencies = [ [[package]] name = "perry-ext-nodemailer" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "lettre", "perry-ffi", @@ -6044,7 +6044,7 @@ dependencies = [ [[package]] name = "perry-ext-pdf" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "printpdf", @@ -6052,7 +6052,7 @@ dependencies = [ [[package]] name = "perry-ext-pg" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "sqlx", @@ -6061,7 +6061,7 @@ dependencies = [ [[package]] name = "perry-ext-ratelimit" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "governor", "perry-ffi", @@ -6069,7 +6069,7 @@ dependencies = [ [[package]] name = "perry-ext-sharp" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "fast_image_resize", "image", @@ -6079,14 +6079,14 @@ dependencies = [ [[package]] name = "perry-ext-slugify" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-streams" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "lazy_static", "perry-ffi", @@ -6095,7 +6095,7 @@ dependencies = [ [[package]] name = "perry-ext-undici" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "perry-runtime", @@ -6104,7 +6104,7 @@ dependencies = [ [[package]] name = "perry-ext-uuid" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "uuid", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "perry-ext-validator" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ffi", "regex", @@ -6122,7 +6122,7 @@ dependencies = [ [[package]] name = "perry-ext-ws" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "futures-util", "lazy_static", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "perry-ext-zlib" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "brotli", "flate2", @@ -6145,7 +6145,7 @@ dependencies = [ [[package]] name = "perry-ffi" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "dashmap", "once_cell", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "perry-hir" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-api-manifest", @@ -6172,7 +6172,7 @@ dependencies = [ [[package]] name = "perry-parser" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-diagnostics", @@ -6184,7 +6184,7 @@ dependencies = [ [[package]] name = "perry-runtime" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "base64", @@ -6226,14 +6226,14 @@ dependencies = [ [[package]] name = "perry-runtime-static" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-runtime", ] [[package]] name = "perry-stdlib" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "aes 0.8.4", "aes 0.9.1", @@ -6328,14 +6328,14 @@ dependencies = [ [[package]] name = "perry-stdlib-static" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-stdlib", ] [[package]] name = "perry-transform" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "perry-hir", @@ -6344,14 +6344,14 @@ dependencies = [ [[package]] name = "perry-ui" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ui-model", ] [[package]] name = "perry-ui-android" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "itoa", @@ -6368,7 +6368,7 @@ dependencies = [ [[package]] name = "perry-ui-geisterhand" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "rand 0.10.1", "serde", @@ -6378,7 +6378,7 @@ dependencies = [ [[package]] name = "perry-ui-gtk4" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "cairo-rs 0.22.0", @@ -6401,7 +6401,7 @@ dependencies = [ [[package]] name = "perry-ui-ios" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "block2", @@ -6417,7 +6417,7 @@ dependencies = [ [[package]] name = "perry-ui-macos" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "block2", @@ -6432,7 +6432,7 @@ dependencies = [ [[package]] name = "perry-ui-model" -version = "0.5.1444" +version = "0.5.1445" [[package]] name = "perry-ui-test" @@ -6443,11 +6443,11 @@ dependencies = [ [[package]] name = "perry-ui-testkit" -version = "0.5.1444" +version = "0.5.1445" [[package]] name = "perry-ui-tvos" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "block2", @@ -6463,7 +6463,7 @@ dependencies = [ [[package]] name = "perry-ui-visionos" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "block2", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "perry-ui-watchos" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "block2", "libc", @@ -6492,7 +6492,7 @@ dependencies = [ [[package]] name = "perry-ui-windows" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "base64", "libc", @@ -6509,14 +6509,14 @@ dependencies = [ [[package]] name = "perry-ui-windows-winui" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "perry-ui-windows", ] [[package]] name = "perry-updater" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "anyhow", "base64", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "perry-wasm-host" -version = "0.5.1444" +version = "0.5.1445" dependencies = [ "wasmi", ] diff --git a/Cargo.toml b/Cargo.toml index d13bf24575..744b4efbf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -315,7 +315,7 @@ codegen-units = 16 codegen-units = 16 [workspace.package] -version = "0.5.1444" +version = "0.5.1445" edition = "2021" license = "MIT" repository = "https://github.com/PerryTS/perry"