diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index cd572bbd..84a01a76 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -26,7 +26,7 @@ jobs: - uses: oxidize-rb/actions/setup-ruby-and-rust@v1 with: - ruby-version: "3.4" + ruby-version: "4.0" rustup-toolchain: "${{ env.NIGHTLY_VERSION }}" bundler-cache: true cargo-cache: true diff --git a/.github/workflows/build-gems.yml b/.github/workflows/build-gems.yml index b117a0b6..f97df94b 100644 --- a/.github/workflows/build-gems.yml +++ b/.github/workflows/build-gems.yml @@ -42,7 +42,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.4" + ruby-version: "4.0" - uses: oxidize-rb/actions/cross-gem@v1 id: cross-gem @@ -66,7 +66,7 @@ jobs: strategy: matrix: os: ["ubuntu-latest"] - ruby: ["3.4"] + ruby: ["4.0"] steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/memcheck.yml b/.github/workflows/memcheck.yml index 66c769d7..af9e6eb3 100644 --- a/.github/workflows/memcheck.yml +++ b/.github/workflows/memcheck.yml @@ -7,10 +7,11 @@ on: ruby-version: description: "Ruby version to memcheck" required: true - default: "3.4" + default: "4.0" type: choice options: - "head" + - "4.0" - "3.4" - "3.3" - "3.2" @@ -38,7 +39,7 @@ jobs: - uses: oxidize-rb/actions/setup-ruby-and-rust@v1 with: - ruby-version: ${{ inputs.ruby-version || '3.4' }} + ruby-version: ${{ inputs.ruby-version || '4.0' }} bundler-cache: true cargo-cache: true cache-version: v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e53a7c96..b5e19d40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,7 +42,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.4" + ruby-version: "4.0" - uses: oxidize-rb/actions/cross-gem@v1 id: cross-gem @@ -73,7 +73,7 @@ jobs: - uses: oxidize-rb/actions/setup-ruby-and-rust@v1 with: - ruby-version: "3.4" + ruby-version: "4.0" bundler-cache: true cargo-cache: true cache-version: v1 diff --git a/Cargo.lock b/Cargo.lock index f7725338..8c32edc6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1415,18 +1415,18 @@ dependencies = [ [[package]] name = "rb-sys" -version = "0.9.119" +version = "0.9.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4519fc8de033923105f512c504a8f27714ef38648ccc30969362194c50b2ed08" +checksum = "c85c4188462601e2aa1469def389c17228566f82ea72f137ed096f21591bc489" dependencies = [ "rb-sys-build", ] [[package]] name = "rb-sys-build" -version = "0.9.119" +version = "0.9.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0109499e06c85f56df4abad7d9c642ea8a2dd821d1d7132b4d1b69534677f3" +checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3" dependencies = [ "bindgen", "lazy_static", diff --git a/Gemfile.lock b/Gemfile.lock index 42ca8beb..4e52a07d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,7 +2,7 @@ PATH remote: . specs: wasmtime (39.0.1) - rb_sys (~> 0.9.119) + rb_sys (~> 0.9.124) GEM remote: https://rubygems.org/ @@ -11,17 +11,17 @@ GEM benchmark-ips (2.14.0) bigdecimal (3.1.9) diff-lcs (1.6.2) - ffi (1.17.1) - ffi (1.17.1-aarch64-linux-gnu) - ffi (1.17.1-aarch64-linux-musl) - ffi (1.17.1-arm-linux-gnu) - ffi (1.17.1-arm-linux-musl) - ffi (1.17.1-arm64-darwin) - ffi (1.17.1-x86-linux-gnu) - ffi (1.17.1-x86-linux-musl) - ffi (1.17.1-x86_64-darwin) - ffi (1.17.1-x86_64-linux-gnu) - ffi (1.17.1-x86_64-linux-musl) + ffi (1.17.3) + ffi (1.17.3-aarch64-linux-gnu) + ffi (1.17.3-aarch64-linux-musl) + ffi (1.17.3-arm-linux-gnu) + ffi (1.17.3-arm-linux-musl) + ffi (1.17.3-arm64-darwin) + ffi (1.17.3-x86-linux-gnu) + ffi (1.17.3-x86-linux-musl) + ffi (1.17.3-x86_64-darwin) + ffi (1.17.3-x86_64-linux-gnu) + ffi (1.17.3-x86_64-linux-musl) fiddle (1.1.8) get_process_mem (1.0.0) bigdecimal (>= 2.0) @@ -40,9 +40,9 @@ GEM rake (13.3.1) rake-compiler (1.3.0) rake - rake-compiler-dock (1.10.0) - rb_sys (0.9.119) - rake-compiler-dock (= 1.10.0) + rake-compiler-dock (1.11.0) + rb_sys (0.9.124) + rake-compiler-dock (= 1.11.0) regexp_parser (2.11.3) rspec (3.13.2) rspec-core (~> 3.13.0) @@ -92,7 +92,7 @@ GEM prettier_print (>= 1.2.0) unicode-display_width (3.2.0) unicode-emoji (~> 4.1) - unicode-emoji (4.1.0) + unicode-emoji (4.2.0) yard (0.9.37) yard-rustdoc (0.4.2) syntax_tree (~> 6.0) diff --git a/ext/src/helpers/tmplock.rs b/ext/src/helpers/tmplock.rs index 5d6a5c6f..301c959b 100644 --- a/ext/src/helpers/tmplock.rs +++ b/ext/src/helpers/tmplock.rs @@ -1,11 +1,12 @@ use magnus::{ rb_sys::{protect, AsRawValue}, + value::ReprValue, RString, }; pub trait Tmplock { - fn as_locked_slice(&self) -> Result<(&[u8], TmplockGuard), magnus::Error>; - fn as_locked_str(&self) -> Result<(&str, TmplockGuard), magnus::Error>; + fn as_locked_slice(&self) -> Result<(&[u8], Option), magnus::Error>; + fn as_locked_str(&self) -> Result<(&str, Option), magnus::Error>; } #[derive(Debug)] @@ -25,20 +26,28 @@ impl Drop for TmplockGuard { } impl Tmplock for RString { - fn as_locked_slice(&self) -> Result<(&[u8], TmplockGuard), magnus::Error> { + fn as_locked_slice(&self) -> Result<(&[u8], Option), magnus::Error> { let raw = self.as_raw(); let slice = unsafe { self.as_slice() }; - let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?; - let guard = TmplockGuard { raw }; + let guard = if self.is_frozen() { + None + } else { + let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?; + Some(TmplockGuard { raw }) + }; Ok((slice, guard)) } - fn as_locked_str(&self) -> Result<(&str, TmplockGuard), magnus::Error> { + fn as_locked_str(&self) -> Result<(&str, Option), magnus::Error> { let str_result = unsafe { self.as_str()? }; - let raw = self.as_raw(); - let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?; - let guard = TmplockGuard { raw }; + let guard = if self.is_frozen() { + None + } else { + let raw = self.as_raw(); + let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?; + Some(TmplockGuard { raw }) + }; Ok((str_result, guard)) } diff --git a/spec/integration/ractor_spec.rb b/spec/integration/ractor_spec.rb index 5ae9b5e0..e61727c6 100644 --- a/spec/integration/ractor_spec.rb +++ b/spec/integration/ractor_spec.rb @@ -21,7 +21,7 @@ Wasmtime::Instance.new(store, mod).invoke("hello") end - result = r.take + result = value(r) expect(result).to eq([1, 2, 3.0, 4.0]) end @@ -42,7 +42,13 @@ end ractors.each do |ractor| - expect(ractor.take).to eq([1, 2, 3.0, 4.0]) + expect(value(ractor)).to eq([1, 2, 3.0, 4.0]) end end + + if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("4.0") + def value(ractor) = ractor.value + else + def value(ractor) = ractor.take + end end diff --git a/wasmtime.gemspec b/wasmtime.gemspec index 60336019..28b4b9bb 100644 --- a/wasmtime.gemspec +++ b/wasmtime.gemspec @@ -29,5 +29,5 @@ Gem::Specification.new do |spec| spec.rdoc_options += ["--exclude", "vendor"] - spec.add_dependency "rb_sys", "~> 0.9.119" + spec.add_dependency "rb_sys", "~> 0.9.124" end