From 96acc540f4687c381ecf007f94e9161487d1b121 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:07:32 -0700 Subject: [PATCH 01/18] use page_size=1 for instrumented components --- Cargo.lock | 37 +++++++++++++++++++++++++++++++-- Makefile | 10 ++++----- assets/debug.wasm | Bin 92827 -> 91914 bytes assets/proj_cargo.toml | 1 + assets/recorder.wasm | Bin 237715 -> 239072 bytes assets/workspace_cargo.toml | 1 + components/debug/Cargo.toml | 3 ++- components/debug/src/lib.rs | 9 ++++++++ components/recorder/Cargo.toml | 1 + components/recorder/src/lib.rs | 9 ++++++++ src/codegen/mod.rs | 16 +++++++++++++- src/instrument.rs | 27 ++++++++++++++++++++++-- src/run.rs | 1 + 13 files changed, 104 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3784148..df93e9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "allocator-api2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c880a97d28a3681c0267bd29cff89621202715b065127cd445fa0f0fe0aa2880" + [[package]] name = "ambient-authority" version = "0.0.2" @@ -156,7 +162,7 @@ version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" dependencies = [ - "allocator-api2", + "allocator-api2 0.2.21", ] [[package]] @@ -560,6 +566,7 @@ name = "debug" version = "0.1.0" dependencies = [ "getrandom 0.3.4", + "talc", "wit-bindgen 0.52.0", ] @@ -1221,6 +1228,15 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.29" @@ -1552,6 +1568,7 @@ name = "recorder" version = "0.1.0" dependencies = [ "serde_json", + "talc", "trace", "wit-bindgen 0.52.0", ] @@ -1573,7 +1590,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08effbc1fa53aaebff69521a5c05640523fab037b34a4a2c109506bc938246fa" dependencies = [ - "allocator-api2", + "allocator-api2 0.2.21", "bumpalo", "hashbrown 0.15.5", "log", @@ -1647,6 +1664,12 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.27" @@ -1830,6 +1853,16 @@ dependencies = [ "winx", ] +[[package]] +name = "talc" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081e3f3ad542dc4cd0ae720f752598f8880fd364dc2d031132e3509f673aa23" +dependencies = [ + "allocator-api2 0.4.0", + "lock_api", +] + [[package]] name = "target-lexicon" version = "0.13.5" diff --git a/Makefile b/Makefile index 66d4b1d..9457206 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - cargo build -p debug --target wasm32-wasip2 --release - cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm @@ -25,7 +25,7 @@ test-record: $(MAKE) run-record WASM=tests/rust.wasm # test the same trace with a different wasm replay target/release/proxy-component instrument -m replay tests/rust.debug.wasm - wasmtime --invoke 'start()' composed.wasm < trace.out + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out # build-only test target/release/proxy-component instrument -m record tests/calculator.wasm target/release/proxy-component instrument -m replay tests/calculator.wasm @@ -40,13 +40,13 @@ test-dialog: run-fuzz: target/release/proxy-component instrument -m fuzz $(WASM) - wasmtime --invoke 'start()' composed.wasm + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm run-record: target/release/proxy-component instrument -m record $(WASM) $(MAKE) run-viceroy URL=localhost:7676 target/release/proxy-component instrument -m replay $(WASM) - wasmtime --invoke 'start()' composed.wasm < trace.out + wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out # test host replay target/release/proxy-component instrument -m replay --use-host-recorder $(WASM) target/release/proxy-component run composed.wasm --invoke 'start()' --trace trace.out diff --git a/assets/debug.wasm b/assets/debug.wasm index d22efa2ee77ae892be8f27d0ef85de41bc86156b..33a5ad9424b0a1d6fba63ec1fda97cfea51cc33c 100644 GIT binary patch delta 13336 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 P(B<^2XRAk2`H24oJYUma delta 14091 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

U&>8^(jVn!UTup1-

a+93^ZE?iA(O)~v)5{E36AO~|OfISPaI1X?w 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 Dd|Nd$ diff --git a/assets/proj_cargo.toml b/assets/proj_cargo.toml index 58aa0dd..6a52f39 100644 --- a/assets/proj_cargo.toml +++ b/assets/proj_cargo.toml @@ -11,3 +11,4 @@ path = "lib.rs" wit-bindgen.workspace = true wasm-wave.workspace = true arbitrary.workspace = true +talc.workspace = true diff --git a/assets/recorder.wasm b/assets/recorder.wasm index 3a7c0792546481b50c41020d8e5c1b94e8edf9a3..dee6ab1c23ce6430f9ad7995cf1f842a1417367e 100644 GIT binary patch delta 55087 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 delta 53922 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 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } +}; + mod bindings { wit_bindgen::generate!({ path: "../../assets/util.wit", diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index e64a57a..ddd92bc 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -10,3 +10,4 @@ crate-type = ["cdylib"] trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true +talc = "5.0.3" diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index 8566a28..4b3939d 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,3 +1,12 @@ +#[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] +#[global_allocator] +static TALC: talc::wasm::WasmArenaTalc = { + use core::mem::MaybeUninit; + static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } +}; + mod bindings { wit_bindgen::generate!({ path: "../../assets/recorder.wit", diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9de3718..b445bfa 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -22,6 +22,8 @@ pub struct GenerateArgs { /// The path to the output file. #[arg(short, long, default_value("lib.rs"))] pub output_file: PathBuf, + #[arg(long)] + pub use_custom_allocator: bool, } #[derive(clap::ValueEnum, clap::Parser, Clone)] pub enum GenerateMode { @@ -84,7 +86,19 @@ impl GenerateArgs { let traits = trait_generator.generate(); drop(trait_generator); state.output.extend(traits); - let file = state.into_output_file(); + let mut file = state.into_output_file(); + if self.use_custom_allocator { + file.items.push(parse_quote! { + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] + #[global_allocator] + static TALC: talc::wasm::WasmArenaTalc = { + use core::mem::MaybeUninit; + static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } + }; + }); + } let output = prettyplease::unparse(&file); std::fs::write(&self.output_file, output)?; Ok(()) diff --git a/src/instrument.rs b/src/instrument.rs index 06fd281..ce97122 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -17,8 +17,12 @@ pub struct InstrumentArgs { /// Whether to use the host recorder implementation or link the recorder component #[arg(long)] pub use_host_recorder: bool, + /// Whether to use a one-byte page size for the wasm component + #[arg(long, default_value_t = true)] + pub one_byte_page_size: bool, } +// TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); @@ -63,10 +67,27 @@ pub fn run(args: InstrumentArgs) -> Result<()> { } // 5. Generate Rust binding for both import and export interface - bindgen(&tmp_dir, &wit_dir, &args.mode, "imports", "record_imports")?; - bindgen(&tmp_dir, &wit_dir, &args.mode, "exports", "record_exports")?; + bindgen( + &tmp_dir, + &wit_dir, + &args.mode, + "imports", + "record_imports", + args.one_byte_page_size, + )?; + bindgen( + &tmp_dir, + &wit_dir, + &args.mode, + "exports", + "record_exports", + args.one_byte_page_size, + )?; // 6. cargo build let mut cmd = Command::new("cargo"); + if args.one_byte_page_size { + cmd.env("RUSTFLAGS", "-C link-arg=--page-size=1"); + } cmd.arg("build") .arg("--target=wasm32-unknown-unknown") .current_dir(tmp_dir.as_path()); @@ -128,6 +149,7 @@ fn bindgen( mode: &Mode, world_name: &str, dest_name: &str, + use_custom_allocator: bool, ) -> Result<()> { let out_dir = tmp_dir.join(dest_name); let status = Command::new("wit-bindgen") @@ -154,6 +176,7 @@ fn bindgen( bindings: binding_file.clone(), output_file: out_dir.join("lib.rs"), mode: codegen_mode, + use_custom_allocator, }; codegen_opt.generate()?; let status = Command::new("mv") diff --git a/src/run.rs b/src/run.rs index b71dc7c..2db054f 100644 --- a/src/run.rs +++ b/src/run.rs @@ -74,6 +74,7 @@ pub fn run(args: RunArgs) -> anyhow::Result<()> { let mut config = Config::new(); config .consume_fuel(true) + .wasm_custom_page_sizes(true) //.debug_info(true) .wasm_backtrace_details(WasmBacktraceDetails::Enable); let engine = Engine::new(&config)?; From 872e7f1b2d8e49b5648d45ec398a9707babbbaaf Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:18:21 -0700 Subject: [PATCH 02/18] try 1.92.0 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ea1112..637cb12 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,7 +19,7 @@ jobs: with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.93.1 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.92.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 - uses: bytecodealliance/actions/wasm-tools/setup@v1 - uses: bytecodealliance/actions/wit-bindgen/setup@v1 From 2a1b2d3cda3eabb1453532f0a6d1f0ce828b3e4f Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:27:10 -0700 Subject: [PATCH 03/18] try mac --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 637cb12..d9df3d2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: jobs: build: name: Build and Test - runs-on: ubuntu-latest + runs-on: macos-latest env: WIT_BINDGEN_VERSION: 0.55.0 WAC_VERSION: 0.9.0 From 3f1ac9c22fa7dd7366f29ec9025cd7ec4352c397 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Thu, 16 Apr 2026 18:29:43 -0700 Subject: [PATCH 04/18] pin wasm-tools --- .github/workflows/main.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d9df3d2..ebf66bf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: jobs: build: name: Build and Test - runs-on: macos-latest + runs-on: ubuntu-latest env: WIT_BINDGEN_VERSION: 0.55.0 WAC_VERSION: 0.9.0 @@ -19,9 +19,11 @@ jobs: with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.92.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.93.1 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 - uses: bytecodealliance/actions/wasm-tools/setup@v1 + with: + version: 1.244.0 - uses: bytecodealliance/actions/wit-bindgen/setup@v1 with: version: ${{ env.WIT_BINDGEN_VERSION }} From e51b32296f4b6916054ed5f9446243830652da9a Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 22 Sep 2026 13:37:54 -0700 Subject: [PATCH 05/18] add page size 1 adapter --- ...apshot_preview1.reactor.one_byte_page.wasm | Bin 0 -> 49589 bytes src/instrument.rs | 29 ++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm diff --git a/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm b/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d5067817cc2bcfdda220cdcb45abfb70ea6fcc3a GIT binary patch literal 49589 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 literal 0 HcmV?d00001 diff --git a/src/instrument.rs b/src/instrument.rs index dc7e02b..99534da 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -26,6 +26,8 @@ pub struct InstrumentArgs { // TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); +const WASI_ADAPTER_ONE_BYTE_PAGE: &[u8] = + include_bytes!("../assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm"); pub fn run(args: InstrumentArgs) -> Result<()> { if args.use_host_recorder && !matches!(args.mode, Mode::Record | Mode::Replay) { @@ -88,10 +90,20 @@ pub fn run(args: InstrumentArgs) -> Result<()> { let status = cmd.status()?; assert!(status.success()); - let exports_wasm_path = - component_new(&tmp_dir, &wit_dir, "exports", "debug/record_exports.wasm")?; - let imports_wasm_path = - component_new(&tmp_dir, &wit_dir, "imports", "debug/record_imports.wasm")?; + let exports_wasm_path = component_new( + &tmp_dir, + &wit_dir, + "exports", + "debug/record_exports.wasm", + args.one_byte_page_size, + )?; + let imports_wasm_path = component_new( + &tmp_dir, + &wit_dir, + "imports", + "debug/record_imports.wasm", + args.one_byte_page_size, + )?; // 7. run wac opts.generate_wac(&imports_wasm_path, &exports_wasm_path, &wit_dir)?; let output_file = "composed.wasm"; @@ -169,6 +181,7 @@ fn component_new( wit_dir: &Path, world_name: &str, wasm_file: &str, + one_byte_page_size: bool, ) -> Result { let wasm_path = tmp_dir .join("target/wasm32-unknown-unknown/") @@ -184,8 +197,12 @@ fn component_new( wit_component::StringEncoding::UTF8, )?; // create component from the embedded module - let component = ComponentEncoder::default() - .module(&wasm)? + let mut encoder = ComponentEncoder::default(); + encoder.module(&wasm)?; + if one_byte_page_size { + encoder.adapter("wasi_snapshot_preview1", WASI_ADAPTER_ONE_BYTE_PAGE)?; + } + let component = encoder .encode() .context("failed to encode a component from module")?; fs::write(&wasm_path, component)?; From 1595c79f9936b01eaa3413168a78f5aa2467f64c Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 22 Sep 2026 15:57:02 -0700 Subject: [PATCH 06/18] fix debug and recorder --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9457206..fb031b1 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm From a2b547afe5b1a288610ec43d8ea1cc43440483e2 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 29 Sep 2026 19:56:10 -0700 Subject: [PATCH 07/18] add libc-alloc --- Cargo.lock | 6 ++ Cargo.toml | 2 +- assets/debug.wasm | Bin 86941 -> 76145 bytes assets/recorder.wasm | Bin 236915 -> 226115 bytes components/debug/Cargo.toml | 1 + components/debug/src/lib.rs | 2 + components/recorder/Cargo.toml | 1 + components/recorder/src/lib.rs | 2 + crates/libc-alloc/Cargo.toml | 6 ++ crates/libc-alloc/src/lib.rs | 176 +++++++++++++++++++++++++++++++++ 10 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 crates/libc-alloc/Cargo.toml create mode 100644 crates/libc-alloc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6bb481a..c84bd2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -566,6 +566,7 @@ name = "debug" version = "0.1.0" dependencies = [ "getrandom 0.3.4", + "libc-alloc", "talc", "wit-bindgen 0.62.0", ] @@ -1200,6 +1201,10 @@ version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +[[package]] +name = "libc-alloc" +version = "0.1.0" + [[package]] name = "libm" version = "0.2.16" @@ -1584,6 +1589,7 @@ dependencies = [ name = "recorder" version = "0.1.0" dependencies = [ + "libc-alloc", "serde_json", "talc", "trace", diff --git a/Cargo.toml b/Cargo.toml index 0c87833..9e15512 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ members = [ "components/debug", "components/recorder" -, "crates/dialog", "crates/trace"] +, "crates/dialog", "crates/libc-alloc", "crates/trace"] [workspace.dependencies] wit-bindgen = { version = "0.62.0", default-features = false, features = ["bitflags", "std", "macros"] } serde = { version = "1.0.226", features = ["derive"] } diff --git a/assets/debug.wasm b/assets/debug.wasm index 4e2ff00289ac5e430daf55a63e1da5d6bb03885d..84bddb069dc3e8bea6d0652110aeed5c4c6c09b8 100644 GIT binary patch delta 7305 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 AtN;K2 delta 18136 zcmbV!33wD$)^?q$>Mh+Ng$4*oAl1#j2hb4N3k76HMifwJLJ}pN5VEnTNC!n7_vMOl z6c^lZ!$IS&Goa(lxS*gSsHiL=qN3xtqK@*t=icg0I*I>3-}ms)U3J%U&w0-|@4Z!> zf4^nkw$Zcs3a|e4p~kDc_m~|I(;*6)rjJ5;(9|eE!JyY46w`yZ2mF4&p=qW`;z+R2 zzi-Pz&3g-V68%HAhllXo`-fh!@K0#jbOeml78p3&$rE9hryFFLe!eajR zPH`;~DlS@77Og2Qs;F36tX)lkI?@~p&gj~u`{)rPXTM8_Y5e5xsdmcMw4`ECw4T<` z!i(r)Dq2gIQ1PX78I}H#E~ore7hFk|vBhPB&yBCXf@+plRbNHt3_Ney@|EYWm{Ygl z!t(jo&=d3|Jw;E`GxRKdMPJf;?dWs*h`yy?DD9PNj6-5}yR+y%@o2mKv|fmeY53fq z(G#D3t2?c49AFuQ>cQ=I(tVBI}Q|>)gq=vA(`uv+foA8ur`Sg zdd+X6baL;L>2Kni-m|;58i)rD89`gK$$CjppD=wPy7h?!b}KboTNG1rByVT}wm*hJ=+ngy8~$FbM`U>n*V}KTI!(AM!_ceO79Lg0^9Mot3cyJ=ZpzPz)crG3!||Yj8hzeq(?Z zvW?!l1*xtX+_8<)CkD@@O(J8+T6$32IOIioQ=B=p2fZyW9C|%%6&WXFcX*vAix`d> zgG5Igx7KShYpWQ2!Xnx(Hk>ek?ibrn7~Uzl20v>d1h!d{t&?W#PAXb>Dv__Y- zbDiBGr{09$T{QX<+9v#C-lH2E4~+5X^sYGUJORDkKJFC#!TQF96T4FA#z$GDwvIvG z7wt}A7|uB55kU91QwBrA{PAJ^i!~yA;wW+5_+T?#K8Kj_rwLu@0rB*Ne3XASVHxdi zj85!JxM_17xXK%oMx$H$It4xNvF((E;)Lw8K!`lhg0Y{Y*7tUD!r9+#t^V@kw5pwMW#=XrO~= zyiRPGIgb7<4$ho}ZUax-NN8xQW|Ld$lX!F&q zoAG(sA1+3(;OTeKp2kN`A4PO6O!gHz>^bB4T-V2KukEva?);k-Soes=GdYazI`d@u zRAkTT2K|hl<6w>Tb2`&o;+8oVL%ObWb5J{cZXW$4=FJ^4@EcxGh6*&_HM{k<% z&}Nsj`w?y?&Bu+nYJMD_p#|mgv%k1!K@3+J(J%42aOyB|!or^R;bsE;*zEdWa+*Jr z=vOpIJg{&eR{HM3&G@{$=&YQ(*(my0C*+t`17AnjXG|w#z14WEXgEtSycn+4cwKQ& zN1yejU%|vzp7W4XPs>xE&Qm;NM< zE$N%~CmzoEhh|+bhF12YEh1Xkm0l97EA!~D;`YkX2sIy8UZlUiMiebQiko>=_tO10 zRL_88&8!{(4_sY6rPD(^2(lpCGZTV@y+PY+trz>MJ40wW&W7hrLCS41eh${%({jFQXz}hVF zam{4ntJ%D^OKRmx@2`#U-L~2x_|3Evgjqq-)BD zBBrBCBOV7p&a^$_;=}Y1zUu4O!YEs{VPHk3qXy(A&l|P}%Jj#as%q!m2j6+nQyVcL zU9g*ABZfWQZmf^v!uCu`r$m_pJEL3{mpkuilQ6$(ZmQz2*Y#;NQN)9YZI(y81^P=o zpIM-9b-yj#qWE#X#rJ0Z#{AuF5A#vmsb3v7<3=JxsNrlghV?zK$IxiA9+UDSA$gqp zaf3l1tn)Z(-OHC`!>1E_%ycatRI36#ni_Ko(L1T_ z;JZ;g5I`Z&Q2uoYl6rq8dv@B#SHC_+dm31P(%8e=Ljv5X=k~oUbq}kLWHX z)DD3yWk{aKKaInb?P*(3+pKe-i#o=x?J2LRUK|Oq#Ack$4UsWDi;NF{L~B#zz>4aK zPYDfS0dK#pF$^Fx^zI4^!DB43#3N>6+0jbb0OI)}UW({(EY0t%td2p5Fsz5<5H_W) zd=8<;SY8(iz~@ssfuRJT8_hPt0htXTbvO{T1B`yqb^h|R7<^~i0T~!QQn4xHVD7kd zWs?`;hhkHznWmIhiq~5Kf6)2KMAwC<_{6?LZhA6vpN@EDk!MPuwFLZ~=ONjN3sDU0Ns< z#Ad)i|1EKN48D(Na934_TS8CjNJH52IC)_|i|rgacFf0}45ugKdHJ~!vwXSq6^H7| zozbzdAG1ic$>87Gv;0ju2E)?is(1VIu|b-^2S~#6&0|9s%2BJUd;MJ7zWPYDIz*a!~8b!F0%(n7|H(y*4&lLC!)R zU{A>ekMbuy%1*0hQ>SXj_9Vd)_FzhYiA~WA3~>lLiIJ1EfV2&>Bh=U$Ai^{9g_PW8 z8v*HTZ!-m$00=b7iw-b=SX5jvfC3C4Tq78z0Em~vIT}?if&z>VNw84nA}GKB(O7IP z3{5En0j&uHNdU=v7eGD*pfrr$Qa}h}a6)Txs5rCIgv+BAfy1%TguS;}=)kSVO**Jh z!G=8_#mO+~;lL|ZDCYt+ostxZo;k(ohrwV%cuafw-PoK0Yaxi66`Cv8{-uo zAjeJ}Qff7eeVXG9n!6(DO=BlVPZA3^5XS2@msW5L<6X8I8#Ddi*hVPU#5Ul^PJO)@ zHsNhy4=l~P`zMs(k0IYd$K{cDusRa34R~ua`qY*>o;D&TWKJ$bWoLvz1E>nbB5Agl zm6c|jNJPQZ!BW&UKzklXA=T-S2mj(@ZQWG`G@%A{wi>apDLooF3wwo#ml2_}h7m?% zlhWb7xbicB2x4v4KVV`FONviOhcJwNcglpiP3RM;4trb98(RGGXA0~Llz3~0WIDs={`hLS2ol3O-v`= z#h|X-hSt^iaRf?FvK3sOcf@j)6A---zOWXS$az_dv2SA;@Me_x?O=I}MZ&*hu&TEl zj7SO37BRyC_jnX7~Fb0Dt#DR%x z^cH?4846n#iTQchCy-Dd*#R|j7?5+Xurd~dFu(f7bTjxCc8Tz63u6*RDV{550EvZ? z;li5@UJ|S7arV*_ldy|FZeY#oUrHTfqqLS==<@#rpim;AhO8mS zY%!iC9fNyf38`AKL6|JJ2sUvUt;qp$8(4}REQm8}$Fe1BhswdraqCUS1hnkVMBQto zqRs~AMTh{MHYHEzoNY5an5TpA@Fnwf_mX+K=`c^11;{6=$+ozxV507h;C5i5E=#;j z)Fm(T(r^VvD=ismlG$l^G5~0n4L@Bmb=7i+%ozxnIABLMTRv`!~mH;YR09UbT3B{UrTB_#2(iNGO3dB5p^p}lcICznlTXD&R zI{{-LN8&qx3|N4Ms0zycX~5|&Lp#8Twpd#nXAPj?yjbS%UP)D$k(kbEY>@yNE`@Qq zH9(@)#)`)EG2YCjSSSM1I!8%uClIO83>bkj9YRGLn+fm_s95bLOhtX9jv)=^Q%lB| z-wB1W7z9fSg63jmp5CRoKBp({TF~4YXLK#1H)IAY$hE!Wa6Dk8$_mvvaqK17fy0`L zRdVUTjBDj>)*e3%T z$S&w4TGz#q@UVWSzL6kvz5p8{2yn=089JCDh@}Uh0`R{u)FOF`+>*%NtRLmo>{Gn= zLZ&dCEY(H&b|RPnlH8z)lqvi(PX#w=8OM1$ifFBvAnKF+3-nELEsvBAlO`yaS5YoA zg@7|qBb#lb}&#Z+vST!0A1;!WRX9Xn)r5bVZ; z8sxXtCQS1X%N&?7xA)l8F8Mvg|wiu(z{R% zonv5EI(&s#cgWxHHOviP!={(_pxC*vuX$zs_eO9dz0Kql;9+lr{dg;hcEAlgn@?Ie zJq~Zf(Ua>R&1Ymq@WebL#`E(Qgw=yRxl|UD2o_Era>&JlTynq#mSs9)UacZvDwYun zauHz^mgD~=m~r~k49a*wiPJKMvYv#pylRGIP885KW|JGqR!Bw#cAasi!7u&f1292-RL;gT zQ{7z?p^#)E=YVO0w|UA{?r3!!kOljsSUw_6lm(md17^@KaK5;5KNSTOZdx8IWVRXy znC1g;_3VJhfvtJjx*JSzg~ze*D|bM6LxgaMs@|)>5~|@3NVB0ZKO+E0NW~dkxojJo zrB<>-XboW%11(plr{F_6$8|p#8D>+y$!8xpg;GN?o8WXFA=v=U3C*QcvWeL{4iL&` zG^T^24^Hpg!QwIwXE^%s@zIA5>5?M4Y$IP%;3t1rFW2)uI!FSejy}K;$?_NZqUM2f|cQ_ z4NgWVPH-}uYqGsLVGukG_-9h4wQ@96Nk`KaC&TjnVads)qe&o3#3@H}<0P0F#%Cei zgrOl}Xfk2wDq#SjDq+AnKxu&<$Mb~N83TucdNOAahD5YBd4pl=I5X$OAzdI9qPzo? zc>@o9I5guhO1TA#%)ruQ-hc?m8@kFHdR*!v?30PZ7vYC(e4;G(4mu|emIR3dwn3iY z#33!|W3(|mc@7SsO*3*j<%xMl4Chx~A5s!SXDV;V9%ve8B_MI|1J$5>M)n%>q2R^s z$j@hk{DKAqUx~+e_*%t}kl_X^t0TaMd)6u0Foa~aKx^3E5GIo*_LQSr)9DEg_MkTj zD~198!}?Qv17KvQMQ;QL%J`+(P0LWpd!RZqg%=Ib+@M#ni zaSnXooJ<1H9%0Xzn2vWk&{nyQ!5Q4ePTXCGO6mk1%gq~Jn^0oH<5*~LNEK4}po#U? zLTxN@E*Kw&6aYj;6nQeh-67`hMHKMQl#s&DE^PVwo0oe^k}9v7g%l7{&g=;#VRY6g zA`$lhM@5CJQCX4MRAC#u$(M>jy5^&}>ED2~UJ=?ygo<5~`vifbb%@qrrG2u2dtD3h?} zBWf4cu>b!G*NB_U{}qsv>t+qO6vAkk`%)Fm5;q5GTyCZQ8>F@Xs?2?Gtp6hSC6?U^ zsHlkl9#Rw8Ex9tRu@y3;*CyUgXnh!g{Y{I+2jA2pfIccz-ix>3Iq;R=Nqhi2$1Z#U zz%nS{i-DNIClVYh|I555JLlRY(_TE)K>(#>-ji%tVu`cAlp5JjzJMXKM~m#oL>*fM zoD^u-`s=@!@c0Q0w%Z&~Ia0+F=?>1t=?8aZPze6!~(4&JfDy9>ncE>uoOTbOq{eMDeL8~3K9pVI7Y0SmhRdS`5!x2kX_LCC8##yj2FOIh;eDn--NsflO<(zRyQlEJ6BvVEztU2JTNue%j zdpVk1H^T4lty@jPDpPo5bpiNp;AGrz6vf*kaZi)Z&{zV`)f6KP|64p#z<5{+?;vF) zU>)LNIop)Cvpiuy*#}?cVH}Ke7E+S?le;W%NoG@?i8y~~sW~8@^APWWliMuGcA0Op zYq9j`E*~*NhZu`9ks46>o@$PEtT0wH=OTVH1?&hEOHxym;U$Ujae$A{Kk!BXLV`aG z69ZJ-NYMy*K48T4if_nB5KXR3 z($uk?i-rTAwaYD{P8!7QzfT*)b!A+7KA- zh5%)VMBGMVQMJRx9Y_yiQ2VvbMn>XgGI#s9IXNb>(wwXwv_X;m{;g*78kwdDU&Z3stg z@_%`(r zHf@XW!;T!xrP#>Za14&;NqympP11_+1L9JzO@zP2RDAx^iq_%04c#);YzRDZwr1Ah zc@-5&5PrrrFDeDJSQxz3g>9<6FoS|E&R>#&7Gx&X=pg*)t_VLyVj#=mQi1Fee$*tm zY?AP!%q9G4pW3vKP2f2G{{u2;6X$k?+~m5OG>@Gwk`$21C#-DU7RF?W{~ySV|2{O^ zBK#89c+bg2ro3u~O!u%WvFujJY|>EznV4T;Heu1GmEo!tGB}!paATG3k!5Q3d%}3+!*R$3xUGNnQZF@JSmn1VaFX0x*jy@h;~F;pgB88Qg;| z!a*0_G{%z=LmhM>{HlX4SO#PBBgi(Mj6`t$g9zj!fEgq1-Be1>3^ASjZb1p-jb3xsR(#%2=#9#7$n!x$rP{f}_#v6wT;xCOT z(>-HXN|7=lYlC&eF33LSDon}?UuBPH(I8<$Z+Lq{3+8J2Soc&5sqig7Gf^#Q?Gz>T zr{TvHPu5Qhyv&?H3x2{s%g7Y=ntu3A*VHvPq$huygpNDJ7i)UpCo%0W8j4=yFPcGL zi**-0i=Rc!y!Z_K`fKCG_u;2c)7Ms@&2wuP;xqS>iS*CLl1t_h?H5}v?Ur_krw)E+ zl3$!QJG;?)*)AQ;KD>MeJ_lUEpBG*+zPO>(X*>yWr}!0Mli0a^F!d1L9n*Y0&*s88;;U^PMb!?6 zdWpw&oT&HCN3UGrc{7vxG_H9wMATPY^VXz5zmw(E%cqG)-|ZrPeJhXpi!N`M>jNsp zwQpsM=sWF%z0)I}dV7pMa6z-80%Oo+)a>3Am+U-?^2Pq0i}b-YZp9oLBA$NdQW`48 z?3$yWP$CBIo*@qJ>Od!o-*ye80x@9sQhnGkacoz%Sa`T|D1Y3E(ZX9PI%^VEHTd&f z@zd_}^^=B*_ItC$%soMI^ShRJcnkucEb@1EZrGeg8DiJFqxBIJMfBK-V(Gr)Xrx&1 z-r}@T3wc#@Crz&t^g}0c8C<{OiwxFs`uOJV+-W$Gxub9d3I+& zgA<}`@zMLo`^HJtuwpujc6)m3C+E9@Wa+2$Vr^#T*DR~8i&hm?mKBemC1=EhgFo*j z1|9N=^@l9+?w)jgLSJrc4T(mhvU$;>r8RXE2TF4c`rtVI)Iwb5hy@>X(I@p{`MQd{ z-GSibwa^3XI9-~CC1@{peK4D*i2fhW)2H@;EV*gJqS56=HPNND)5Iemmh022MAx_H zicMG+WtGMF zxp-~qY>~6?9Q}+_lrnDH*EewHBq>ep(uNHo%DLfyM|{06;+u22Ts0ulO^n>%U!U7A z(IX(P-tQ00b9y;*6-k(KhiT(Qr(Ags6z!;h@W*k_oFF0AuJkV9_KG1`r;@1O$ z7K-aXzD_T?O#F6WtQh&pabm=`eQx;PC!&YEv`9RBaJpWcs5>=KB3)=s?c(H2n?C8O zmtHG7cQ`aNaE^3~xhV$fm3Hn*wXFQ8xct*%AIefmj?FS#l z#Mr}Y_42bDW|;VO&1Z*C(ksTR>xrL5^d;`~HJ?SOQat+E^1#xw)VM=M_@mBZ(&r-r zRSQx}`it+692clQt$FF(FZ#DTr(#*{;+hu4gQ=DyL0X-=%9EnNb(ZiR8K5s)EbcgR zhPd*`akO0AexyQQQ6UQ!ec4f8xd4~5#f~on`g!s)c;bqhvbxf7Cq>U+#8vH1lJ`+W zF_c{(HhdLLTczSh?YyXX^oK5D+Z(;a*FU72wRJTYilToN>Z{`-@9PUZL(eU(i;FH_ zUux9jSA*8~qr}rYyNg@@9TwMppFwLxyYI)iB?FC%=xW*GmT$(1Dc@um7t@vQ{S0F* zU5aZ*jQOq|3|wejLTj7d!{F)0rO74}jLVYM!%#(k#5~v2<>Joouca$Q{tqksSJGlu z>0A-snI*P<^6SVWFRmv~bo|P) zx*NpaA9F~EUw+Ix?nd%RUtULE=%RQ<$xWjF(awV!D66Ejwz#IOs%~jbw617TMQIfE z_&W^e+)P$9iZoJIQMRZ!DhK|Ps5{yVKPFs%v~%{Y)Uj%5MMac9WVaIht%c~)6_xA7 z_M;uMZlg@@TQwwFQHHRyZ0L~aIW?uFw~Jqo=FuIZ%THbCPBG#qn>L8Ef9h)7MTl~* zL_9pe-Qu2~_&1u{f9jHPF9k}mk|=-Nhfw$2E7=(vDUh7`e(Eh|{M<$4yc)!hE~ow6 z-FT4taY@D^{27VzvdVL#5~B}^JAdvy>S4;Ltt%<3luMLXo2Wg$moBSI6yfp_Syoz8 zlPJUGpD8SczZNz&!=cJw>qd`?X}|O^9;1kO^R);yikp9#(erWY&`e=vl@OcfSo#E| z$#1EECq?>yI>n!&j;e@ttxyffmKH5}nu2cI+Pb2;XQU)$OQYu$SJqXqIOkM6OCi;w zthT7G?!4!uJxeQ>KTp9Z=Bp`QTvNHM;xFXqyQ<=<^ZrU+F0MLni@YdVR<$)wo|0ut zmYnwj1)|Z4;<}om%Gwvn&mz>+EUoz)3#=}qH806t6{VGbCm%{HiBk+d;em>UE_z;9(>#>}MJBiG76X|&RXx&+KI_+Jz znI_P_bwAQ%&wd&moz?IHQKX?>r%?OBL#m2OqGgqJrRUZZRUCj+?f}{Jal>;&Gd%}s zO0yp64P$i5_I$!CN)FT8bBIo8b|3N##i*Y)?9*waahS$5d>x=M^jSmHphDwwn%?kQ zI!!meph0Ri__Hh>jU$P>0^HG;4bw~-OATZ-!-)N(n$KgVY(LwH$OC7$9F$A zyv|=o8`69mG%qGkdaQ3oSb#_6lnO?M?H+^L!F+=@zbfE(Oo9a zIDKGAQC-nM)?ZC!QN_S$ba81>Rdf-Od}i+NRs(Du{?ITujj|e6rPBz#<3f4!)SKya HXU_isTZQ>` diff --git a/assets/recorder.wasm b/assets/recorder.wasm index 62ff851a0efe87e68296ac2811984ddfe3f74e00..04b89b988730c479f2cde793450151cdd8bacd5b 100644 GIT binary patch delta 21690 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�uO7&~-Iw!J4V+jW{M$gJi63Fz)CH=O zfi!ppZ>-gFGq@*T$(v}k4H;0?RrcC#)M&MMlELe_tl?^=Ert(5Owc!zNAR^ce*wX| zVn-%6+>gbHOx_+_P}M=a17DA$8#$Oue13Yy1}K2680tHm!YAU=Al{5`#1{AC8@wqF z#7|@)d{a+BrVPe%Z{~+Xq9ZJ{8{#=JEInVFwYFhkY+}2#>{MF?0+TcU^Eq zGhzrr*{vL>PFVo290DEPCiV>Bovobz?u*6tjoavFgH-!z;QUf5MSl+M)+`KQ_-ggBKuOb%H?LfTR1J3$0KXolgpFckJ!1zxvV@^QiB@PFqy$& z5%NaBUV0AWmFcJ$K8!cUJH;D^!F7BiZpq7W5t#>byxFv zMZ6#OFpnqV{jivPq&Y_BcBD#q=`8?eF42S>4OpCJOT^9R=TffNX>25f+ zG{1r9{X_x6tZh%3ub4duYqsc39>`4n1-;2Di4((d4)jhR=#JAE?!!WwX6fs`lA* delta 32011 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
    EdL1!|1d4 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 XFS^R6RA03mCdW~OlBL7sHsAjPKqv@2 diff --git a/components/debug/Cargo.toml b/components/debug/Cargo.toml index 6609ae2..c659090 100644 --- a/components/debug/Cargo.toml +++ b/components/debug/Cargo.toml @@ -10,3 +10,4 @@ crate-type = ["cdylib"] wit-bindgen.workspace = true getrandom = "0.3" talc = "5.0.3" +libc-alloc = { path = "../../crates/libc-alloc" } diff --git a/components/debug/src/lib.rs b/components/debug/src/lib.rs index b9e9bbe..8e0fc98 100644 --- a/components/debug/src/lib.rs +++ b/components/debug/src/lib.rs @@ -1,3 +1,5 @@ +extern crate libc_alloc; + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] #[global_allocator] static TALC: talc::wasm::WasmArenaTalc = { diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index ddd92bc..65d6d67 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -11,3 +11,4 @@ trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true talc = "5.0.3" +libc-alloc = { path = "../../crates/libc-alloc" } diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index 4b3939d..72f3970 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,3 +1,5 @@ +extern crate libc_alloc; + #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] #[global_allocator] static TALC: talc::wasm::WasmArenaTalc = { diff --git a/crates/libc-alloc/Cargo.toml b/crates/libc-alloc/Cargo.toml new file mode 100644 index 0000000..6ab6b85 --- /dev/null +++ b/crates/libc-alloc/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "libc-alloc" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/crates/libc-alloc/src/lib.rs b/crates/libc-alloc/src/lib.rs new file mode 100644 index 0000000..f25c160 --- /dev/null +++ b/crates/libc-alloc/src/lib.rs @@ -0,0 +1,176 @@ +//! Replaces wasi-libc's dlmalloc with the Rust global allocator. +//! +//! wasi-libc's `sbrk` assumes 64 KiB wasm pages, so its dlmalloc traps when the +//! module is linked with `--page-size=1`. Defining every symbol that +//! `dlmalloc.c.obj` provides keeps the linker from pulling it (and `sbrk`) in. +#![no_std] + +#[cfg(target_os = "wasi")] +mod imp { + extern crate alloc; + + use alloc::alloc::{Layout, alloc, alloc_zeroed, dealloc, realloc as rust_realloc}; + use core::ffi::c_void; + use core::ptr::{self, null_mut}; + + /// `max_align_t` on wasm32. + const MIN_ALIGN: usize = 16; + const EINVAL: i32 = 28; + const ENOMEM: i32 = 48; + + // Each block is laid out as `[padding .. total_size, align][user data]`. + // The header is `max(MIN_ALIGN, align)` bytes, so the user pointer keeps the + // requested alignment, and the last 8 bytes hold what `free` needs. + unsafe fn header(p: *mut u8) -> (*mut u8, Layout) { + unsafe { + let total = *(p.sub(8) as *const usize); + let align = *(p.sub(4) as *const usize); + ( + p.sub(align), + Layout::from_size_align_unchecked(total, align), + ) + } + } + + unsafe fn write_header(base: *mut u8, layout: Layout) -> *mut u8 { + unsafe { + let p = base.add(layout.align()); + *(p.sub(8) as *mut usize) = layout.size(); + *(p.sub(4) as *mut usize) = layout.align(); + p + } + } + + unsafe fn alloc_aligned(size: usize, align: usize, zeroed: bool) -> *mut c_void { + let align = align.max(MIN_ALIGN); + let Some(total) = size.checked_add(align) else { + return null_mut(); + }; + let Ok(layout) = Layout::from_size_align(total, align) else { + return null_mut(); + }; + unsafe { + let base = if zeroed { + alloc_zeroed(layout) + } else { + alloc(layout) + }; + if base.is_null() { + return null_mut(); + } + write_header(base, layout) as *mut c_void + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn malloc(size: usize) -> *mut c_void { + unsafe { alloc_aligned(size, MIN_ALIGN, false) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn calloc(n: usize, size: usize) -> *mut c_void { + match n.checked_mul(size) { + Some(total) => unsafe { alloc_aligned(total, MIN_ALIGN, true) }, + None => null_mut(), + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn free(p: *mut c_void) { + if p.is_null() { + return; + } + unsafe { + let (base, layout) = header(p as *mut u8); + dealloc(base, layout); + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn realloc(p: *mut c_void, size: usize) -> *mut c_void { + unsafe { + if p.is_null() { + return malloc(size); + } + if size == 0 { + free(p); + return null_mut(); + } + let (base, layout) = header(p as *mut u8); + let align = layout.align(); + if align == MIN_ALIGN { + let Some(total) = size.checked_add(align) else { + return null_mut(); + }; + if Layout::from_size_align(total, align).is_err() { + return null_mut(); + } + let new_base = rust_realloc(base, layout, total); + if new_base.is_null() { + return null_mut(); + } + return write_header(new_base, Layout::from_size_align_unchecked(total, align)) + as *mut c_void; + } + let new = alloc_aligned(size, align, false); + if !new.is_null() { + let old_size = layout.size() - align; + ptr::copy_nonoverlapping(p as *const u8, new as *mut u8, old_size.min(size)); + free(p); + } + new + } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn aligned_alloc(align: usize, size: usize) -> *mut c_void { + if !align.is_power_of_two() { + return null_mut(); + } + unsafe { alloc_aligned(size, align, false) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn posix_memalign( + out: *mut *mut c_void, + align: usize, + size: usize, + ) -> i32 { + if !align.is_power_of_two() || align % size_of::() != 0 { + return EINVAL; + } + unsafe { + let p = alloc_aligned(size, align, false); + if p.is_null() { + return ENOMEM; + } + *out = p; + } + 0 + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn malloc_usable_size(p: *mut c_void) -> usize { + if p.is_null() { + return 0; + } + let (_, layout) = unsafe { header(p as *mut u8) }; + layout.size() - layout.align() + } + + // Internal aliases used by wasi-libc's locale and atexit code. + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_malloc(size: usize) -> *mut c_void { + unsafe { malloc(size) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_calloc(n: usize, size: usize) -> *mut c_void { + unsafe { calloc(n, size) } + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn __libc_free(p: *mut c_void) { + unsafe { free(p) } + } +} From 4608472baa383ca48882eb30414b00f273806bae Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Tue, 29 Sep 2026 19:59:18 -0700 Subject: [PATCH 08/18] fix --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index fb031b1..600017f 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ all: build-components build-cli build-cli: cargo build --all-features --release build-components: - RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p debug --target wasm32-wasip2 --release - RUSTFLAGS="-C link-arg=--page-size=1 -C link-arg=--adapt=assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm" cargo build -p recorder --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release + RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm @@ -64,4 +64,4 @@ run-viceroy: done curl $(URL) kill $$(cat viceroy.pid) || true - rm viceroy.pid \ No newline at end of file + rm viceroy.pid From 361460a68ee9a981771aa1049c2bacf9132f287e Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 11:15:34 -0700 Subject: [PATCH 09/18] bump rustc and viceroy --- .github/workflows/main.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 439d297..e5d5f61 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,15 +10,15 @@ jobs: name: Build and Test runs-on: ubuntu-latest env: - WAC_VERSION: 0.9.0 - VICEROY_VERSION: 0.16.4 + WAC_VERSION: 0.12.0 + VICEROY_VERSION: 0.21.1 steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.93.1 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.99.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 - name: Install wac run: | @@ -28,16 +28,18 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - tmp=$(mktemp -d) - curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz - tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" - chmod a+x "$tmp/viceroy" - mv "$tmp/viceroy" /usr/local/bin/ + cargo install --git https://github.com/fastly/Viceroy.git --locked +# tmp=$(mktemp -d) +# curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz +# tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" +# chmod a+x "$tmp/viceroy" +# mv "$tmp/viceroy" /usr/local/bin/ - uses: actions/cache@v5 with: path: | ~/.cargo/registry ~/.cargo/git + ~/.cargo/bin target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | From 79572590fb7344203d3d576c8c8a20200702e9be Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 11:51:41 -0700 Subject: [PATCH 10/18] fix --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e5d5f61..4a813d6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - cargo install --git https://github.com/fastly/Viceroy.git --locked + cargo install --git https://github.com/fastly/Viceroy.git --locked viceroy # tmp=$(mktemp -d) # curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz # tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" From 3c7bda48c7ebf71cfe2a5831bc79a50ca2117d91 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 12:02:54 -0700 Subject: [PATCH 11/18] fix --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4a813d6..121f0a3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - cargo install --git https://github.com/fastly/Viceroy.git --locked viceroy + RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --locked viceroy # tmp=$(mktemp -d) # curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz # tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" From 00a979e9bdcb889f08d81eb5de65eb8b8dec848e Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 19:51:09 -0700 Subject: [PATCH 12/18] fix --- .github/workflows/main.yml | 22 +- Cargo.lock | 737 +++++++----------- Cargo.toml | 7 +- ...apshot_preview1.reactor.one_byte_page.wasm | Bin 49589 -> 0 bytes src/ast.rs | 2 +- src/instrument.rs | 34 +- src/run.rs | 4 +- src/util.rs | 5 +- 8 files changed, 320 insertions(+), 491 deletions(-) delete mode 100644 assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 121f0a3..b781cc1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,6 +20,16 @@ jobs: components: rustfmt, clippy toolchain: 1.99.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 - uses: bytecodealliance/actions/wasmtime/setup@v1 + - uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + ~/.cargo/bin + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- - name: Install wac run: | tmp=$(mktemp -d) @@ -28,22 +38,12 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --locked viceroy + RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --branch yan/adapt-ps1 --locked viceroy # tmp=$(mktemp -d) # curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz # tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" # chmod a+x "$tmp/viceroy" # mv "$tmp/viceroy" /usr/local/bin/ - - uses: actions/cache@v5 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - ~/.cargo/bin - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - name: Build run: make - name: Test diff --git a/Cargo.lock b/Cargo.lock index c84bd2b..d6459bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9698bf0769c641b18618039fe2ebd41eb3541f98433000f64e663fab7cea2c87" +checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" dependencies = [ "gimli", ] @@ -129,15 +129,6 @@ version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -173,9 +164,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cap-fs-ext" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" +checksum = "476f0d0003a760918ed4b1e039a59e11769030416f79c8222551d22785f7f70d" dependencies = [ "cap-primitives", "cap-std", @@ -185,21 +176,21 @@ dependencies = [ [[package]] name = "cap-net-ext" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a158160765c6a7d0d8c072a53d772e4cb243f38b04bfcf6b4939cfbe7482e7" +checksum = "150941cefd3df4de2fea24604ba4949371576f62e527410298333f7d431a1bc6" dependencies = [ "cap-primitives", "cap-std", - "rustix 1.1.4", + "rustix", "smallvec", ] [[package]] name = "cap-primitives" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" +checksum = "8e0bf07d379916947be6c4a07f43684153d710a2896c31f9e97781362895596c" dependencies = [ "ambient-authority", "fs-set-times", @@ -207,45 +198,35 @@ dependencies = [ "io-lifetimes", "ipnet", "maybe-owned", - "rustix 1.1.4", + "rustix", "rustix-linux-procfs", "windows-sys 0.59.0", "winx", ] -[[package]] -name = "cap-rand" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8144c22e24bbcf26ade86cb6501a0916c46b7e4787abdb0045a467eb1645a1d" -dependencies = [ - "ambient-authority", - "rand", -] - [[package]] name = "cap-std" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" +checksum = "a59e59fa26472d29680ece6a9f8ee8b0551a719a33df2f5240bde065ecbddfd7" dependencies = [ "cap-primitives", "io-extras", "io-lifetimes", - "rustix 1.1.4", + "rustix", ] [[package]] name = "cap-time-ext" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" +checksum = "b54c289326c70f1c697ebf0a31842a480932e5942b5fac92fcc46e87286b48e2" dependencies = [ "ambient-authority", "cap-primitives", "iana-time-zone", "once_cell", - "rustix 1.1.4", + "rustix", "winx", ] @@ -273,6 +254,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core", +] + [[package]] name = "clap" version = "4.5.60" @@ -365,38 +357,48 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "cranelift-assembler-x64" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40630d663279bc855bff805d6f5e8a0b6a1867f9df95b010511ac6dc894e9395" +checksum = "0aadfd45214f09461ba0406f7dacecce5cac39bf0bdb4890eeb468f4ef090e07" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee6aec5ceb55e5fdbcf7ef677d7c7195531360ff181ce39b2b31df11d57305f" +checksum = "57069faede9bd1f926364b4cf69ccc9bebc6f4af5ab897083581b7bc991bf20a" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a92d78cc3f087d7e7073828f08d98c7074a3a062b6b29a1b7783ce74305685e" +checksum = "0b1221450f2f9efaa996d916bf53a0a4d13346a4a75468afb828390209a4fdd4" dependencies = [ "cranelift-entity", + "wasmtime-internal-core", ] [[package]] name = "cranelift-bitset" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcc73d756f2e0d7eda6144fe64a2bc69c624de893cb1be51f1442aed77881d2" +checksum = "97706f2b466d67bdf0f69d1cf5c5c4a5cd31087cf1fa2e8e5fe0450dddc8661d" dependencies = [ "serde", "serde_derive", @@ -405,9 +407,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d94c2cd0d73b41369b88da1129589bc3a2d99cf49979af1d14751f35b7a1b" +checksum = "432246ee44b2fc0140b412dca55801d200d6fb25d2d7d18c44bb29e8cd71268b" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -419,13 +421,16 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "libm", "log", + "postcard", "pulley-interpreter", "regalloc2", "rustc-hash", "serde", + "serde_derive", + "sha2", "smallvec", "target-lexicon", "wasmtime-internal-core", @@ -433,9 +438,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235da0e52ee3a0052d0e944c3470ff025b1f4234f6ec4089d3109f2d2ffa6cbd" +checksum = "b5aa51eff0949f06a5c8f3d5adefef94a12ea99f71cd8985047b91d45f367150" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -446,24 +451,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c07c6c440bd1bf920ff7597a1e743ede1f68dcd400730bd6d389effa7662af" +checksum = "6095e7095930b6169490138b4262fe7ec24290d3f604d7fe62e1e3138e740daa" [[package]] name = "cranelift-control" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8797c022e02521901e1aee483dea3ed3c67f2bf0a26405c9dd48e8ee7a70944b" +checksum = "e61dfa0766c0eadf42b3febd145a35f81f31086e207f534e5fb406fc3d08fc47" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59d8e72637246edd2cba337939850caa8b201f6315925ec4c156fdd089999699" +checksum = "e93867a79a06dd5d9ffeb96f7563dc7b6b142b5d89e42ab77e458a408a8aa9d5" dependencies = [ "cranelift-bitset", "serde", @@ -473,11 +478,12 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c31db0085c3dfa131e739c3b26f9f9c84d69a9459627aac1ac4ef8355e3411b" +checksum = "d1991dc32fefa54f14d2a63570d1e963826257605e478558733f83450b7e7661" dependencies = [ "cranelift-codegen", + "hashbrown 0.17.1", "log", "smallvec", "target-lexicon", @@ -485,15 +491,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524d804c1ebd8c542e6f64e71aa36934cec17c5da4a9ae3799796220317f5d23" +checksum = "784546de9988ff6e1df0fd4d2450760469a7607344156c661e69ec28082c5da4" [[package]] name = "cranelift-native" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc9598f02540e382e1772416eba18e93c5275b746adbbf06ac1f3cf149415270" +checksum = "7107a4ae4a2ba48b5df8648365e638b08322fa1da11e86206bf5eddb862b21dd" dependencies = [ "cranelift-codegen", "libc", @@ -502,9 +508,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.129.1" +version = "0.133.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d953932541249c91e3fa70a75ff1e52adc62979a2a8132145d4b9b3e6d1a9b6a" +checksum = "4b3f161aa81ee5dd8d7b0eb8828988f57baf2f78d288e62b6b3714b37aa6d6a1" [[package]] name = "crc32fast" @@ -708,17 +714,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "fd-lock" -version = "4.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" -dependencies = [ - "cfg-if", - "rustix 1.1.4", - "windows-sys 0.59.0", -] - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -765,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ "io-lifetimes", - "rustix 1.1.4", + "rustix", "windows-sys 0.59.0", ] @@ -889,6 +884,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", + "rand_core", "wasip2", "wasip3", ] @@ -912,7 +908,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "foldhash 0.1.5", - "serde", ] [[package]] @@ -928,6 +923,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] @@ -1068,20 +1065,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "im-rc" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" -dependencies = [ - "bitmaps", - "rand_core", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - [[package]] name = "indexmap" version = "2.14.2" @@ -1197,9 +1180,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libc-alloc" @@ -1221,12 +1204,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1289,12 +1266,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" -dependencies = [ - "libc", -] +checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" [[package]] name = "maybe-owned" @@ -1314,14 +1288,14 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 1.1.4", + "rustix", ] [[package]] name = "mio" -version = "1.1.1" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", "wasi", @@ -1357,12 +1331,12 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "object" -version = "0.37.3" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" dependencies = [ "crc32fast", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "indexmap", "memchr", ] @@ -1428,15 +1402,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - [[package]] name = "prettyplease" version = "0.2.37" @@ -1485,14 +1450,15 @@ dependencies = [ "wasmtime-wasi", "wit-bindgen-core 0.62.0", "wit-bindgen-rust 0.62.0", - "wit-component 0.259.0", + "wit-component 0.261.0", + "wit-parser 0.261.0", ] [[package]] name = "pulley-interpreter" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2d61e068654529dc196437f8df0981db93687fdc67dec6a5de92363120b9da" +checksum = "3f647f8aefd39efd5e38b484a8b7a926dd035ae366127df75c1d94d196f0a4ba" dependencies = [ "cranelift-bitset", "log", @@ -1502,9 +1468,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f210c61b6ecfaebbba806b6d9113a222519d4e5cc4ab2d5ecca047bb7927ae" +checksum = "3e902032e329008b189b67498b1be7784d5849276f32402eca17441df08a6bcb" dependencies = [ "proc-macro2", "quote", @@ -1528,42 +1494,20 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.8.5" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", + "chacha20", + "getrandom 0.4.1", "rand_core", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rayon" @@ -1609,15 +1553,16 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.13.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08effbc1fa53aaebff69521a5c05640523fab037b34a4a2c109506bc938246fa" +checksum = "757712e8e61590d6d4f5d563483755538b5aa13467837a3b41cd9832509a7f85" dependencies = [ "allocator-api2 0.2.21", "bumpalo", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "log", "rustc-hash", + "serde", "smallvec", ] @@ -1639,19 +1584,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.1.4" @@ -1661,7 +1593,7 @@ dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.12.1", + "linux-raw-sys", "windows-sys 0.61.2", ] @@ -1672,7 +1604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" dependencies = [ "once_cell", - "rustix 1.1.4", + "rustix", ] [[package]] @@ -1681,12 +1613,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - [[package]] name = "scopeguard" version = "1.2.0" @@ -1755,19 +1681,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "sha2" version = "0.10.9" @@ -1775,7 +1688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -1791,16 +1704,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - [[package]] name = "slab" version = "0.4.12" @@ -1818,12 +1721,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1871,22 +1774,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "system-interface" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" -dependencies = [ - "bitflags", - "cap-fs-ext", - "cap-std", - "fd-lock", - "io-lifetimes", - "rustix 0.38.44", - "windows-sys 0.59.0", - "winx", -] - [[package]] name = "talc" version = "5.1.1" @@ -1905,14 +1792,14 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "tempfile" -version = "3.26.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom 0.4.1", "once_cell", - "rustix 1.1.4", + "rustix", "windows-sys 0.61.2", ] @@ -1977,9 +1864,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.49.0" +version = "1.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" dependencies = [ "bytes", "libc", @@ -2091,12 +1978,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "url" version = "2.5.8" @@ -2208,22 +2089,18 @@ dependencies = [ [[package]] name = "wasm-compose" -version = "0.244.0" +version = "0.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92cda9c76ca8dcac01a8b497860c2cb15cd6f216dc07060517df5abbe82512ac" +checksum = "b089037d7eb453ed57b560fe7833de0707411c8b9fdc429745ced77e2a1bacb9" dependencies = [ "anyhow", "heck", - "im-rc", "indexmap", "log", "petgraph", - "serde", - "serde_derive", - "serde_yaml", "smallvec", - "wasm-encoder 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder 0.251.0", + "wasmparser 0.251.0", "wat", ] @@ -2239,12 +2116,12 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.245.1" +version = "0.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +checksum = "5a879a421bd17c528b74721b2abf4c62e8f1d1889c2ba8c3c50d02deaf2ce395" dependencies = [ "leb128fmt", - "wasmparser 0.245.1", + "wasmparser 0.251.0", ] [[package]] @@ -2257,6 +2134,16 @@ dependencies = [ "wasmparser 0.259.0", ] +[[package]] +name = "wasm-encoder" +version = "0.261.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2608e8bb6d67fd68f5a8d0eb1363d6e7bcbc1f8ded5a0bd3a1e382462b876b22" +dependencies = [ + "leb128fmt", + "wasmparser 0.261.0", +] + [[package]] name = "wasm-metadata" version = "0.244.0" @@ -2281,6 +2168,18 @@ dependencies = [ "wasmparser 0.259.0", ] +[[package]] +name = "wasm-metadata" +version = "0.261.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88de21560ecd49deb8d8f1616b9b695f66fc312c5eca503f43accdc5795339e" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.261.0", + "wasmparser 0.261.0", +] + [[package]] name = "wasm-wave" version = "0.239.0" @@ -2293,13 +2192,14 @@ dependencies = [ [[package]] name = "wasm-wave" -version = "0.244.0" +version = "0.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c34a4c10a1b9260f8131929d680e36edf00836bb8e76524d3004522bd6f287" +checksum = "49a25d67bb8d8b9913f2fad9f31b2354b43f4cf23bbd6913e21734ed5170e9a9" dependencies = [ + "anyhow", "logos", "thiserror 2.0.18", - "wit-parser 0.244.0", + "wit-parser 0.251.0", ] [[package]] @@ -2312,18 +2212,19 @@ dependencies = [ "hashbrown 0.15.5", "indexmap", "semver", - "serde", ] [[package]] name = "wasmparser" -version = "0.245.1" +version = "0.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +checksum = "437970b35b1a85cfde9c74b2398352d8d653f3bd8e3a3db0c063ea8f5b4b36ff" dependencies = [ "bitflags", + "hashbrown 0.17.1", "indexmap", "semver", + "serde", ] [[package]] @@ -2338,22 +2239,34 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.261.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f20f20e44f7e8aeb6744823ea9d869ede51e51be4fdaedede2852282e54d2d8" +dependencies = [ + "bitflags", + "hashbrown 0.17.1", + "indexmap", + "semver", +] + [[package]] name = "wasmprinter" -version = "0.244.0" +version = "0.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09390d7b2bd7b938e563e4bff10aa345ef2e27a3bc99135697514ef54495e68f" +checksum = "8798c1a699bd25648b6708eefe94d97c6f9891febb94b42cca1f7a4b086ea64e" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.244.0", + "wasmparser 0.251.0", ] [[package]] name = "wasmtime" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39bef52be4fb4c5b47d36f847172e896bc94b35c9c6a6f07117686bd16ed89a7" +checksum = "d39226663bd765601279a79b88645a7c4a4d3c2fe73040afdc27bead02ee6659" dependencies = [ "addr2line", "async-trait", @@ -2375,7 +2288,7 @@ dependencies = [ "postcard", "pulley-interpreter", "rayon", - "rustix 1.1.4", + "rustix", "semver", "serde", "serde_derive", @@ -2384,9 +2297,9 @@ dependencies = [ "target-lexicon", "tempfile", "wasm-compose", - "wasm-encoder 0.244.0", - "wasm-wave 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder 0.251.0", + "wasm-wave 0.251.0", + "wasmparser 0.251.0", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -2398,23 +2311,24 @@ dependencies = [ "wasmtime-internal-jit-icache-coherence", "wasmtime-internal-unwinder", "wasmtime-internal-versioned-export-macros", - "wasmtime-internal-winch", "wat", "windows-sys 0.61.2", + "wit-parser 0.251.0", ] [[package]] name = "wasmtime-environ" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb637d5aa960ac391ca5a4cbf3e45807632e56beceeeb530e14dfa67fdfccc62" +checksum = "2595a168541e8a7faeacf21e3d59da93628ee71468cd69fee9fc2a92c9b1c7d8" dependencies = [ "anyhow", "cpp_demangle", + "cranelift-bforest", "cranelift-bitset", "cranelift-entity", "gimli", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "indexmap", "log", "object", @@ -2423,10 +2337,11 @@ dependencies = [ "semver", "serde", "serde_derive", + "sha2", "smallvec", "target-lexicon", - "wasm-encoder 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder 0.251.0", + "wasmparser 0.251.0", "wasmprinter", "wasmtime-internal-component-util", "wasmtime-internal-core", @@ -2434,15 +2349,15 @@ dependencies = [ [[package]] name = "wasmtime-internal-cache" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ab6c428c610ae3e7acd25ca2681b4d23672c50d8769240d9dda99b751d4deec" +checksum = "a37d629957320219db11336663e0947e19afe77150403509cac21c47ead60c69" dependencies = [ "base64", "directories-next", "log", "postcard", - "rustix 1.1.4", + "rustix", "serde", "serde_derive", "sha2", @@ -2454,9 +2369,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-macro" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca768b11d5e7de017e8c3d4d444da6b4ce3906f565bcbc253d76b4ecbb5d2869" +checksum = "9abf0fb4ce458eb6edbfaf6cbf13fcbf4216eac5a85febfe90224a1f6064c990" dependencies = [ "anyhow", "proc-macro2", @@ -2464,30 +2379,32 @@ dependencies = [ "syn 2.0.117", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.244.0", + "wit-parser 0.251.0", ] [[package]] name = "wasmtime-internal-component-util" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763f504faf96c9b409051e96a1434655eea7f56a90bed9cb1e22e22c941253fd" +checksum = "0e50df18c9a8e0deec353ad1e6364ef50538231719a12d80fa5dcb300be8d36b" [[package]] name = "wasmtime-internal-core" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a4a3f055a804a2f3d86e816a9df78a8fa57762212a8506164959224a40cd48" +checksum = "93b097389e5fad89c8ff8ee0aeafd16447b5a288d52aa1131f17ab4c19fd5be3" dependencies = [ "anyhow", + "hashbrown 0.17.1", "libm", + "serde", ] [[package]] name = "wasmtime-internal-cranelift" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55154a91d22ad51f9551124ce7fb49ddddc6a82c4910813db4c790c97c9ccf32" +checksum = "08b3e909115836655b83c8bdef7c2e20a34293e785218d9f71a4e5382a09c6b0" dependencies = [ "cfg-if", "cranelift-codegen", @@ -2503,7 +2420,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser 0.244.0", + "wasmparser 0.251.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -2512,14 +2429,14 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05decfad1021ad2efcca5c1be9855acb54b6ee7158ac4467119b30b7481508e3" +checksum = "a000d1124dd40417ce8433d07de1063ecc9be7cac21745c8de7f9cf7684c3ead" dependencies = [ "cc", "cfg-if", "libc", - "rustix 1.1.4", + "rustix", "wasmtime-environ", "wasmtime-internal-versioned-export-macros", "windows-sys 0.61.2", @@ -2527,21 +2444,21 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924980c50427885fd4feed2049b88380178e567768aaabf29045b02eb262eaa7" +checksum = "a7439956e78ba68e2cd766f34c3f056d625fad9a055eafb0c4569ac91c09e6b4" dependencies = [ "cc", "object", - "rustix 1.1.4", + "rustix", "wasmtime-internal-versioned-export-macros", ] [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c57d24e8d1334a0e5a8b600286ffefa1fc4c3e8176b110dff6fbc1f43c4a599b" +checksum = "ee3a381a9dd1ffe3893507733300b420605f465655d78c7a75a965a09d7b43d5" dependencies = [ "cfg-if", "libc", @@ -2551,9 +2468,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-unwinder" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1a144bd4393593a868ba9df09f34a6a360cb5db6e71815f20d3f649c6e6735" +checksum = "22f951f78a1a09001547838fa557522d56655385db97e47307d0f582ca866974" dependencies = [ "cfg-if", "cranelift-codegen", @@ -2564,65 +2481,47 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a6948b56bb00c62dbd205ea18a4f1ceccbe1e4b8479651fdb0bab2553790f20" +checksum = "51e06f9fabbe647e5c2ed186e6920ab1fb48174688d7d3fdadbda537b8499b51" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] -[[package]] -name = "wasmtime-internal-winch" -version = "42.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9130b3ab6fb01be80b27b9a2c84817af29ae8224094f2503d2afa9fea5bf9d00" -dependencies = [ - "cranelift-codegen", - "gimli", - "log", - "object", - "target-lexicon", - "wasmparser 0.244.0", - "wasmtime-environ", - "wasmtime-internal-cranelift", - "winch-codegen", -] - [[package]] name = "wasmtime-internal-wit-bindgen" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102d0d70dbfede00e4cc9c24e86df6d32c03bf6f5ad06b5d6c76b0a4a5004c4a" +checksum = "f49ac5121036c2255bdc203b1b75a1c04544744cd5f51c93240b58bddca9f0f1" dependencies = [ "anyhow", "bitflags", "heck", "indexmap", - "wit-parser 0.244.0", + "wit-parser 0.251.0", ] [[package]] name = "wasmtime-wasi" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea938f6f4f11e5ffe6d8b6f34c9a994821db9511c3e9c98e535896f27d06bb92" +checksum = "16d23668f18d6fd0a932c1fc58600bbb8a2e4f9b217f08bb61841e2c275d4ce3" dependencies = [ "async-trait", "bitflags", "bytes", "cap-fs-ext", "cap-net-ext", - "cap-rand", "cap-std", "cap-time-ext", - "fs-set-times", + "cfg-if", "futures", "io-extras", "io-lifetimes", - "rustix 1.1.4", - "system-interface", + "rand", + "rustix", "thiserror 2.0.18", "tokio", "tracing", @@ -2635,9 +2534,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cb16a88d0443b509d6eca4298617233265179090abf03e0a8042b9b251e9da" +checksum = "0df5ffcd5aca96285be7745d4677ca5e2851245ca7c066a98c0fbee5bc6375f1" dependencies = [ "async-trait", "bytes", @@ -2657,31 +2556,31 @@ dependencies = [ [[package]] name = "wast" -version = "245.0.1" +version = "261.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cf1149285569120b8ce39db8b465e8a2b55c34cbb586bd977e43e2bc7300bf" +checksum = "776443145731a4062e5b0d392892a2005909b6ab72d9fdc3cad53dd1a714e44a" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width", - "wasm-encoder 0.245.1", + "wasm-encoder 0.261.0", ] [[package]] name = "wat" -version = "1.245.1" +version = "1.261.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd48d1679b6858988cb96b154dda0ec5bbb09275b71db46057be37332d5477be" +checksum = "a7b4d1a49ea73a8f3326e74e3a05db667001b16bd1035ed3356fc1a0ed05ca7f" dependencies = [ - "wast 245.0.1", + "wast 261.0.0", ] [[package]] name = "wiggle" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dca2bf96d20f0c70e6741cc6c8c1a9ee4c3c0310c7ad1971242628c083cc9a5" +checksum = "a77deefc2b0fe8c258316372ec322da627ce8c5b5ea9eec3b001190e9f8f2f69" dependencies = [ "bitflags", "thiserror 2.0.18", @@ -2693,9 +2592,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d8c016d6d3ec6dc6b8c80c23cede4ee2386ccf347d01984f7991d7659f73ef" +checksum = "0a52145d29793eb1e0c5be9b6be5a74552b9236f01866c769ec1c3270584085f" dependencies = [ "heck", "proc-macro2", @@ -2707,9 +2606,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "42.0.1" +version = "46.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91a267096e48857096f035fffca29e22f0bbe840af4d74a6725eb695e1782110" +checksum = "c26242c5c54d0f2837e1fecc933e1581e45d39cde1b1f6b3ad72955e0851ec20" dependencies = [ "proc-macro2", "quote", @@ -2748,25 +2647,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "winch-codegen" -version = "42.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1977857998e4dd70d26e2bfc0618a9684a2fb65b1eca174dc13f3b3e9c2159ca" -dependencies = [ - "cranelift-assembler-x64", - "cranelift-codegen", - "gimli", - "regalloc2", - "smallvec", - "target-lexicon", - "thiserror 2.0.18", - "wasmparser 0.244.0", - "wasmtime-environ", - "wasmtime-internal-core", - "wasmtime-internal-cranelift", -] - [[package]] name = "windows-core" version = "0.62.2" @@ -2832,16 +2712,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -2859,31 +2730,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -2892,96 +2746,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.14" @@ -3139,6 +2945,25 @@ dependencies = [ "wit-parser 0.259.0", ] +[[package]] +name = "wit-component" +version = "0.261.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2818766842bd2321074c348fb5c15d8fdb105a9eb78374e6d77c7d4127e1f2f9" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.261.0", + "wasm-metadata 0.261.0", + "wasmparser 0.261.0", + "wit-parser 0.261.0", +] + [[package]] name = "wit-parser" version = "0.244.0" @@ -3157,6 +2982,25 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wit-parser" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e960732e824fab95099971a09e638979347c94ca48568d3c854c945729196947" +dependencies = [ + "anyhow", + "hashbrown 0.17.1", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.251.0", +] + [[package]] name = "wit-parser" version = "0.259.0" @@ -3176,6 +3020,25 @@ dependencies = [ "wasmparser 0.259.0", ] +[[package]] +name = "wit-parser" +version = "0.261.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962e43c4db2da607b50839a531e5b63473268b40efdf8028d5c54b572ca4f6f6" +dependencies = [ + "anyhow", + "hashbrown 0.17.1", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-ident", + "wasmparser 0.261.0", +] + [[package]] name = "witx" version = "0.9.1" @@ -3217,26 +3080,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.8.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "zerofrom" version = "0.1.6" diff --git a/Cargo.toml b/Cargo.toml index 9e15512..4327eb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,10 +26,11 @@ syn = { version = "2.0.108", features = ["visit-mut"] } tempfile = "3.20.0" wit-bindgen-core = "0.62.0" wit-bindgen-rust = "0.62.0" -wit-component = "0.259.0" +wit-component = "0.261.0" +wit-parser = "0.261.0" -wasmtime = { version = "42.0.0", features = ["wave"], optional = true } -wasmtime-wasi = { version = "42.0.0", optional = true } +wasmtime = { version = "46.0.0", features = ["wave"], optional = true } +wasmtime-wasi = { version = "46.0.0", optional = true } dialog = { path = "crates/dialog", optional = true } ctrlc = "3.5.2" diff --git a/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm b/assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm deleted file mode 100644 index d5067817cc2bcfdda220cdcb45abfb70ea6fcc3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49589 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 diff --git a/src/ast.rs b/src/ast.rs index e478c34..cbdcf48 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -4,7 +4,7 @@ use crate::util::*; use anyhow::Result; use std::collections::{BTreeMap, BTreeSet}; use std::path::Path; -use wit_bindgen_core::{Files, Source, wit_parser}; +use wit_bindgen_core::{Files, Source}; use wit_component::WitPrinter; use wit_parser::*; diff --git a/src/instrument.rs b/src/instrument.rs index 99534da..a1b6379 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -4,7 +4,7 @@ use clap::Parser; use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; -use wit_bindgen_core::{Files, wit_parser}; +use wit_bindgen_core::Files; use wit_component::{ComponentEncoder, embed_component_metadata}; use wit_parser::{Resolve, WorldId}; @@ -26,8 +26,6 @@ pub struct InstrumentArgs { // TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); -const WASI_ADAPTER_ONE_BYTE_PAGE: &[u8] = - include_bytes!("../assets/wasi_snapshot_preview1.reactor.one_byte_page.wasm"); pub fn run(args: InstrumentArgs) -> Result<()> { if args.use_host_recorder && !matches!(args.mode, Mode::Record | Mode::Replay) { @@ -90,20 +88,10 @@ pub fn run(args: InstrumentArgs) -> Result<()> { let status = cmd.status()?; assert!(status.success()); - let exports_wasm_path = component_new( - &tmp_dir, - &wit_dir, - "exports", - "debug/record_exports.wasm", - args.one_byte_page_size, - )?; - let imports_wasm_path = component_new( - &tmp_dir, - &wit_dir, - "imports", - "debug/record_imports.wasm", - args.one_byte_page_size, - )?; + let exports_wasm_path = + component_new(&tmp_dir, &wit_dir, "exports", "debug/record_exports.wasm")?; + let imports_wasm_path = + component_new(&tmp_dir, &wit_dir, "imports", "debug/record_imports.wasm")?; // 7. run wac opts.generate_wac(&imports_wasm_path, &exports_wasm_path, &wit_dir)?; let output_file = "composed.wasm"; @@ -181,7 +169,6 @@ fn component_new( wit_dir: &Path, world_name: &str, wasm_file: &str, - one_byte_page_size: bool, ) -> Result { let wasm_path = tmp_dir .join("target/wasm32-unknown-unknown/") @@ -195,14 +182,11 @@ fn component_new( &resolve, world_id, wit_component::StringEncoding::UTF8, + false, )?; - // create component from the embedded module - let mut encoder = ComponentEncoder::default(); - encoder.module(&wasm)?; - if one_byte_page_size { - encoder.adapter("wasi_snapshot_preview1", WASI_ADAPTER_ONE_BYTE_PAGE)?; - } - let component = encoder + // create component from the embedded module. + let component = ComponentEncoder::default() + .module(&wasm)? .encode() .context("failed to encode a component from module")?; fs::write(&wasm_path, component)?; diff --git a/src/run.rs b/src/run.rs index 2db054f..3d967b2 100644 --- a/src/run.rs +++ b/src/run.rs @@ -160,7 +160,7 @@ fn collect_exports( .flat_map(move |(name, item)| { let mut names = basename.clone(); names.push(name.to_string()); - collect_exports(engine, item, names) + collect_exports(engine, item.ty, names) }) .collect(), CItem::ComponentInstance(c) => c @@ -168,7 +168,7 @@ fn collect_exports( .flat_map(move |(name, item)| { let mut names = basename.clone(); names.push(name.to_string()); - collect_exports(engine, item, names) + collect_exports(engine, item.ty, names) }) .collect(), _ => vec![(basename, item)], diff --git a/src/util.rs b/src/util.rs index 6e7daae..cbe5938 100644 --- a/src/util.rs +++ b/src/util.rs @@ -6,8 +6,8 @@ use std::borrow::Cow; use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::path::Path; use syn::{FnArg, Ident, Item, Signature, Type, Visibility, parse_quote, visit_mut::VisitMut}; -use wit_bindgen_core::wit_parser::{PackageId, Resolve}; use wit_component::WitPrinter; +use wit_parser::{PackageId, Resolve}; pub struct FullTypePath<'a> { pub module_path: &'a [String], } @@ -496,7 +496,8 @@ pub fn extract_wit(wasm_file: &Path, out_dir: &Path) -> Result<()> { /// Generate Rust bindings from WIT definitions. /// Equivalent to `wit-bindgen rust --world --generate-all --merge-structurally-equal-types=true --out-dir `. pub fn generate_bindings(wit_dir: &Path, world_name: &str, out_dir: &Path) -> Result<()> { - use wit_bindgen_core::{Files, WorldGenerator}; + // wit-bindgen may depend on a different wit-parser version than wit-component + use wit_bindgen_core::{Files, WorldGenerator, wit_parser::Resolve}; let mut resolve = Resolve::default(); let (pkg, _) = resolve.push_dir(wit_dir)?; let world = resolve.select_world(&[pkg], Some(world_name))?; From c1018c44ad45f5a053ef9ee3c28c25df8e0a858a Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 20:35:09 -0700 Subject: [PATCH 13/18] use libc-alloc as the only allocator, so that rust and wasi-libc use the same talc arena --- Cargo.lock | 5 +++-- assets/debug.wasm | Bin 76145 -> 76713 bytes assets/recorder.wasm | Bin 226115 -> 226514 bytes components/debug/Cargo.toml | 1 - components/debug/src/lib.rs | 10 +--------- components/recorder/Cargo.toml | 1 - components/recorder/src/lib.rs | 10 +--------- crates/libc-alloc/Cargo.toml | 1 + crates/libc-alloc/src/lib.rs | 35 +++++++++++++++++++++++++-------- 9 files changed, 33 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6459bf..6125dea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -573,7 +573,6 @@ version = "0.1.0" dependencies = [ "getrandom 0.3.4", "libc-alloc", - "talc", "wit-bindgen 0.62.0", ] @@ -1187,6 +1186,9 @@ checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libc-alloc" version = "0.1.0" +dependencies = [ + "talc", +] [[package]] name = "libm" @@ -1535,7 +1537,6 @@ version = "0.1.0" dependencies = [ "libc-alloc", "serde_json", - "talc", "trace", "wit-bindgen 0.62.0", ] diff --git a/assets/debug.wasm b/assets/debug.wasm index 84bddb069dc3e8bea6d0652110aeed5c4c6c09b8..fa05c683e8289b807f6fb2c0d4da3d6aa40da083 100644 GIT binary patch delta 10816 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 delta 10503 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 T2n(>PEsw(mkB{2&qT2rlx4ZI) delta 26893 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 jyq;Dkmi_>; 0x80000] = [MaybeUninit::uninit(); 0x80000]; - // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. - unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } -}; - mod bindings { wit_bindgen::generate!({ path: "../../assets/util.wit", diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index 65d6d67..328f966 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -10,5 +10,4 @@ crate-type = ["cdylib"] trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true -talc = "5.0.3" libc-alloc = { path = "../../crates/libc-alloc" } diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index 72f3970..b94d6ef 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,14 +1,6 @@ +// libc_alloc provides the heap; don't add a #[global_allocator] (see crates/libc-alloc). extern crate libc_alloc; -#[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] -#[global_allocator] -static TALC: talc::wasm::WasmArenaTalc = { - use core::mem::MaybeUninit; - static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; - // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. - unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } -}; - mod bindings { wit_bindgen::generate!({ path: "../../assets/recorder.wit", diff --git a/crates/libc-alloc/Cargo.toml b/crates/libc-alloc/Cargo.toml index 6ab6b85..280d6ee 100644 --- a/crates/libc-alloc/Cargo.toml +++ b/crates/libc-alloc/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2024" [dependencies] +talc = "5.0.3" diff --git a/crates/libc-alloc/src/lib.rs b/crates/libc-alloc/src/lib.rs index f25c160..8772287 100644 --- a/crates/libc-alloc/src/lib.rs +++ b/crates/libc-alloc/src/lib.rs @@ -1,18 +1,37 @@ -//! Replaces wasi-libc's dlmalloc with the Rust global allocator. +//! Replaces wasi-libc's dlmalloc with a talc arena. //! //! wasi-libc's `sbrk` assumes 64 KiB wasm pages, so its dlmalloc traps when the //! module is linked with `--page-size=1`. Defining every symbol that //! `dlmalloc.c.obj` provides keeps the linker from pulling it (and `sbrk`) in. +//! +//! The talc arena lives here and backs `malloc`, rather than being the Rust +//! `#[global_allocator]`. `free(p)` has no size, so every block carries a +//! header. `cabi_realloc` (from std's `wasip2` crate) calls `__rust_alloc`, +//! and wasi-libc frees those canonical-ABI buffers with `free()` (e.g. the +//! list returned by `blocking-read` in `read()`). If `__rust_alloc` went +//! straight to talc, those blocks would have no header and `free` would trap. +//! Leaving Rust on the default `System` allocator, which calls `malloc`, +//! `posix_memalign` and `free` on wasi, gives every allocation the header. +//! +//! Users must therefore not set a `#[global_allocator]`; just `extern crate libc_alloc;`. #![no_std] #[cfg(target_os = "wasi")] mod imp { - extern crate alloc; - - use alloc::alloc::{Layout, alloc, alloc_zeroed, dealloc, realloc as rust_realloc}; + use core::alloc::{GlobalAlloc, Layout}; use core::ffi::c_void; + use core::mem::MaybeUninit; use core::ptr::{self, null_mut}; + // The only heap in the module: both C (`malloc`) and Rust (`System` -> `malloc`) + // allocate from it. A fixed arena avoids the 64 KiB page assumptions of + // `sbrk` and talc's `memory.grow` source. + static TALC: talc::wasm::WasmArenaTalc = { + static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; + // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. + unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } + }; + /// `max_align_t` on wasm32. const MIN_ALIGN: usize = 16; const EINVAL: i32 = 28; @@ -51,9 +70,9 @@ mod imp { }; unsafe { let base = if zeroed { - alloc_zeroed(layout) + TALC.alloc_zeroed(layout) } else { - alloc(layout) + TALC.alloc(layout) }; if base.is_null() { return null_mut(); @@ -82,7 +101,7 @@ mod imp { } unsafe { let (base, layout) = header(p as *mut u8); - dealloc(base, layout); + TALC.dealloc(base, layout); } } @@ -105,7 +124,7 @@ mod imp { if Layout::from_size_align(total, align).is_err() { return null_mut(); } - let new_base = rust_realloc(base, layout, total); + let new_base = TALC.realloc(base, layout, total); if new_base.is_null() { return null_mut(); } From 9a531ea093f74d7f6f5f5ba1d2ab5fc52c6f9d5a Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 22:00:22 -0700 Subject: [PATCH 14/18] reimplement sbrk only for wasi target --- .github/workflows/main.yml | 2 +- Cargo.lock | 38 +------ assets/debug.wasm | Bin 76713 -> 85039 bytes assets/recorder.wasm | Bin 226514 -> 234835 bytes crates/libc-alloc/Cargo.toml | 1 - crates/libc-alloc/src/lib.rs | 212 ++++++----------------------------- 6 files changed, 36 insertions(+), 217 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b781cc1..c60b9d8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,7 +18,7 @@ jobs: with: target: wasm32-unknown-unknown, wasm32-wasip2 components: rustfmt, clippy - toolchain: 1.99.0 # Pin to 1.93 to use WASI 0.2.6, before viceroy catches up to 0.2.9 + toolchain: 1.99.0 - uses: bytecodealliance/actions/wasmtime/setup@v1 - uses: actions/cache@v5 with: diff --git a/Cargo.lock b/Cargo.lock index 6125dea..d5d05d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "allocator-api2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c880a97d28a3681c0267bd29cff89621202715b065127cd445fa0f0fe0aa2880" - [[package]] name = "ambient-authority" version = "0.0.2" @@ -153,7 +147,7 @@ version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" dependencies = [ - "allocator-api2 0.2.21", + "allocator-api2", ] [[package]] @@ -1186,9 +1180,6 @@ checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libc-alloc" version = "0.1.0" -dependencies = [ - "talc", -] [[package]] name = "libm" @@ -1218,15 +1209,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.29" @@ -1558,7 +1540,7 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "757712e8e61590d6d4f5d563483755538b5aa13467837a3b41cd9832509a7f85" dependencies = [ - "allocator-api2 0.2.21", + "allocator-api2", "bumpalo", "hashbrown 0.17.1", "log", @@ -1614,12 +1596,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "semver" version = "1.0.27" @@ -1775,16 +1751,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "talc" -version = "5.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f8ad14fa1c1b8635114abf9721076fe1e869572a5f26a52690f407292c80dc" -dependencies = [ - "allocator-api2 0.4.0", - "lock_api", -] - [[package]] name = "target-lexicon" version = "0.13.5" diff --git a/assets/debug.wasm b/assets/debug.wasm index fa05c683e8289b807f6fb2c0d4da3d6aa40da083..3219a0f276800a55afb8e1d01064e34aabe4491c 100644 GIT binary patch delta 17857 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 diff --git a/assets/recorder.wasm b/assets/recorder.wasm index 19a8db6810d58a82d54ae0cf664fdc8343d8ba25..8e98b3adfbc83a143e7395d349fb3a351eb69039 100644 GIT binary patch delta 22504 zcmb_^2Y6If`uDu&OwFVW5FjMM+?h~92k8isixd$NyY5+S`zqg!o?wuDt z&U*2#>@C~;V&$9LcKDz2wOpCGI~)pyydDpc@KVc+th(UA>!*19|D=8`k7iXadVAwO zPdMSR*DG^f?L3d*!mFHzuKe(_^Kjb(dv%X7TsW5hyzbPD=Z6XWXZMw6w1d~X*Oryp zedNa?W83EJQ>mY~ab81}=M#}Rzii&(ctb^5b#?80&ut>~1Cht3@a5E}xZur}J0jB( zPtbn)3w=n>(%mDX~%9B7P$-7gvZi;*a8A^dPMjSBc+=Ys5NnwKz<_7gvfSv_Y&A z*NUI%NBV)jq|KS)CGj`$cX3F(EM93@-X%8b#ZQ8JrSOE`735EdQvSbqWpi`0$3C!O zU$dujh$q)hRAvj0ps-uf@=TX#4^v$tA~7*7%af||cKs6_Xt}#AjaOKb#n%p<^40^jo44X@D zZ<{}CD&b-C@CWF#mh(pR!u`?_!}0e|BM#B+EtekKfDT_BThK;AzSM9aXnt^w+7 ziQVuK+GO0=L~m_N+}IqZ+aI_~bfZJt+wkP zxadN;decjNCExgcw193?OMKK@KmX20#dzN8qXPZ>oR3Z_IO>d)*KQ<~t5JUHC;8?A zKb;l4Z57WMS=(~yEo0^WRr^{hZ^>8L0UB9w#2LebF-Qhd)Sz6QAD|K4Q{>tb=&;BR zR7UPsw+5*1F^6^E0n!uo%2LZaC2?Aot0`2e4+1o)hv|+sr)80&Mdoi@kgOr5&XQxL zC)4kWVeM*7>VubQ0k-M#>mc=w9Qn0j#MDN%sa-)TI4->u=%&hOiW4(SOjxjipd|q4 zlzlKIkq{MyO&eH7WV@OWqPmf$phV=xJgwk&3-fq}$i3_=T&j7bH$rqmk!ch2*q#ZV zOv^LH1LoXDEYryu1iY#XGN>ONP^&ZO47yvroI&THaCn$n=wNbxnC>NdsO7%bzE?}K z=`p%XjmV)m?NaMD}nG!UI~$mZwB``A;zB8R7|A_!ElkQ`@>xwDA4^t;LaUG@D*k z$LCTnI;_skrKRHA%hYqZnEL}YqdQIN@+{A3`G$DLS-ui6F|s4Mp*v+$Yx!_49~If5 zw)db53RBJ9V(y;l4O>1tsP=ZJq3XPzltE9c1wE-mHbao>deXr0sc!Bpx|Bac={M)UAql&5cI z^`d{$8 zP%egeybQ@;WCsrv`78g8k_ktmH1dx6(=jxl%Truzp>c#8=R#<2A4Abjin|t3%n@L?ZJ;wz)H zKJtT(#U%m;H!I5nc?^qD-(K%)d5}f$D`Q2(5&N}}?UEQx=z<$oG)?dT@%FbH_NkpQ z>VJ0g}iLGzI4L0uUBElC;>l^UZzC_Q37eO(@#wW>nGyq$0F8{ zW6T+B%wKS$@C~Z$eCn>Y98Z3AXI~mDzFwsc^`)WRbhRa-K0PF2-dC$sUO$?i^C>?CG;;g>;D-*`FXGMR58l(*omls(ix(# zvBT=#0W^p9CVw12A!^lP_8^)OdP}Rx6M0u%IEYGVySix*T?KbHcrca0Dy|+(lWC25 zb}+q2U#VM%P;p@@8kt}NtxxdeK!-V%kq6W}L#Tqbs2M|PWS?DnXkyPLEnK`Y5!u2d z!dr)t0)g4X>c*k;lw1Q;R1c#8^s?GGj5g`#(ZgwC_;qfsL4SYplHoLv`ogUMH$yzB zlnm*XDYLZp$p#$NQzPiyLIVTc)b>PW3QigklaHk-aEq&srR9>*_rtM}>lsTar6z+%^ad3u*#tK=kC*MGqT z0S_Mg)t#D@0Orye@EVnS9F>c2uTU2sM`!Z&;Bk~s*Q!sCqZ9MZfarF_bo060Hmlha z=|tMqQt;+j^~^-N0@^!k65T7lS()@6PZj~-eJ5*xUon}c(d+7&$utAt?_Ns9Q26*# ziX!r#SBkmTsAZ)W@P!TfE92Y<3aVuX%wS9>hWomfTpKUr$xBjKbbeTHgB$|X|W#vgU8c)fS zkiop9!n5$SOWCuKncS(~oJALa0bGt#%TGpbb67ohGUY+Dhfk(&(C*FIu#jEJ=qWUa z@Hl%8KdQBJK;AADIhCr+Ww6?OD%}TJ4|(HrN8*>9PQL@o51m0#HRuc)0X{A`1GDL( z`|0Im)tP2Ybrzz`;pDq#Q8htSbIzd~X|4L=9Qrpjr9M8FZUT^h^9%Y){BxzctP3&4jw{JCDu|zh^LRiSTJ^U7UJkvpvBbbCk-A z{7H>GA8F7X$-B>|i42Cr7f=x{!3$|5J)kCDh=I1N%P*u_JpGfOwyDxMEsgCn{>bvA zRti{t!vc8N#0&(#`_!R04IH_b+p+roSj=2BFAu}a-Mm-6_!Yc4I!-oXR9erC5CRz|(g(q;DJp2$6hDhZ>mBuY4l z+T&6d6^0JB=E!^8Hs(R1|9icV9zF)7V-*HM3Dt+yEoBhJyJ~M4Sw)*Py=|PWZAx_5 zj=Z>W9vvrdMs{%gJnE%yemRdya=+43$Z09B#7)q4d|%vv|CrW85d3qp&*^QOg#el! zokt6b|JSME&MESu`qg}j>1l6uZ=RS>=g||YxE%5BfNCtKA@roWrJQDs_$w0yUU|M; zs4MCZTmHySE{*zKO%0I2nDu!SpT3pe-WL^xVvwW!Qu0ZD8|p)zGkIPOuO)Y7mn_v&WAHM3|>ioC4`*3l{S zvAU>^CJlX!Ya?&+UvT8udyc!YwMCm%c&8+Zjf}_}>is$_h_=I&;`Ows!%bYRZ=kE; zcZ(Yl5{us9QS&WNc(~pN!T5(YE$p6<;;Ju~QvZSPb5XcLw{ZN+PCaXh$m5K&wM>;R zqlx(+==MwCjg0S!e8>ecWPHhu%V;~znT(-|Z(<+pv@TC-q@V_aSeb4od%Z^Ex zaO|s@QY=CBHk@xtVk~lf-<0O&)gW>YmM~t+YnuVN$!=-+w7TuOdi&+O{&ttIF(!eX zaPiH}%?WVjGu&CeneeqJ<0AMi;TBifuXw<&Q{{DJ;dcaSCW`rxBY3M~{xM=d&*vQ@ z_BhuF9#OoVA93BnSIplB3+Kd`gs|-9OL@m9Z8*zY3I2AAN;KLcDmA?pI@+7@fI+Yq zU~fmQbGu(R-09Z&d3pe?G%5m z;9=G59DGI|Xt4r}+d1_yeHD(xe(9yj5c1t3W-i+Ptp9}0iWf>5Fl1cyOyuri7PEX>Y?^Bsoe5gk@Cv*D-H zhU9sIv)P|oyvN%Kp_aGFhAf&GyOyu2p?*;!7GjdMx4WJcZdbyl}xe5BW7aS(aPumBbL8cX zM`#2-34(Q+Leyw%CA>3Z{sQ##S!h@gg|Lt-@S+#dE06OrzR3iZJiK3vdtgap#6e7E zmV;@Y#1FXwwYil>AUXh|4D4as0iwYoFcd`|0{wFvkdxqE=;YH4n7#-C7= z7=Bfv|Dy?546fZ6+;#QQ_R!NZ^1yBR?4oFp$+kbk(FS*tc0b1RvV}2k)iP}>HZ@h* z$5%#!;RJxla${Y01Z=QX#@MRxXs&n)4C%3Z0T;Ba3V(~H7c@n6y(@TE$N|fX!xbx_ z6%(=odK6Yt2>*PD!wD86iw^56sKaCTUS@miq1Q+(JiP#wfdWj2sErA%aMW*wc}D{5 z`G7q`6D%s2vM4K~o>iSL9m|&jOVkGt08Fe321CLC2h)3JGICNH;G0}dJyBzM3_?PD zqbavoM?gC3+uf&hLs$?3Wu`+6ASM+z44@DL2={3KN&xT7k7?#0D8%T{UJ1>C2S!kc z0pek@JyA%?APBh8u*1L_K>FDMP{05v1B0ho4if+cazMk%3-K@IeO;4BEgXj(K@;%a z)^*^~=L8*87-z$lkK&Y@^s(b*(Hd_9xcKoewIWJ|6E=0rmvAg!dj+7q1F@Mg0CYAe z5ljhNDTs5%PUFj%WgbA}gdEoyiq^4Hqo)#!M9LF7X$AW*FL*LzW2XPNY$LO>HQRt4 z+s)11s24UJ^+D4tyC<-^3RcDvP!s13;rdv}lCah`i@naou~WvpAUVZ|3%V^5{D&%I z8J3@gm0@`ih{EZErHN~ZXE%0c>l0ZZNW-tq@v9ls-XkkHF#*AdSsa}Gj0nLJhI%V! zW+9En9TsA247Mlo$*N{#jsZUS1Tl<#XG&Mx`c#yoT!14v0!1K!Ji!W7Y9Z8DM#GNW z;V%$fXJeSK{SzP2&cdymi@@ni_E>5Bln97M`(JeBXa@lVfENF(tN^^JLz~wM%*Y~M z3!<*d3fCuMsR?|kRxo+6Yq*>a+k^W8FHDhrz*EV#?H=x0K`UIq>~Lb_BeBuo*f2s&|Gke3}~;%THQR#<24U|VPH5IJw`B21-x0$TRrJl!wTQD-6N z_3Av`tMhb@*#Mo_<~$t<58ra0?%Z;o?zK5j*9C|tn2FnPqVBahQFlggI&h+{OZ=Rt z>%<^{d^@1?Z6u9sA17+GS0RzqDYg*{VC}MrCa(SI#9e1%oRC31c?mWIo$-75>Nti<@q}LeyFx+IRK@dc&@$I-N@CdWQnH$(b zmJlvZw8ggDUHd!@YCw<$0eSFn5I7zoCWa!S1g8LL>JUa9NPw$iNRG4|kR%)Kcocgq z+z!N8Y1?`=VI>e}E3wE4*~Ji*BiIaAuwE-8U2@3MO){+ohE{N1lp6;4*X_N7=M0Ww?)<#J@n(`f@KV9FrQ%= zm!O>)1v7A^6h@khkujVJ4?JT({A-uyHrU5E!h3^eWCewmA8!z(PB?V*;qInYn9{A_fHx}lcFT{!n0~^e}1|Vh#gY^(Zfc!6tGM%UBC5i6M@-bG; zCdF$nL<+B+XS!(HcAW_z$qkT{rQx6RROBY@{Wvd2;jK+3i279ig(O_(T0YG`CUsLT zze%~gX$c5t3k*%5O&gQ;4ha-NjxzE&=MD&Ld=_ejb&7+VP#UaQD}?|Nl*Nm_EdncK zxF+b0S7bv)mhGsoP zz#`h^!9-H4JzbIOR%obu?HpcqL9v!>K%#Co5U|=y&y0EAP{NU_<18Qvr#Yl#bObWI zotYS{Ib~u#Jufz^`M8~y_eF4RKi7#K~MI;NFnhxiR!!`!enEP8njij@o7nqT{We+&=W+PoYBe6TjGADLEe z2i&l+B?4N-Y;D+ja_pn+j4TMAm}kUzymn#&48^=LjwdEgZ*pknkzBIF)$a+2Qj7Cy z;{nszgDWVEg%baFV8-rG8z|#Q7Q1B(Wx+brNY;04kj#MsRA4r}kOYNkNXGi>zko8Z z&=$%Vq$89e0?tRAr5Q`aK{CoxNN(MDazb1J@@%v51W4xc5=oTWsck1L7TSdum{vdo zxx>bjMlSYA87WY*K{axzV0uD`Nny^pXp&%%1GQRVyz8HOJ;WFOJV*h^2dR&V*?2cX zI6M&wNe6Ovm=^LjUzLd+9kv7Vpr16&WA_~NmW5xX;NeFS*xBY8= zLuJg+WeS6{3?f!Siv$s+RRp?*)rzrDf#d>d2@H^z8knBnN%lhgCNG0Ga-0_K+^h_D zo#bSMVmBwlz9v)yrV}1Of@?TpcsdvwYP6vVlaqmcCnwW}rh%*xXAI5plgP|4J`>>t z3=aYZEDQldn1BIx^vAJTcFR;ey8M@lKjUj)@!C|3VjT3mL!<@v(GRADDf~`B3<>Yzo3e z+;g@S04nIegx_L-8LX&}@jD8}yXb5fL~=NV)UdoEOvY@%H=$eW?g=*bK!t{tNR%=X z7z=4W3Z}(Ii{9EdAZltrF>09?fZctM$ysG;(_p`VbjR@vNCwb2kE1d7bH+nw<~0*V z?0OT}*>JI#YgX_$i#EZNyX#dw-brH<_puA`@t%lr0T3Fy0PH@2VXikWfOn%f5oh0o zoRgCPw1?Z1GqNN*YsYjX2l7Na@GyiSHpi55*mRjpSR4}#UuRqjZ(VdEHm0}`86SHT z0K|9{y)(ewL1qV!l5ky$FU_U!*@dOuw4ZzG$gc0&xD-S%j_j_GFglY8PsBaoI8fn8 zR9Eovic?`pUgT@RBoMFNQ#A((SPTI}7})`q6RDxfPNIPZyjFf|AWMnQBCR3pU!{Qy z9><6o7o30SH(J`yg`M!uXVb6V0fQXx(v^kT9A5~v8S`bw2{sLeoh(|T(PVO%A$|YJ zczA{}r_d(60mf;54uIt`b$COKevMxbmxgN~PvZkMjuK=F)+p1kMrS+m|AuQsHO~J{ z3`p_K5^z!o**^BA3z#|3Ku!GDNbMY`I`+Y^{)^b>vYiIh1S7RoNF9*sMz<7a;IRWT zbb_v7)M?HD0O(g15BT9cv!% zwdmeUWAY9iqCE|K;DXI8bc2;mvDVySdu9}1a<=}6ei=o7ielljyh|#Fc#!|-6A50d z0WE;&59Z~Sn?e-U0T|_EI+{1|>{1Nh=6r?U%)`42#P2TD)#Hj+7eEUS&%$H4A>VeC z$?nC(=|r0p#Y0Q`A_ zEi`x$F|a5AEoKJ-N35LJm~BZENB*&j&;Kk?u4_19@38yY!Rf=Dn&qFSxZRZP^`|L7 zRLXBvLB*h5BKlen?-I~SxW(BD|0gDia<*ZX)&GLjHqaR$VqSzSc zC}b!PrdC@Ld5_TH!^7iEZ^i{`dPnL5wMUM2rd|FPVH|}^vYQcp#Ig!3YPQ-8LvSV@f z?J%YJ&JsmP!ubs>^gyI(6@jkEwGvJZ#FJsR?HoXaS^0V+T2)Q#+mfz_l?b4z4j&8RM4)1-*m#e4*-(JEmNlQBVjx+>0yp7DOD8kZFU**)YMjgno!ce+I(ve$ zFsI4*ISiToKIBsA89y)5AqF?&=QPVCN;+((^Ub*6O+_q%*&)G<({_(c!jDyiPWXAT zWVP!LHvU7#51!$g+Jjq*jrR~bN%-|v9(K`F2|w-tZoHojaAU_3hlQ!VJbnuRWlqMA zhCp|#NOc8g{JO%}zgE4LO)A4rU&M8m;X@Pby*1UDh`}%g_TVXj;f__(A;kx#wP5*T zGW_;)b(Z1l*>cTn@HBd|Hrl~v912-w>~D37&$#ByG!3=T66~{c&)PX`)0NJz9lIGm z24WoR(QsG+d1e~12i+7ORqi?~mExn!N%76fv~}gGf&5?KSnsO28NS1I0)R?M9@8T% z0h+w0YIK_xeVOF{AIQ`hzCLLQ;;_PjCf;#MgQl~+<+9xYnXNKPM`o)+TN%S$#|)p% zG$+Big0o4P#w$CxREiJxg=VP~pEoL-V!SPq)&;h~77t3zH-bQMP=D^vfM*pO{2GNr z=w^PT`0O3^?*{01>+mHgo_K3ZnyoFkU$eCZ&0uie+3Msh1nCGIv~%X@#fY4hVB>%+ zybP+-2rNKAT{_9|f1KE%itWDLkq9gT>uT(5fdcGoNt5V9+&a0l--!j2G zrP%#RZy9TfwC$fP4B63mcSvKk1`k%P#oIgpkE)KqnP7C>vDjb zU<=vLuUoo{0QfVFk2Y%tM9X%KP+~HdaD{*{+~BI?52)4)j0j#7Vp14X?)rl#gbU|P ziLe3bWJaKq*CZg;B?78<#)o>a{n@f*Tc2dj3Vg;IehF`9cs$_`h`cRt-`hjYyO=(p z+ma{#5B-wx+1DR0p}`qXU$w6py98eQ_2es;&=HC9zc$knTCc{fq<(ZuGQN_0BtN^# z{7l2jRkVR_P4>KuN=dA~MjhFJk9})a13~MZhqZXXk3(!)jZa#(s|Q!pllZ`;`PcZp zl$X?m%khEX`^k$g$9H$MDOtOQzareEa4kqa_Z#|Sn2xH(4fr8}^{UH8>XG^O*Ly*n z-5WT$jZ1olO+g_FwsS#L-1d7z!_19LgY!^@hr&(2W6mO1m~RjPg@|3^I0Q`DUF2cr zgOA~hqSVt{8}-w7=5mdqXwV%*k)m#B$%P$9E^ae2w?MQKV%d zF>nZ4os3;ecMFH2(ax;y=aYbi({BGd&66_(c!H} zdZ_U?Kq*I)({7+4Uh%_K$);Nn8n+B@r11R=i;L@Y?h!6Zt`i}0z<)iNizmucNzsGNl98GTco)$`=^~awu z!Aok`&x|#F$$#JY1(#*)r??iBEc=;`O8R5+Y$={2T>JUNR4-su6%rTF?R*)N{5d4* zCCciv#7ne3IXzpP2~?}=a|9#p;T%y+FD2i}5#1$}>A0ClH__^5l2f~hfo$rgGP$O^ zc+3xyPc9S-iB>1K_ZCCF;^y@VA9i<7{yQojA+Wx)STxh?$?<)}rb}o~^6xi`KX_H+ z?V{8tJRZ-PYWM9z;Y+tO|0J#;s!P6phnN~D*!dUXttnel;mOWwsF+{dP+rk6ba`3h z61wlcay-R#QDfn9vKYivY%Vw()nX-pE5|%#o!3?UUx_=Rd0}t$cN}0^-g~|LyZ+O;@?eYfmZd^Y%qJU ztMsacLXN`^Yuqg40{I9HQMdSIzB)Kt`qcm_vx1LOjpj|Qn-vZG@mCx&dNSb_Ev9r<#f59W+?hX z6sw2d61nOEA87pxEi^?fJ~@>hS1yD%9d6) z#TV7qRz0Iu2IK&GR^1(tXVP;UgL05KNGf}`=pUF@+tBnp4N^I~MWI?AlsWPR_vvr0ZS`%C7Py5RIn-B}1||{Y~Lr#R2qpH7g{qkca3O>Wf}7roKE?j>WG749k%H z=@oTOhO7>}%EUrUU;QYKQHL|Ika~^l^A$J^W{;{^vAF4Vs%r=u55RzeF5 zry5oNs_3a656k)VrW%+j&xR9RnJN3qw`l+~Uzj~&#QdcV4HY#_@$$tD@35Nk)#sVA zK)y>Qtzzt=XVib*qw$)uRt=w>C40fU)n&<1@&lS+da+Q|(^;~6_(Q7T4(B$Gs8m~D z6#2@ZEl-di(NxoLc#aII+H7!mSgp&JXUmU4n${oJghn?ul`pRO1R{3Jx`aQanP$X_ zIGby}isZvwt8!$FK2ulc$Vv3MdO8O@f1!p)WGQ{A>LYS79Z|1EM3VsaZvtHouay2<$ULda!7jnCk)u;IY=NfSu zKg|k_UQoTXanWy_M|D$y^k@85oNMN(Hy}Flg&3;lK9AFqD;0kCXbw`i(+XuJ{Z8#J zgd@6IRI5h{<=JXcuFUm~k6(kC@O+j!(i_lU>pW$SUf!^{sbb3b_&PC9*JqE{C2{;9 zBT9d-_8cR}eSO%Rg15w=_Vd+9o?+#zVaHnMLpkF zE)U)+7BTg|Q1pT*QICEp2CE(4i5&beq`D^{XXmj1%Hp@B|3c;MqFmkb27<=y{&EEU zNhSKrINhP%>Mzg7Z-PuLk*7rO6n-tiWp@cLe%G@6ZsF6<_XuBn8r;Oa>h2O*K=-L9 zN@P*ue&H))54J`4f!X=X%eRW2M_y7u$nMX9@Fy?(JigxINk42RXb3Y;OAAY9ViFN zy>QznZxIDK`$UKxZk+!-1_!owi^$K}FG49&{~|1P+#p%#W4<3(;|IZ!KcUJ7VUPnN zrrsGOdmAM^skRQ1L-3P@W9j5z9cgARWtoJ(cL^4 z<(8GB4ft5{chRG@+!(2;I3&VO@5ZLGrk6E&(C32rHBHq_cn_qX)yTZ@Kbr-#-Z_1a}z3&YFfe6Lp)$(MV+cA_i`9bY(O&Y45Y%bLoDx_ySm zf#{E>ir*U=an^9M9)ysGY~9lPC`QWsVzr~*j#n+B$Nz4U7je4PcYRDlac83 SnQI;np@#Y+? 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 diff --git a/crates/libc-alloc/Cargo.toml b/crates/libc-alloc/Cargo.toml index 280d6ee..6ab6b85 100644 --- a/crates/libc-alloc/Cargo.toml +++ b/crates/libc-alloc/Cargo.toml @@ -4,4 +4,3 @@ version = "0.1.0" edition = "2024" [dependencies] -talc = "5.0.3" diff --git a/crates/libc-alloc/src/lib.rs b/crates/libc-alloc/src/lib.rs index 8772287..9e8706d 100644 --- a/crates/libc-alloc/src/lib.rs +++ b/crates/libc-alloc/src/lib.rs @@ -1,195 +1,49 @@ -//! Replaces wasi-libc's dlmalloc with a talc arena. +//! Makes wasi-libc's malloc work in modules linked with `--page-size=1`. //! -//! wasi-libc's `sbrk` assumes 64 KiB wasm pages, so its dlmalloc traps when the -//! module is linked with `--page-size=1`. Defining every symbol that -//! `dlmalloc.c.obj` provides keeps the linker from pulling it (and `sbrk`) in. +//! wasi-libc's dlmalloc gets memory only through `sbrk`, and `sbrk` is the +//! only place that assumes 64 KiB wasm pages: it aborts unless the increment +//! is a multiple of 65536, and converts between pages and bytes with `<< 16`. +//! dlmalloc itself locates the heap through `__heap_base`/`__heap_end`, which +//! are byte addresses. Defining `sbrk` here keeps the linker from pulling in +//! wasi-libc's `sbrk.o`, so everything else stays stock wasi-libc. //! -//! The talc arena lives here and backs `malloc`, rather than being the Rust -//! `#[global_allocator]`. `free(p)` has no size, so every block carries a -//! header. `cabi_realloc` (from std's `wasip2` crate) calls `__rust_alloc`, -//! and wasi-libc frees those canonical-ABI buffers with `free()` (e.g. the -//! list returned by `blocking-read` in `read()`). If `__rust_alloc` went -//! straight to talc, those blocks would have no header and `free` would trap. -//! Leaving Rust on the default `System` allocator, which calls `malloc`, -//! `posix_memalign` and `free` on wasi, gives every allocation the header. -//! -//! Users must therefore not set a `#[global_allocator]`; just `extern crate libc_alloc;`. +//! This keeps a single allocator for the whole module: Rust's default `System` +//! allocator calls `malloc`/`free` on wasi, and `cabi_realloc` (from std's +//! `wasip2` crate) calls `__rust_alloc`, so C code can `free()` canonical-ABI +//! buffers. Users must therefore not set a `#[global_allocator]`; just +//! `extern crate libc_alloc;`. #![no_std] -#[cfg(target_os = "wasi")] +#[cfg(all(target_os = "wasi", target_arch = "wasm32"))] mod imp { - use core::alloc::{GlobalAlloc, Layout}; + use core::arch::wasm32::{memory_grow, memory_size, unreachable}; use core::ffi::c_void; - use core::mem::MaybeUninit; - use core::ptr::{self, null_mut}; - - // The only heap in the module: both C (`malloc`) and Rust (`System` -> `malloc`) - // allocate from it. A fixed arena avoids the 64 KiB page assumptions of - // `sbrk` and talc's `memory.grow` source. - static TALC: talc::wasm::WasmArenaTalc = { - static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; - // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. - unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } - }; - - /// `max_align_t` on wasm32. - const MIN_ALIGN: usize = 16; - const EINVAL: i32 = 28; - const ENOMEM: i32 = 48; - // Each block is laid out as `[padding .. total_size, align][user data]`. - // The header is `max(MIN_ALIGN, align)` bytes, so the user pointer keeps the - // requested alignment, and the last 8 bytes hold what `free` needs. - unsafe fn header(p: *mut u8) -> (*mut u8, Layout) { - unsafe { - let total = *(p.sub(8) as *const usize); - let align = *(p.sub(4) as *const usize); - ( - p.sub(align), - Layout::from_size_align_unchecked(total, align), - ) - } - } - - unsafe fn write_header(base: *mut u8, layout: Layout) -> *mut u8 { - unsafe { - let p = base.add(layout.align()); - *(p.sub(8) as *mut usize) = layout.size(); - *(p.sub(4) as *mut usize) = layout.align(); - p - } - } - - unsafe fn alloc_aligned(size: usize, align: usize, zeroed: bool) -> *mut c_void { - let align = align.max(MIN_ALIGN); - let Some(total) = size.checked_add(align) else { - return null_mut(); - }; - let Ok(layout) = Layout::from_size_align(total, align) else { - return null_mut(); - }; - unsafe { - let base = if zeroed { - TALC.alloc_zeroed(layout) - } else { - TALC.alloc(layout) - }; - if base.is_null() { - return null_mut(); - } - write_header(base, layout) as *mut c_void - } + unsafe extern "C" { + // End of static data, in bytes. Provided by wasm-ld. + static __heap_end: u8; } #[unsafe(no_mangle)] - pub unsafe extern "C" fn malloc(size: usize) -> *mut c_void { - unsafe { alloc_aligned(size, MIN_ALIGN, false) } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn calloc(n: usize, size: usize) -> *mut c_void { - match n.checked_mul(size) { - Some(total) => unsafe { alloc_aligned(total, MIN_ALIGN, true) }, - None => null_mut(), + pub unsafe extern "C" fn sbrk(increment: isize) -> *mut c_void { + // With 1-byte pages, `memory.size` (in pages) is in bytes and covers at + // least the static data. With 64 KiB pages it is far smaller than + // `__heap_end`, which means the module wasn't linked with + // `--page-size=1`; trap instead of corrupting memory. + if memory_size(0) < &raw const __heap_end as usize { + unreachable(); } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn free(p: *mut c_void) { - if p.is_null() { - return; + if increment == 0 { + return memory_size(0) as *mut c_void; } - unsafe { - let (base, layout) = header(p as *mut u8); - TALC.dealloc(base, layout); + // dlmalloc never trims (wasi-libc sets MORECORE_CANNOT_TRIM). + if increment < 0 { + unreachable(); } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn realloc(p: *mut c_void, size: usize) -> *mut c_void { - unsafe { - if p.is_null() { - return malloc(size); - } - if size == 0 { - free(p); - return null_mut(); - } - let (base, layout) = header(p as *mut u8); - let align = layout.align(); - if align == MIN_ALIGN { - let Some(total) = size.checked_add(align) else { - return null_mut(); - }; - if Layout::from_size_align(total, align).is_err() { - return null_mut(); - } - let new_base = TALC.realloc(base, layout, total); - if new_base.is_null() { - return null_mut(); - } - return write_header(new_base, Layout::from_size_align_unchecked(total, align)) - as *mut c_void; - } - let new = alloc_aligned(size, align, false); - if !new.is_null() { - let old_size = layout.size() - align; - ptr::copy_nonoverlapping(p as *const u8, new as *mut u8, old_size.min(size)); - free(p); - } - new + match memory_grow(0, increment as usize) { + // dlmalloc treats `(void *)-1` as failure and sets errno itself. + usize::MAX => usize::MAX as *mut c_void, + old => old as *mut c_void, } } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn aligned_alloc(align: usize, size: usize) -> *mut c_void { - if !align.is_power_of_two() { - return null_mut(); - } - unsafe { alloc_aligned(size, align, false) } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn posix_memalign( - out: *mut *mut c_void, - align: usize, - size: usize, - ) -> i32 { - if !align.is_power_of_two() || align % size_of::() != 0 { - return EINVAL; - } - unsafe { - let p = alloc_aligned(size, align, false); - if p.is_null() { - return ENOMEM; - } - *out = p; - } - 0 - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn malloc_usable_size(p: *mut c_void) -> usize { - if p.is_null() { - return 0; - } - let (_, layout) = unsafe { header(p as *mut u8) }; - layout.size() - layout.align() - } - - // Internal aliases used by wasi-libc's locale and atexit code. - #[unsafe(no_mangle)] - pub unsafe extern "C" fn __libc_malloc(size: usize) -> *mut c_void { - unsafe { malloc(size) } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn __libc_calloc(n: usize, size: usize) -> *mut c_void { - unsafe { calloc(n, size) } - } - - #[unsafe(no_mangle)] - pub unsafe extern "C" fn __libc_free(p: *mut c_void) { - unsafe { free(p) } - } } From 00c11b870e26d59360d8af7e12c2f3c225be63e7 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 22:06:39 -0700 Subject: [PATCH 15/18] fix --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c60b9d8..af63e61 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,7 +38,8 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --branch yan/adapt-ps1 --locked viceroy + # viceroy may be restored from the cache in ~/.cargo/bin + command -v viceroy || RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --branch yan/adapt-ps1 --locked viceroy # tmp=$(mktemp -d) # curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz # tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" From 25ecf8a161edb2d28bb1f09da14c615ca8e41b24 Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sat, 3 Oct 2026 22:29:01 -0700 Subject: [PATCH 16/18] use custom dlmalloc for generated code --- assets/one_byte_page_alloc.rs | 69 +++++++++++++++++++++++++++++++++++ assets/proj_cargo.toml | 2 +- assets/workspace_cargo.toml | 2 +- src/codegen/mod.rs | 13 +++---- 4 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 assets/one_byte_page_alloc.rs diff --git a/assets/one_byte_page_alloc.rs b/assets/one_byte_page_alloc.rs new file mode 100644 index 0000000..69cd978 --- /dev/null +++ b/assets/one_byte_page_alloc.rs @@ -0,0 +1,69 @@ +//! Global allocator for the generated crates, which are linked with `--page-size=1`. +//! +//! std's default allocator on wasm32-unknown-unknown is dlmalloc, but its memory +//! source assumes 64 KiB pages. This uses dlmalloc with a source that grows +//! memory by bytes instead. +//! +//! Spliced into the generated `lib.rs` (inside `mod one_byte_page_alloc`) by +//! `src/codegen/mod.rs`; it is not compiled on its own. + +use core::alloc::{GlobalAlloc, Layout}; +use core::arch::wasm32::memory_grow; +use core::cell::UnsafeCell; +use core::ptr::null_mut; + +struct OneBytePage; + +unsafe impl dlmalloc::Allocator for OneBytePage { + fn alloc(&self, size: usize) -> (*mut u8, usize, u32) { + // With 1-byte pages, `memory.grow` counts bytes. + match memory_grow(0, size) { + usize::MAX => (null_mut(), 0, 0), + prev => (prev as *mut u8, size, 0), + } + } + fn remap(&self, _: *mut u8, _: usize, _: usize, _: bool) -> *mut u8 { + null_mut() + } + fn free_part(&self, _: *mut u8, _: usize, _: usize) -> bool { + false + } + fn free(&self, _: *mut u8, _: usize) -> bool { + false + } + fn can_release_part(&self, _: u32) -> bool { + false + } + fn allocates_zeros(&self) -> bool { + true + } + // Only used by dlmalloc for rounding; `alloc` accepts any size. + fn page_size(&self) -> usize { + 64 * 1024 + } +} + +struct Dlmalloc(UnsafeCell>); + +// SAFETY: wasm without atomics is single-threaded. +unsafe impl Sync for Dlmalloc {} + +unsafe impl GlobalAlloc for Dlmalloc { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + unsafe { (*self.0.get()).malloc(layout.size(), layout.align()) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + unsafe { (*self.0.get()).calloc(layout.size(), layout.align()) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { (*self.0.get()).free(ptr, layout.size(), layout.align()) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + unsafe { (*self.0.get()).realloc(ptr, layout.size(), layout.align(), new_size) } + } +} + +#[global_allocator] +static ALLOC: Dlmalloc = Dlmalloc(UnsafeCell::new(dlmalloc::Dlmalloc::new_with_allocator( + OneBytePage, +))); diff --git a/assets/proj_cargo.toml b/assets/proj_cargo.toml index 6a52f39..38ef8c2 100644 --- a/assets/proj_cargo.toml +++ b/assets/proj_cargo.toml @@ -11,4 +11,4 @@ path = "lib.rs" wit-bindgen.workspace = true wasm-wave.workspace = true arbitrary.workspace = true -talc.workspace = true +dlmalloc.workspace = true diff --git a/assets/workspace_cargo.toml b/assets/workspace_cargo.toml index 2d7305c..9ae1637 100644 --- a/assets/workspace_cargo.toml +++ b/assets/workspace_cargo.toml @@ -7,7 +7,7 @@ wit-bindgen = { version = "0.62.0", default-features = false, features = ["bitfl wasm-wave = { git = "https://github.com/chenyan2002/wasm-tools.git", branch = "extend-wave", version = "0.239.0", default-features = false } #wasm-wave = { path = "/Users/chenyan/src/bytecodealliance/wasm-tools/crates/wasm-wave", default-features = false } arbitrary = "1.4.2" -talc = "5.0.3" +dlmalloc = "0.2.14" [profile.release] codegen-units = 1 diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7bfaa06..76e1822 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -88,15 +88,12 @@ impl GenerateArgs { state.output.extend(traits); let mut file = state.into_output_file(); if self.use_custom_allocator { + // dlmalloc with a memory source that grows by bytes, for `--page-size=1`. + let alloc = syn::parse_file(include_str!("../../assets/one_byte_page_alloc.rs"))?; + let items = alloc.items; file.items.push(parse_quote! { - #[cfg(all(not(target_feature = "atomics"), target_family = "wasm"))] - #[global_allocator] - static TALC: talc::wasm::WasmArenaTalc = { - use core::mem::MaybeUninit; - static mut MEMORY: [MaybeUninit; 0x80000] = [MaybeUninit::uninit(); 0x80000]; - // SAFETY: the memory for MEMORY is never modified externally. It's the allocator's. - unsafe { talc::wasm::new_wasm_arena_allocator(&raw mut MEMORY) } - }; + #[cfg(all(not(target_feature = "atomics"), target_arch = "wasm32"))] + mod one_byte_page_alloc { #(#items)* } }); } let output = prettyplease::unparse(&file); From 75d16190b5afffc966c2e7f802c884c4b4f933be Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sun, 4 Oct 2026 09:36:19 -0700 Subject: [PATCH 17/18] make one-byte flag opt in --- .github/workflows/main.yml | 12 ++++++-- Makefile | 47 ++++++++++++++++++----------- assets/debug.one_byte_page.wasm | Bin 0 -> 85039 bytes assets/debug.wasm | Bin 85039 -> 85043 bytes assets/recorder.one_byte_page.wasm | Bin 0 -> 234835 bytes assets/recorder.wasm | Bin 234835 -> 234839 bytes components/debug/Cargo.toml | 6 +++- components/debug/build.rs | 6 ++++ components/debug/src/lib.rs | 4 ++- components/recorder/Cargo.toml | 6 +++- components/recorder/build.rs | 6 ++++ components/recorder/src/lib.rs | 4 ++- crates/libc-alloc/src/lib.rs | 3 ++ src/instrument.rs | 17 ++++++++--- 14 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 assets/debug.one_byte_page.wasm create mode 100644 assets/recorder.one_byte_page.wasm create mode 100644 components/debug/build.rs create mode 100644 components/recorder/build.rs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index af63e61..93b2d6a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,8 +7,16 @@ on: jobs: build: - name: Build and Test + name: Build and Test (${{ matrix.memory }} pages) runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - memory: regular + one_byte_page: 0 + - memory: one-byte + one_byte_page: 1 env: WAC_VERSION: 0.12.0 VICEROY_VERSION: 0.21.1 @@ -48,4 +56,4 @@ jobs: - name: Build run: make - name: Test - run: make test + run: make test ONE_BYTE_PAGE=${{ matrix.one_byte_page }} diff --git a/Makefile b/Makefile index 600017f..277f463 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,24 @@ .PHONY: all build-components build-cli test test-record test-fuzz test-dialog run-fuzz run-record run-dialog run-viceroy +# `make test ONE_BYTE_PAGE=1` tests with 1-byte-page memories +ifeq ($(ONE_BYTE_PAGE),1) +INSTRUMENT_FLAGS = --one-byte-page-size +WASMTIME_FLAGS = -W custom-page-sizes=y +endif +INSTRUMENT = target/release/proxy-component instrument $(INSTRUMENT_FLAGS) +WASMTIME = wasmtime $(WASMTIME_FLAGS) + all: build-components build-cli build-cli: cargo build --all-features --release +# The CLI embeds both regular and 1-byte-page builds of these components. build-components: - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p debug --target wasm32-wasip2 --release - RUSTFLAGS="-C link-arg=--page-size=1" cargo build -p recorder --target wasm32-wasip2 --release + cargo build -p debug -p recorder --target wasm32-wasip2 --release + cargo build -p debug -p recorder --target wasm32-wasip2 --release --features debug/one-byte-page,recorder/one-byte-page --target-dir target/one-byte-page cp target/wasm32-wasip2/release/debug.wasm assets/debug.wasm cp target/wasm32-wasip2/release/recorder.wasm assets/recorder.wasm + cp target/one-byte-page/wasm32-wasip2/release/debug.wasm assets/debug.one_byte_page.wasm + cp target/one-byte-page/wasm32-wasip2/release/recorder.wasm assets/recorder.one_byte_page.wasm test: test-fuzz test-record test-dialog @@ -15,22 +26,22 @@ test-fuzz: $(MAKE) run-fuzz WASM=tests/calculator.wasm $(MAKE) run-fuzz WASM=tests/wasi_http.wasm # build-only test - target/release/proxy-component instrument -m fuzz tests/rust.wasm - target/release/proxy-component instrument -m fuzz tests/go.wasm - target/release/proxy-component instrument -m fuzz tests/python.wasm + $(INSTRUMENT) -m fuzz tests/rust.wasm + $(INSTRUMENT) -m fuzz tests/go.wasm + $(INSTRUMENT) -m fuzz tests/python.wasm test-record: $(MAKE) run-record WASM=tests/go.wasm $(MAKE) run-record WASM=tests/python.wasm $(MAKE) run-record WASM=tests/rust.wasm # test the same trace with a different wasm replay - target/release/proxy-component instrument -m replay tests/rust.debug.wasm - wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out + $(INSTRUMENT) -m replay tests/rust.debug.wasm + $(WASMTIME) --invoke 'start()' composed.wasm < trace.out # build-only test - target/release/proxy-component instrument -m record tests/calculator.wasm - target/release/proxy-component instrument -m replay tests/calculator.wasm - target/release/proxy-component instrument -m record tests/wasi_http.wasm - target/release/proxy-component instrument -m replay tests/wasi_http.wasm + $(INSTRUMENT) -m record tests/calculator.wasm + $(INSTRUMENT) -m replay tests/calculator.wasm + $(INSTRUMENT) -m record tests/wasi_http.wasm + $(INSTRUMENT) -m replay tests/wasi_http.wasm test-dialog: rm tests/composed.wasm || true @@ -39,20 +50,20 @@ test-dialog: done run-fuzz: - target/release/proxy-component instrument -m fuzz $(WASM) - wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm + $(INSTRUMENT) -m fuzz $(WASM) + $(WASMTIME) --invoke 'start()' composed.wasm run-record: - target/release/proxy-component instrument -m record $(WASM) + $(INSTRUMENT) -m record $(WASM) $(MAKE) run-viceroy URL=localhost:7676 - target/release/proxy-component instrument -m replay $(WASM) - wasmtime -W custom-page-sizes=y --invoke 'start()' composed.wasm < trace.out + $(INSTRUMENT) -m replay $(WASM) + $(WASMTIME) --invoke 'start()' composed.wasm < trace.out # test host replay - target/release/proxy-component instrument -m replay --use-host-recorder $(WASM) + $(INSTRUMENT) -m replay --use-host-recorder $(WASM) target/release/proxy-component run composed.wasm --invoke 'start()' --trace trace.out run-dialog: - target/release/proxy-component instrument -m dialog $(WASM) + $(INSTRUMENT) -m dialog $(WASM) # build-only # target/release/proxy-component run composed.wasm --invoke 'start()' diff --git a/assets/debug.one_byte_page.wasm b/assets/debug.one_byte_page.wasm new file mode 100644 index 0000000000000000000000000000000000000000..b9132d068bca5f356ec0e6fac74511876e5a4642 GIT binary patch literal 85039 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 literal 0 HcmV?d00001 diff --git a/assets/debug.wasm b/assets/debug.wasm index 3219a0f276800a55afb8e1d01064e34aabe4491c..7afc8d4743b76750dc4e6c1086aa250bb897dc68 100644 GIT binary patch delta 301 zcmZ2KgLU%^)(u^3jBT5{*=Dh_Ff%d;PS)Y+5p8HV!oXe6;CK>Do?+l-pUlWM`7F<* z$?3cmjJr2K;JudW>&L+4puoV(V9($vP{Pj*;yC{Q&s@mM0A$qr@Pefs1x_-cf4EIC=A{(zBJ^DW0i0Rql@dDT(fz54~4%u#t85 t57A3WEJ@VM%qvMP%1g}Ai;vGpO)Q8{N-Rzlk-;gQnwPR&!GMup1^}JaT>t<8 delta 256 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 delta 595 zcmZw9yGz4R6bA5fPE4(a#I}fv_(u5ipxC*k}y>m|k0rp|KjHw=sVM0CbwOF1eu2JOk#mSaOef_gHc} zJGh{Fccn>w3%iZ`3!3o=frZw1f4ny^-XCUzH>6iuV5&n4%`RwjA+0*Xu0E)mrJu;f zoH=T=?RDj7(gu4uTCqXfEhYbNuA61ArJTZEZmHR}(vT;^28BEotYAFek%0fVdMDUf x88=}4&PE=n+zQ6x18r|%4NHc(a#pW#JRh2$lWYHS2`Qt@AK|KuX^ngLega$_tC0Wz diff --git a/components/debug/Cargo.toml b/components/debug/Cargo.toml index 4ca208a..f4d2acb 100644 --- a/components/debug/Cargo.toml +++ b/components/debug/Cargo.toml @@ -9,4 +9,8 @@ crate-type = ["cdylib"] [dependencies] wit-bindgen.workspace = true getrandom = "0.3" -libc-alloc = { path = "../../crates/libc-alloc" } +libc-alloc = { path = "../../crates/libc-alloc", optional = true } + +[features] +# Link with 1-byte wasm pages (see build.rs) +one-byte-page = ["dep:libc-alloc"] diff --git a/components/debug/build.rs b/components/debug/build.rs new file mode 100644 index 0000000..59b8a38 --- /dev/null +++ b/components/debug/build.rs @@ -0,0 +1,6 @@ +fn main() { + // Link with 1-byte wasm pages; libc-alloc's `sbrk` makes wasi-libc's malloc work with them. + if std::env::var_os("CARGO_FEATURE_ONE_BYTE_PAGE").is_some() { + println!("cargo:rustc-link-arg=--page-size=1"); + } +} diff --git a/components/debug/src/lib.rs b/components/debug/src/lib.rs index cbdd57c..a9238f7 100644 --- a/components/debug/src/lib.rs +++ b/components/debug/src/lib.rs @@ -1,4 +1,6 @@ -// libc_alloc provides the heap; don't add a #[global_allocator] (see crates/libc-alloc). +// Regular builds use stock wasi-libc malloc. With 1-byte pages, libc_alloc makes it work; +// either way, don't add a #[global_allocator] (see crates/libc-alloc). +#[cfg(feature = "one-byte-page")] extern crate libc_alloc; mod bindings { diff --git a/components/recorder/Cargo.toml b/components/recorder/Cargo.toml index 328f966..2eb201e 100644 --- a/components/recorder/Cargo.toml +++ b/components/recorder/Cargo.toml @@ -10,4 +10,8 @@ crate-type = ["cdylib"] trace = { path = "../../crates/trace" } serde_json.workspace = true wit-bindgen.workspace = true -libc-alloc = { path = "../../crates/libc-alloc" } +libc-alloc = { path = "../../crates/libc-alloc", optional = true } + +[features] +# Link with 1-byte wasm pages (see build.rs) +one-byte-page = ["dep:libc-alloc"] diff --git a/components/recorder/build.rs b/components/recorder/build.rs new file mode 100644 index 0000000..59b8a38 --- /dev/null +++ b/components/recorder/build.rs @@ -0,0 +1,6 @@ +fn main() { + // Link with 1-byte wasm pages; libc-alloc's `sbrk` makes wasi-libc's malloc work with them. + if std::env::var_os("CARGO_FEATURE_ONE_BYTE_PAGE").is_some() { + println!("cargo:rustc-link-arg=--page-size=1"); + } +} diff --git a/components/recorder/src/lib.rs b/components/recorder/src/lib.rs index b94d6ef..7b57a36 100644 --- a/components/recorder/src/lib.rs +++ b/components/recorder/src/lib.rs @@ -1,4 +1,6 @@ -// libc_alloc provides the heap; don't add a #[global_allocator] (see crates/libc-alloc). +// Regular builds use stock wasi-libc malloc. With 1-byte pages, libc_alloc makes it work; +// either way, don't add a #[global_allocator] (see crates/libc-alloc). +#[cfg(feature = "one-byte-page")] extern crate libc_alloc; mod bindings { diff --git a/crates/libc-alloc/src/lib.rs b/crates/libc-alloc/src/lib.rs index 9e8706d..650bc32 100644 --- a/crates/libc-alloc/src/lib.rs +++ b/crates/libc-alloc/src/lib.rs @@ -12,6 +12,9 @@ //! `wasip2` crate) calls `__rust_alloc`, so C code can `free()` canonical-ABI //! buffers. Users must therefore not set a `#[global_allocator]`; just //! `extern crate libc_alloc;`. +//! +//! Only link this into modules built with 1-byte pages (the components' +//! `one-byte-page` feature); regular builds use wasi-libc's own `sbrk`. #![no_std] #[cfg(all(target_os = "wasi", target_arch = "wasm32"))] diff --git a/src/instrument.rs b/src/instrument.rs index a1b6379..8c2a550 100644 --- a/src/instrument.rs +++ b/src/instrument.rs @@ -18,14 +18,16 @@ pub struct InstrumentArgs { /// Whether to use the host recorder implementation or link the recorder component #[arg(long)] pub use_host_recorder: bool, - /// Whether to use a one-byte page size for the wasm component - #[arg(long, default_value_t = true)] + /// Use 1-byte wasm pages for the generated and bundled components + #[arg(long)] pub one_byte_page_size: bool, } -// TODO: Add one-byte and regular page size wasm binaries const DEBUG_WASM: &[u8] = include_bytes!("../assets/debug.wasm"); const RECORDER_WASM: &[u8] = include_bytes!("../assets/recorder.wasm"); +// Built with `--features one-byte-page` (see Makefile `build-components`). +const DEBUG_WASM_ONE_BYTE_PAGE: &[u8] = include_bytes!("../assets/debug.one_byte_page.wasm"); +const RECORDER_WASM_ONE_BYTE_PAGE: &[u8] = include_bytes!("../assets/recorder.one_byte_page.wasm"); pub fn run(args: InstrumentArgs) -> Result<()> { if args.use_host_recorder && !matches!(args.mode, Mode::Record | Mode::Replay) { @@ -98,7 +100,12 @@ pub fn run(args: InstrumentArgs) -> Result<()> { let imports = format!("import:proxy={}", imports_wasm_path.display()); let exports = format!("export:proxy={}", exports_wasm_path.display()); let root = format!("root:component={}", args.wasm_file.display()); - fs::write(tmp_dir.join("debug.wasm"), DEBUG_WASM)?; + let (debug_wasm, recorder_wasm) = if args.one_byte_page_size { + (DEBUG_WASM_ONE_BYTE_PAGE, RECORDER_WASM_ONE_BYTE_PAGE) + } else { + (DEBUG_WASM, RECORDER_WASM) + }; + fs::write(tmp_dir.join("debug.wasm"), debug_wasm)?; let debug = format!("import:debug={}/debug.wasm", tmp_dir.display()); let wac_path = tmp_dir.join("wit/compose.wac"); let mut cmd = Command::new("wac"); @@ -116,7 +123,7 @@ pub fn run(args: InstrumentArgs) -> Result<()> { .arg(output_file); if !args.use_host_recorder { let wasm_path = tmp_dir.join("recorder.wasm"); - fs::write(&wasm_path, RECORDER_WASM)?; + fs::write(&wasm_path, recorder_wasm)?; let recorder = format!("import:recorder={}", wasm_path.display()); cmd.arg("--dep").arg(&recorder); } From 1626b597b09fe337c45f6ba1d1d696737fb17e8e Mon Sep 17 00:00:00 2001 From: Yan Chen Date: Sun, 4 Oct 2026 09:51:04 -0700 Subject: [PATCH 18/18] bump wasmtime --- .github/workflows/main.yml | 5 +- Cargo.lock | 1126 ++++++++++++++++-------------------- Cargo.toml | 4 +- 3 files changed, 493 insertions(+), 642 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 93b2d6a..e185803 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,6 +34,8 @@ jobs: ~/.cargo/registry ~/.cargo/git ~/.cargo/bin + ~/.cargo/.crates.toml + ~/.cargo/.crates2.json target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | @@ -46,8 +48,7 @@ jobs: mv "$tmp/wac-cli" /usr/local/bin/wac - name: Install viceroy run: | - # viceroy may be restored from the cache in ~/.cargo/bin - command -v viceroy || RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --branch yan/adapt-ps1 --locked viceroy + RUSTFLAGS="--cap-lints=warn" cargo install --git https://github.com/fastly/Viceroy.git --branch yan/adapt-ps1 --locked viceroy # tmp=$(mktemp -d) # curl -sLo "$tmp/viceroy.tar.gz" https://github.com/fastly/Viceroy/releases/download/v${{ env.VICEROY_VERSION }}/viceroy_v${{ env.VICEROY_VERSION }}_linux-amd64.tar.gz # tar -xz -f "$tmp/viceroy.tar.gz" -C "$tmp" diff --git a/Cargo.lock b/Cargo.lock index d5d05d8..1f4d2a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,20 +23,11 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -49,15 +40,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -84,9 +75,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arbitrary" @@ -96,13 +87,13 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] @@ -143,92 +134,42 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" dependencies = [ "allocator-api2", ] [[package]] name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" - -[[package]] -name = "cap-fs-ext" -version = "3.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476f0d0003a760918ed4b1e039a59e11769030416f79c8222551d22785f7f70d" -dependencies = [ - "cap-primitives", - "cap-std", - "io-lifetimes", - "windows-sys 0.59.0", -] - -[[package]] -name = "cap-net-ext" -version = "3.4.6" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150941cefd3df4de2fea24604ba4949371576f62e527410298333f7d431a1bc6" -dependencies = [ - "cap-primitives", - "cap-std", - "rustix", - "smallvec", -] +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cap-primitives" -version = "3.4.6" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e0bf07d379916947be6c4a07f43684153d710a2896c31f9e97781362895596c" +checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18" dependencies = [ "ambient-authority", "fs-set-times", "io-extras", - "io-lifetimes", + "io-lifetimes 3.0.1", "ipnet", "maybe-owned", "rustix", "rustix-linux-procfs", - "windows-sys 0.59.0", - "winx", -] - -[[package]] -name = "cap-std" -version = "3.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a59e59fa26472d29680ece6a9f8ee8b0551a719a33df2f5240bde065ecbddfd7" -dependencies = [ - "cap-primitives", - "io-extras", - "io-lifetimes", - "rustix", -] - -[[package]] -name = "cap-time-ext" -version = "3.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b54c289326c70f1c697ebf0a31842a480932e5942b5fac92fcc46e87286b48e2" -dependencies = [ - "ambient-authority", - "cap-primitives", - "iana-time-zone", - "once_cell", - "rustix", + "windows-sys 0.61.2", "winx", ] [[package]] name = "cc" -version = "1.2.56" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" dependencies = [ "find-msvc-tools", "jobserver", @@ -238,15 +179,15 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" @@ -261,9 +202,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -271,9 +212,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -283,21 +224,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "cobs" @@ -305,39 +246,38 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.21", ] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "console" -version = "0.16.2" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +checksum = "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" dependencies = [ "encode_unicode", "libc", - "once_cell", "unicode-width", "windows-sys 0.61.2", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "core_detect" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" [[package]] name = "cpp_demangle" -version = "0.4.5" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" dependencies = [ "cfg-if", ] @@ -362,27 +302,27 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aadfd45214f09461ba0406f7dacecce5cac39bf0bdb4890eeb468f4ef090e07" +checksum = "658e8623bea025d142fb11c299b8c6572ffe9fd663b52887c4dc124735cc130b" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57069faede9bd1f926364b4cf69ccc9bebc6f4af5ab897083581b7bc991bf20a" +checksum = "a4b12b8c55c31c3d8598c2de9a657c3b978f905f6886c43e02216e0b15fe45a3" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1221450f2f9efaa996d916bf53a0a4d13346a4a75468afb828390209a4fdd4" +checksum = "894b984f82c5a36f05fdd4973fbf4d37d69cd5cdf8c16e8ffe3af4a9cdfe193c" dependencies = [ "cranelift-entity", "wasmtime-internal-core", @@ -390,9 +330,9 @@ dependencies = [ [[package]] name = "cranelift-bitset" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97706f2b466d67bdf0f69d1cf5c5c4a5cd31087cf1fa2e8e5fe0450dddc8661d" +checksum = "3a1e4c34abe94193ada09f821f474be87ac8a1fbbacd87058571ef04c1bf4009" dependencies = [ "serde", "serde_derive", @@ -401,9 +341,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "432246ee44b2fc0140b412dca55801d200d6fb25d2d7d18c44bb29e8cd71268b" +checksum = "63826cef0bf70e61d56cc930aa4ee423638f66dc3cfc10d683e73138a6d177b8" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -432,9 +372,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa51eff0949f06a5c8f3d5adefef94a12ea99f71cd8985047b91d45f367150" +checksum = "26de7849112293681a19f7525c689e1d73dc6eb2687355170fb7458c4da8d353" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -445,24 +385,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6095e7095930b6169490138b4262fe7ec24290d3f604d7fe62e1e3138e740daa" +checksum = "df315a8b1cfd6e620971e3d4249bd2c4528167717e8f48a6317a87c55891bcb8" [[package]] name = "cranelift-control" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e61dfa0766c0eadf42b3febd145a35f81f31086e207f534e5fb406fc3d08fc47" +checksum = "2c3fff7610fb17f228f16598e1a044db79a12806ece7496ff2c69cf1a27a79a5" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93867a79a06dd5d9ffeb96f7563dc7b6b142b5d89e42ab77e458a408a8aa9d5" +checksum = "6158b1ac381792ad11e670abbcd15db8b1737e84bfa8a7f2bd7eb41388a92530" dependencies = [ "cranelift-bitset", "serde", @@ -472,9 +412,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1991dc32fefa54f14d2a63570d1e963826257605e478558733f83450b7e7661" +checksum = "099361a0919067086dcde624a281ce719834cebf8544d6c24646f5e924107234" dependencies = [ "cranelift-codegen", "hashbrown 0.17.1", @@ -485,15 +425,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784546de9988ff6e1df0fd4d2450760469a7607344156c661e69ec28082c5da4" +checksum = "2a2f30ea3fd5a11f7d3473976d3b62b5b3f2b62fa943c85e0331d88bf505082c" [[package]] name = "cranelift-native" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7107a4ae4a2ba48b5df8648365e638b08322fa1da11e86206bf5eddb862b21dd" +checksum = "397508a8d817dc74019603ac5a4c4e40b4df627e5aed4f2f8088345d4c01d401" dependencies = [ "cranelift-codegen", "libc", @@ -502,24 +442,24 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.133.3" +version = "0.136.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b3f161aa81ee5dd8d7b0eb8828988f57baf2f78d288e62b6b3714b37aa6d6a1" +checksum = "b4944ef05513e1c1a85a945cf8f29d95ddea8bcbb19e0bfd4e71063450967420" [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -527,18 +467,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crypto-common" @@ -643,20 +583,20 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] name = "either" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "embedded-io" @@ -678,11 +618,16 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" dependencies = [ "cfg-if", + "core_detect", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", ] [[package]] @@ -703,15 +648,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "fixedbitset" @@ -725,12 +670,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "foldhash" version = "0.2.0" @@ -752,16 +691,16 @@ version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ - "io-lifetimes", + "io-lifetimes 2.0.4", "rustix", "windows-sys 0.59.0", ] [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -773,9 +712,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -783,33 +722,33 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -864,22 +803,20 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "rand_core", - "wasip2", - "wasip3", ] [[package]] @@ -894,15 +831,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - [[package]] name = "hashbrown" version = "0.16.1" @@ -915,7 +843,7 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ - "foldhash 0.2.0", + "foldhash", "serde", "serde_core", ] @@ -926,38 +854,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -965,9 +870,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -978,9 +883,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -992,16 +897,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -1012,15 +918,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", @@ -1050,9 +956,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1072,12 +978,12 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.18.4" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" +checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" dependencies = [ - "io-lifetimes", - "windows-sys 0.59.0", + "io-lifetimes 3.0.1", + "windows-sys 0.60.2", ] [[package]] @@ -1086,11 +992,17 @@ version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" +[[package]] +name = "io-lifetimes" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96" + [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" [[package]] name = "is_terminal_polyfill" @@ -1109,9 +1021,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "ittapi" @@ -1135,35 +1047,36 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "leb128" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" [[package]] name = "leb128fmt" @@ -1189,11 +1102,10 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ - "bitflags", "libc", ] @@ -1205,15 +1117,15 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "log" -version = "0.4.29" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "logos" @@ -1236,7 +1148,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1262,15 +1174,15 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memfd" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +checksum = "57804b2c9b69967f1536a56f86297e367a33b19e98852ed624b84551cdbc0d90" dependencies = [ "rustix", ] @@ -1286,11 +1198,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "nix" -version = "0.31.2" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ "bitflags", "cfg-if", @@ -1315,9 +1233,9 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "object" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" dependencies = [ "crc32fast", "hashbrown 0.17.1", @@ -1327,9 +1245,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1361,9 +1279,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "postcard" @@ -1379,9 +1297,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -1393,7 +1311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1408,9 +1326,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -1427,22 +1345,22 @@ dependencies = [ "prettyplease 0.2.37", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "tempfile", "trace", "wasmtime", "wasmtime-wasi", - "wit-bindgen-core 0.62.0", - "wit-bindgen-rust 0.62.0", + "wit-bindgen-core", + "wit-bindgen-rust", "wit-component 0.261.0", "wit-parser 0.261.0", ] [[package]] name = "pulley-interpreter" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f647f8aefd39efd5e38b484a8b7a926dd035ae366127df75c1d94d196f0a4ba" +checksum = "1b66b7448cb92d709f2924de98b5ba5b5ce4ea08e6d6b9c3b403fcd88d122ca2" dependencies = [ "cranelift-bitset", "log", @@ -1452,20 +1370,20 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e902032e329008b189b67498b1be7784d5849276f32402eca17441df08a6bcb" +checksum = "185b9b4cd91f85110f48f8c0314757dfb2bb48c40f5d91055ea666cbbcbf317b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "quote" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1476,6 +1394,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.10.3" @@ -1483,7 +1407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ "chacha20", - "getrandom 0.4.1", + "getrandom 0.4.3", "rand_core", ] @@ -1495,9 +1419,9 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -1551,27 +1475,27 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustc-demangle" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", @@ -1592,15 +1516,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -1608,9 +1538,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -1618,29 +1548,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -1651,9 +1581,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -1677,9 +1607,15 @@ checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" @@ -1689,9 +1625,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" dependencies = [ "serde", ] @@ -1720,9 +1656,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1742,13 +1678,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] @@ -1764,7 +1700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -1790,11 +1726,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.21", ] [[package]] @@ -1805,25 +1741,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -1845,9 +1781,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.12+spec-1.1.0" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", "serde_core", @@ -1860,27 +1796,27 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "trace" @@ -1909,7 +1845,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1923,15 +1859,15 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-width" @@ -1939,12 +1875,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "url" version = "2.5.8" @@ -1971,9 +1901,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" dependencies = [ "js-sys", "wasm-bindgen", @@ -1993,27 +1923,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen 0.51.0", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen 0.57.1", ] [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -2024,9 +1945,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2034,31 +1955,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-compose" -version = "0.251.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089037d7eb453ed57b560fe7833de0707411c8b9fdc429745ced77e2a1bacb9" +checksum = "27dc71f96d21a8b9153da9005c603f4f20d5781b7e6d2675ea0ca5def8713b75" dependencies = [ "anyhow", "heck", @@ -2066,29 +1987,19 @@ dependencies = [ "log", "petgraph", "smallvec", - "wasm-encoder 0.251.0", - "wasmparser 0.251.0", + "wasm-encoder 0.258.3", + "wasmparser 0.258.3", "wat", ] [[package]] name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser 0.244.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.251.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a879a421bd17c528b74721b2abf4c62e8f1d1889c2ba8c3c50d02deaf2ce395" +checksum = "f64765e43c000fae008a48db8b288e175e237fc9ce20a26586836878c1bee89f" dependencies = [ "leb128fmt", - "wasmparser 0.251.0", + "wasmparser 0.258.3", ] [[package]] @@ -2113,14 +2024,14 @@ dependencies = [ [[package]] name = "wasm-metadata" -version = "0.244.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +checksum = "47e10808eb27efde692f1b1706089fe19296728bf872291f5b4e0d50fba88f2f" dependencies = [ "anyhow", "indexmap", - "wasm-encoder 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder 0.258.3", + "wasmparser 0.258.3", ] [[package]] @@ -2154,38 +2065,26 @@ source = "git+https://github.com/chenyan2002/wasm-tools.git?branch=extend-wave#e dependencies = [ "indexmap", "logos", - "thiserror 2.0.18", + "thiserror 2.0.21", ] [[package]] name = "wasm-wave" -version = "0.251.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a25d67bb8d8b9913f2fad9f31b2354b43f4cf23bbd6913e21734ed5170e9a9" +checksum = "95f32f2123fc8790a3796a3648aaab8628daca0363826dce1c03bcc3a3553456" dependencies = [ "anyhow", "logos", - "thiserror 2.0.18", - "wit-parser 0.251.0", + "thiserror 2.0.21", + "wit-parser 0.258.3", ] [[package]] name = "wasmparser" -version = "0.244.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - -[[package]] -name = "wasmparser" -version = "0.251.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437970b35b1a85cfde9c74b2398352d8d653f3bd8e3a3db0c063ea8f5b4b36ff" +checksum = "fe9269dd817e0e7021bf534ccd9761bc2d64778b6708e41228b8439d75eaa0b1" dependencies = [ "bitflags", "hashbrown 0.17.1", @@ -2220,27 +2119,27 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.251.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8798c1a699bd25648b6708eefe94d97c6f9891febb94b42cca1f7a4b086ea64e" +checksum = "14a457ba8670a3db3d357c1aeac3ed4fe378a76054a221789f0df0ea507e292b" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.251.0", + "wasmparser 0.258.3", ] [[package]] name = "wasmtime" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39226663bd765601279a79b88645a7c4a4d3c2fe73040afdc27bead02ee6659" +checksum = "1801b9c9f91e16e352ed77656824e7c4556a7538dbfc1a50b37243f0e12ea045" dependencies = [ "addr2line", "async-trait", "bitflags", "bumpalo", + "bytes", "cc", - "cfg-if", "encoding_rs", "futures", "fxprof-processed-profile", @@ -2264,9 +2163,9 @@ dependencies = [ "target-lexicon", "tempfile", "wasm-compose", - "wasm-encoder 0.251.0", - "wasm-wave 0.251.0", - "wasmparser 0.251.0", + "wasm-encoder 0.258.3", + "wasm-wave 0.258.3", + "wasmparser 0.258.3", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -2280,14 +2179,14 @@ dependencies = [ "wasmtime-internal-versioned-export-macros", "wat", "windows-sys 0.61.2", - "wit-parser 0.251.0", + "wit-parser 0.258.3", ] [[package]] name = "wasmtime-environ" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2595a168541e8a7faeacf21e3d59da93628ee71468cd69fee9fc2a92c9b1c7d8" +checksum = "f397969b8daf208e45120036be74956e99364ce916d5b5d67f9e9f0fe40e5477" dependencies = [ "anyhow", "cpp_demangle", @@ -2307,8 +2206,8 @@ dependencies = [ "sha2", "smallvec", "target-lexicon", - "wasm-encoder 0.251.0", - "wasmparser 0.251.0", + "wasm-encoder 0.258.3", + "wasmparser 0.258.3", "wasmprinter", "wasmtime-internal-component-util", "wasmtime-internal-core", @@ -2316,9 +2215,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-cache" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37d629957320219db11336663e0947e19afe77150403509cac21c47ead60c69" +checksum = "fdf564a08f96acec55a335e3185d1df98ba3feee47e178f5bc2429e723d30d0f" dependencies = [ "base64", "directories-next", @@ -2336,30 +2235,30 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-macro" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9abf0fb4ce458eb6edbfaf6cbf13fcbf4216eac5a85febfe90224a1f6064c990" +checksum = "f47c428b868b59d51a9f77e24bff02cc321f8ec0faeba5c40f7e4c1cddd43a64" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.251.0", + "wit-parser 0.258.3", ] [[package]] name = "wasmtime-internal-component-util" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50df18c9a8e0deec353ad1e6364ef50538231719a12d80fa5dcb300be8d36b" +checksum = "97fe14bd5ea6444a09f6baa3865559c93c91158930e7fe6d127429a9372f6165" [[package]] name = "wasmtime-internal-core" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b097389e5fad89c8ff8ee0aeafd16447b5a288d52aa1131f17ab4c19fd5be3" +checksum = "2053fd1d90080e502ca4ea39d86c3528587a40220b9572a874c8b742c219a00c" dependencies = [ "anyhow", "hashbrown 0.17.1", @@ -2369,11 +2268,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-cranelift" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08b3e909115836655b83c8bdef7c2e20a34293e785218d9f71a4e5382a09c6b0" +checksum = "15e96d6c55401e68e40e3f74078ec96f92fe9b8a7e90e885fb87265e69eea559" dependencies = [ - "cfg-if", "cranelift-codegen", "cranelift-control", "cranelift-entity", @@ -2386,8 +2284,8 @@ dependencies = [ "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror 2.0.18", - "wasmparser 0.251.0", + "thiserror 2.0.21", + "wasmparser 0.258.3", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -2396,12 +2294,11 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a000d1124dd40417ce8433d07de1063ecc9be7cac21745c8de7f9cf7684c3ead" +checksum = "1b913875bab1b78fada489e55d5e0a10b53286fb4bb09f5657212f549c9af36c" dependencies = [ "cc", - "cfg-if", "libc", "rustix", "wasmtime-environ", @@ -2411,9 +2308,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7439956e78ba68e2cd766f34c3f056d625fad9a055eafb0c4569ac91c09e6b4" +checksum = "0356a1a09dee1239904e09e962456d9f6edfa5da61c5e3e1b0e4669710f48fba" dependencies = [ "cc", "object", @@ -2423,11 +2320,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3a381a9dd1ffe3893507733300b420605f465655d78c7a75a965a09d7b43d5" +checksum = "5dead9a2d7b5d835698a2e1a32006e7d0b5711f4697b24bab1564bb2488e3d7a" dependencies = [ - "cfg-if", "libc", "wasmtime-internal-core", "windows-sys 0.61.2", @@ -2435,11 +2331,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-unwinder" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f951f78a1a09001547838fa557522d56655385db97e47307d0f582ca866974" +checksum = "69ffac8fc893de2958b263d9d7274cf4c531ba9ff582558348d4e28d97b8a0f2" dependencies = [ - "cfg-if", "cranelift-codegen", "log", "object", @@ -2448,48 +2343,44 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e06f9fabbe647e5c2ed186e6920ab1fb48174688d7d3fdadbda537b8499b51" +checksum = "9a20f0dcb6c6a006363d3f85b5c633675730487b0dc23726b2d40495872407fb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "wasmtime-internal-wit-bindgen" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49ac5121036c2255bdc203b1b75a1c04544744cd5f51c93240b58bddca9f0f1" +checksum = "80758f73f5f5daacd8a6d1a8513336a4f9a58d26c4f1c73eb80502cb143e2626" dependencies = [ "anyhow", "bitflags", "heck", "indexmap", - "wit-parser 0.251.0", + "wit-component 0.258.3", + "wit-parser 0.258.3", ] [[package]] name = "wasmtime-wasi" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23668f18d6fd0a932c1fc58600bbb8a2e4f9b217f08bb61841e2c275d4ce3" +checksum = "bac947c8478d8ea84ef4120d04f984012a514e493fe16fa5bb72906d7e55addb" dependencies = [ "async-trait", "bitflags", "bytes", - "cap-fs-ext", - "cap-net-ext", - "cap-std", - "cap-time-ext", - "cfg-if", + "cap-primitives", "futures", - "io-extras", - "io-lifetimes", "rand", "rustix", - "thiserror 2.0.18", + "rustix-linux-procfs", + "thiserror 2.0.21", "tokio", "tracing", "url", @@ -2497,13 +2388,14 @@ dependencies = [ "wasmtime-wasi-io", "wiggle", "windows-sys 0.61.2", + "winx", ] [[package]] name = "wasmtime-wasi-io" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df5ffcd5aca96285be7745d4677ca5e2851245ca7c066a98c0fbee5bc6375f1" +checksum = "e65d70efbe70631acbb4c6cf46eea543c75908f01e2fd09550e5a89631693304" dependencies = [ "async-trait", "bytes", @@ -2545,12 +2437,12 @@ dependencies = [ [[package]] name = "wiggle" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77deefc2b0fe8c258316372ec322da627ce8c5b5ea9eec3b001190e9f8f2f69" +checksum = "7f7c3a2e8ec4789bb82e4bf04b0dba44b02ce05beba6cbc6eb992b8f0b93c9cd" dependencies = [ "bitflags", - "thiserror 2.0.18", + "thiserror 2.0.21", "tracing", "wasmtime", "wasmtime-environ", @@ -2559,27 +2451,27 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a52145d29793eb1e0c5be9b6be5a74552b9236f01866c769ec1c3270584085f" +checksum = "761bf518bf5972dd0ddb8c3c693b6a52ed826e25d10bfae89b1368327c86030d" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasmtime-environ", "witx", ] [[package]] name = "wiggle-macro" -version = "46.0.3" +version = "49.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26242c5c54d0f2837e1fecc933e1581e45d39cde1b1f6b3ad72955e0851ec20" +checksum = "0bdaa435787bc4bb662020aea37538745fc60b4629d7f37864a09195cec0e1eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wiggle-generate", ] @@ -2614,41 +2506,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "windows-link" version = "0.2.1" @@ -2656,30 +2513,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-link", + "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets", + "windows-targets 0.53.5", ] [[package]] @@ -2697,14 +2545,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2713,53 +2578,101 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] name = "winx" @@ -2773,12 +2686,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.51.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro 0.51.0", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "wit-bindgen" @@ -2787,18 +2697,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53cb4b5556c3a791e86838ea287782bdafa704d55b0e68b5b81a3a16b9ea5f4b" dependencies = [ "bitflags", - "wit-bindgen-rust-macro 0.62.0", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser 0.244.0", + "wit-bindgen-rust-macro", ] [[package]] @@ -2812,22 +2711,6 @@ dependencies = [ "wit-parser 0.259.0", ] -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease 0.2.37", - "syn 2.0.117", - "wasm-metadata 0.244.0", - "wit-bindgen-core 0.51.0", - "wit-component 0.244.0", -] - [[package]] name = "wit-bindgen-rust" version = "0.62.0" @@ -2840,25 +2723,10 @@ dependencies = [ "prettyplease 0.3.0", "syn 3.0.6", "wasm-metadata 0.259.0", - "wit-bindgen-core 0.62.0", + "wit-bindgen-core", "wit-component 0.259.0", ] -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease 0.2.37", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core 0.51.0", - "wit-bindgen-rust 0.51.0", -] - [[package]] name = "wit-bindgen-rust-macro" version = "0.62.0" @@ -2870,15 +2738,15 @@ dependencies = [ "proc-macro2", "quote", "syn 3.0.6", - "wit-bindgen-core 0.62.0", - "wit-bindgen-rust 0.62.0", + "wit-bindgen-core", + "wit-bindgen-rust", ] [[package]] name = "wit-component" -version = "0.244.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +checksum = "f0fca88950af0c1f42bc77e17315e48798b8d68340171b6d204f62bc19a878a6" dependencies = [ "anyhow", "bitflags", @@ -2887,10 +2755,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder 0.244.0", - "wasm-metadata 0.244.0", - "wasmparser 0.244.0", - "wit-parser 0.244.0", + "wasm-encoder 0.258.3", + "wasm-metadata 0.258.3", + "wasmparser 0.258.3", + "wit-parser 0.258.3", ] [[package]] @@ -2933,27 +2801,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.244.0" +version = "0.258.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.244.0", -] - -[[package]] -name = "wit-parser" -version = "0.251.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e960732e824fab95099971a09e638979347c94ca48568d3c854c945729196947" +checksum = "72a2127663dcf3ee16614fb0e3c33d5c6c66fec9dad317a8b0fdd3869487a533" dependencies = [ "anyhow", "hashbrown 0.17.1", @@ -2964,8 +2814,8 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "unicode-xid", - "wasmparser 0.251.0", + "unicode-ident", + "wasmparser 0.258.3", ] [[package]] @@ -3020,15 +2870,15 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3037,42 +2887,42 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", "synstructure", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", "synstructure", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -3081,9 +2931,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -3092,20 +2942,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" @@ -3118,18 +2968,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 4327eb8..c76125f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,8 @@ wit-bindgen-rust = "0.62.0" wit-component = "0.261.0" wit-parser = "0.261.0" -wasmtime = { version = "46.0.0", features = ["wave"], optional = true } -wasmtime-wasi = { version = "46.0.0", optional = true } +wasmtime = { version = "49.0.2", features = ["wave"], optional = true } +wasmtime-wasi = { version = "49.0.2", optional = true } dialog = { path = "crates/dialog", optional = true } ctrlc = "3.5.2"