diff --git a/Cargo.lock b/Cargo.lock index e90b01f85..9f71988a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -1037,9 +1037,9 @@ dependencies = [ [[package]] name = "magnus" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d87ae53030f3a22e83879e666cb94e58a7bdf31706878a0ba48752994146dab" +checksum = "3b36a5b126bbe97eb0d02d07acfeb327036c6319fd816139a49824a83b7f9012" dependencies = [ "bytes", "magnus-macros", @@ -1050,9 +1050,9 @@ dependencies = [ [[package]] name = "magnus-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3" +checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892" dependencies = [ "proc-macro2", "quote", @@ -1269,18 +1269,18 @@ dependencies = [ [[package]] name = "rb-sys" -version = "0.9.108" +version = "0.9.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e955384e1a4dc64b71d1e4b39ed0edbd77c7bde4a10dfd5ad208e1160fddfa7" +checksum = "45fb1a185af97ee456f1c9e56dbe6e2e662bec4fdeaf83c4c28e0e6adfb18816" dependencies = [ "rb-sys-build", ] [[package]] name = "rb-sys-build" -version = "0.9.108" +version = "0.9.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c167c6571889b2550d6fcb315e8aa60bdb95e47e4b64793e3f65a30dc25afc85" +checksum = "a58ebd02d7a6033e6a5f6f8d150c1e9f16506039092b84a73e6bedce6d3adf41" dependencies = [ "bindgen", "lazy_static", @@ -1293,9 +1293,9 @@ dependencies = [ [[package]] name = "rb-sys-env" -version = "0.1.2" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb" +checksum = "08f8d2924cf136a1315e2b4c7460a39f62ef11ee5d522df9b2750fab55b868b6" [[package]] name = "redox_users" @@ -1841,7 +1841,7 @@ dependencies = [ "structopt", "wasm-encoder 0.212.0", "wasmparser 0.212.0", - "wizer 6.0.0 (git+https://github.com/kateinoigakukun/wizer.git?branch=katei/add-env-option-6.0.0)", + "wizer 6.0.0 (git+https://github.com/kateinoigakukun/wizer.git?branch=katei%2Fadd-env-option-6.0.0)", ] [[package]] @@ -2753,7 +2753,7 @@ dependencies = [ [[package]] name = "wizer" version = "6.0.0" -source = "git+https://github.com/kateinoigakukun/wizer.git?branch=katei/add-env-option-6.0.0#8e7158013eb3d1059504229eff834eb1f3e33949" +source = "git+https://github.com/kateinoigakukun/wizer.git?branch=katei%2Fadd-env-option-6.0.0#8e7158013eb3d1059504229eff834eb1f3e33949" dependencies = [ "anyhow", "cap-std", diff --git a/ext/ruby_wasm/Cargo.toml b/ext/ruby_wasm/Cargo.toml index 38d7ddf79..5c97a8c42 100644 --- a/ext/ruby_wasm/Cargo.toml +++ b/ext/ruby_wasm/Cargo.toml @@ -10,7 +10,7 @@ publish = false crate-type = ["cdylib"] [dependencies] -magnus = { version = "0.7.1", features = ["bytes"] } +magnus = { version = "0.8", features = ["bytes"] } bytes = "1" wizer = "6.0.0" wasi-vfs-cli = { git = "https://github.com/kateinoigakukun/wasi-vfs/", tag = "v0.5.3-p1" } diff --git a/ext/ruby_wasm/src/lib.rs b/ext/ruby_wasm/src/lib.rs index 4ccdfa883..0a154df90 100644 --- a/ext/ruby_wasm/src/lib.rs +++ b/ext/ruby_wasm/src/lib.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, env, path::PathBuf, time::SystemTime}; use magnus::{ - eval, exception, function, method, + eval, function, method, prelude::*, value::{self, InnerValue}, wrap, Error, ExceptionClass, RModule, Ruby, @@ -37,14 +37,19 @@ struct WasiVfsInner { #[wrap(class = "RubyWasmExt::WasiVfs")] struct WasiVfs(std::cell::RefCell); +/// Create a `magnus::Error` using Ruby's `StandardError`. +/// +/// Panics if called when no Ruby VM is available. +fn ruby_standard_error(message: impl Into) -> Error { + let ruby = magnus::Ruby::get().expect("Ruby VM is not available"); + Error::new(ruby.exception_standard_error(), message.into()) +} + impl WasiVfs { fn run_cli(args: Vec) -> Result<(), Error> { - wasi_vfs_cli::App::from_iter(args).execute().map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to run wasi vfs cli: {}", e), - ) - }) + wasi_vfs_cli::App::from_iter(args) + .execute() + .map_err(|e| ruby_standard_error(format!("failed to run wasi vfs cli: {}", e))) } fn new() -> Self { @@ -60,12 +65,7 @@ impl WasiVfs { fn pack(&self, wasm_bytes: bytes::Bytes) -> Result { let output_bytes = wasi_vfs_cli::pack(&wasm_bytes, self.0.borrow().map_dirs.clone()) - .map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to pack wasi vfs: {}", e), - ) - })?; + .map_err(|e| ruby_standard_error(format!("failed to pack wasi vfs: {}", e)))?; Ok(output_bytes.into()) } } @@ -83,12 +83,10 @@ impl ComponentLink { &self, body: impl FnOnce(wit_component::Linker) -> Result, ) -> Result<(), Error> { - let mut linker = self.0.take().ok_or_else(|| { - Error::new( - exception::standard_error(), - "linker is already consumed".to_string(), - ) - })?; + let mut linker = self + .0 + .take() + .ok_or_else(|| ruby_standard_error("linker is already consumed"))?; linker = body(linker)?; self.0.replace(Some(linker)); Ok(()) @@ -96,22 +94,16 @@ impl ComponentLink { fn library(&self, name: String, module: bytes::Bytes, dl_openable: bool) -> Result<(), Error> { self.linker(|linker| { - linker.library(&name, &module, dl_openable).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to link library: {}", e), - ) - }) + linker + .library(&name, &module, dl_openable) + .map_err(|e| ruby_standard_error(format!("failed to link library: {}", e))) }) } fn adapter(&self, name: String, module: bytes::Bytes) -> Result<(), Error> { self.linker(|linker| { - linker.adapter(&name, &module).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to link adapter: {}", e), - ) - }) + linker + .adapter(&name, &module) + .map_err(|e| ruby_standard_error(format!("failed to link adapter: {}", e))) }) } fn validate(&self, validate: bool) -> Result<(), Error> { @@ -128,18 +120,14 @@ impl ComponentLink { } fn encode(&self) -> Result { // Take the linker out of the cell and consume it - let linker = self.0.borrow_mut().take().ok_or_else(|| { - Error::new( - exception::standard_error(), - "linker is already consumed".to_string(), - ) - })?; - let encoded = linker.encode().map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to encode linker: {}", e), - ) - })?; + let linker = self + .0 + .borrow_mut() + .take() + .ok_or_else(|| ruby_standard_error("linker is already consumed"))?; + let encoded = linker + .encode() + .map_err(|e| ruby_standard_error(format!("failed to encode linker: {}", e)))?; Ok(encoded.into()) } } @@ -160,12 +148,10 @@ impl ComponentEncode { wit_component::ComponentEncoder, ) -> Result, ) -> Result<(), Error> { - let mut encoder = self.0.take().ok_or_else(|| { - Error::new( - exception::standard_error(), - "encoder is already consumed".to_string(), - ) - })?; + let mut encoder = self + .0 + .take() + .ok_or_else(|| ruby_standard_error("encoder is already consumed"))?; encoder = body(encoder)?; self.0.replace(Some(encoder)); Ok(()) @@ -177,23 +163,17 @@ impl ComponentEncode { fn adapter(&self, name: String, module: bytes::Bytes) -> Result<(), Error> { self.encoder(|encoder| { - encoder.adapter(&name, &module).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to encode adapter: {}", e), - ) - }) + encoder + .adapter(&name, &module) + .map_err(|e| ruby_standard_error(format!("failed to encode adapter: {}", e))) }) } fn module(&self, module: bytes::Bytes) -> Result<(), Error> { self.encoder(|encoder| { - encoder.module(&module).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to encode module: {}", e), - ) - }) + encoder + .module(&module) + .map_err(|e| ruby_standard_error(format!("failed to encode module: {}", e))) }) } @@ -207,18 +187,14 @@ impl ComponentEncode { fn encode(&self) -> Result { // Take the encoder out of the cell and consume it - let encoder = self.0.borrow_mut().take().ok_or_else(|| { - Error::new( - exception::standard_error(), - "encoder is already consumed".to_string(), - ) - })?; - let encoded = encoder.encode().map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to encode component: {}", e), - ) - })?; + let encoder = self + .0 + .borrow_mut() + .take() + .ok_or_else(|| ruby_standard_error("encoder is already consumed"))?; + let encoded = encoder + .encode() + .map_err(|e| ruby_standard_error(format!("failed to encode component: {}", e)))?; Ok(encoded.into()) } } @@ -235,12 +211,10 @@ impl WasiVirt { &self, body: impl FnOnce(&mut wasi_virt::WasiVirt) -> Result, ) -> Result { - let mut virt = self.0.take().ok_or_else(|| { - Error::new( - exception::standard_error(), - "wasi virt is already consumed".to_string(), - ) - })?; + let mut virt = self + .0 + .take() + .ok_or_else(|| ruby_standard_error("wasi virt is already consumed"))?; let result = body(&mut virt)?; self.0.replace(Some(virt)); Ok(result) @@ -269,10 +243,7 @@ impl WasiVirt { fn finish(&self) -> Result { self.virt(|virt| { let result = virt.finish().map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to generate virtualization adapter: {}", e), - ) + ruby_standard_error(format!("failed to generate virtualization adapter: {}", e)) })?; Ok(result.adapter.into()) }) @@ -282,19 +253,11 @@ impl WasiVirt { let virt_adapter = self.finish()?; let tmpdir = env::temp_dir(); let tmp_virt = tmpdir.join(format!("virt{}.wasm", timestamp())); - std::fs::write(&tmp_virt, &virt_adapter).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to write virt adapter: {}", e), - ) - })?; + std::fs::write(&tmp_virt, &virt_adapter) + .map_err(|e| ruby_standard_error(format!("failed to write virt adapter: {}", e)))?; let tmp_component = tmpdir.join(format!("component{}.wasm", timestamp())); - std::fs::write(&tmp_component, &component_bytes).map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to write component: {}", e), - ) - })?; + std::fs::write(&tmp_component, &component_bytes) + .map_err(|e| ruby_standard_error(format!("failed to write component: {}", e)))?; use wasm_compose::{composer, config}; let config = config::Config { @@ -302,12 +265,9 @@ impl WasiVirt { ..Default::default() }; let composer = composer::ComponentComposer::new(&tmp_component, &config); - let composed = composer.compose().map_err(|e| { - Error::new( - exception::standard_error(), - format!("failed to compose component: {}", e), - ) - })?; + let composed = composer + .compose() + .map_err(|e| ruby_standard_error(format!("failed to compose component: {}", e)))?; return Ok(composed.into()); fn timestamp() -> u64 { @@ -322,7 +282,7 @@ impl WasiVirt { #[magnus::init] fn init(ruby: &Ruby) -> Result<(), Error> { let module = RUBY_WASM.get_inner_with(ruby); - module.define_error("Error", exception::standard_error())?; + module.define_error("Error", ruby.exception_standard_error())?; module.define_singleton_method("preinitialize", function!(preinit, 1))?;