Skip to content

Commit 40c6681

Browse files
Ruby 4.0 support (#559)
* Stop locking frozen strings Locking a frozen string now raises an exception: https://bugs.ruby-lang.org/issues/20998 Locking should not be necessary: we know for a fact a frozen string can't be modified, so let's just not lock. * Use Ruby 4.0 for all workflows * Adapt Ractor spec for Ruby 4.0 * Ruby 4.0 support --------- Co-authored-by: Jimmy Bourassa <jbourassa@gmail.com>
1 parent 4bd1637 commit 40c6681

9 files changed

Lines changed: 55 additions & 39 deletions

File tree

.github/workflows/build-docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626

2727
- uses: oxidize-rb/actions/setup-ruby-and-rust@v1
2828
with:
29-
ruby-version: "3.4"
29+
ruby-version: "4.0"
3030
rustup-toolchain: "${{ env.NIGHTLY_VERSION }}"
3131
bundler-cache: true
3232
cargo-cache: true

.github/workflows/build-gems.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242

4343
- uses: ruby/setup-ruby@v1
4444
with:
45-
ruby-version: "3.4"
45+
ruby-version: "4.0"
4646

4747
- uses: oxidize-rb/actions/cross-gem@v1
4848
id: cross-gem
@@ -66,7 +66,7 @@ jobs:
6666
strategy:
6767
matrix:
6868
os: ["ubuntu-latest"]
69-
ruby: ["3.4"]
69+
ruby: ["4.0"]
7070
steps:
7171
- uses: actions/checkout@v6
7272

.github/workflows/memcheck.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ on:
77
ruby-version:
88
description: "Ruby version to memcheck"
99
required: true
10-
default: "3.4"
10+
default: "4.0"
1111
type: choice
1212
options:
1313
- "head"
14+
- "4.0"
1415
- "3.4"
1516
- "3.3"
1617
- "3.2"
@@ -38,7 +39,7 @@ jobs:
3839

3940
- uses: oxidize-rb/actions/setup-ruby-and-rust@v1
4041
with:
41-
ruby-version: ${{ inputs.ruby-version || '3.4' }}
42+
ruby-version: ${{ inputs.ruby-version || '4.0' }}
4243
bundler-cache: true
4344
cargo-cache: true
4445
cache-version: v2

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242

4343
- uses: ruby/setup-ruby@v1
4444
with:
45-
ruby-version: "3.4"
45+
ruby-version: "4.0"
4646

4747
- uses: oxidize-rb/actions/cross-gem@v1
4848
id: cross-gem
@@ -73,7 +73,7 @@ jobs:
7373

7474
- uses: oxidize-rb/actions/setup-ruby-and-rust@v1
7575
with:
76-
ruby-version: "3.4"
76+
ruby-version: "4.0"
7777
bundler-cache: true
7878
cargo-cache: true
7979
cache-version: v1

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gemfile.lock

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ PATH
22
remote: .
33
specs:
44
wasmtime (39.0.1)
5-
rb_sys (~> 0.9.119)
5+
rb_sys (~> 0.9.124)
66

77
GEM
88
remote: https://rubygems.org/
@@ -11,17 +11,17 @@ GEM
1111
benchmark-ips (2.14.0)
1212
bigdecimal (3.1.9)
1313
diff-lcs (1.6.2)
14-
ffi (1.17.1)
15-
ffi (1.17.1-aarch64-linux-gnu)
16-
ffi (1.17.1-aarch64-linux-musl)
17-
ffi (1.17.1-arm-linux-gnu)
18-
ffi (1.17.1-arm-linux-musl)
19-
ffi (1.17.1-arm64-darwin)
20-
ffi (1.17.1-x86-linux-gnu)
21-
ffi (1.17.1-x86-linux-musl)
22-
ffi (1.17.1-x86_64-darwin)
23-
ffi (1.17.1-x86_64-linux-gnu)
24-
ffi (1.17.1-x86_64-linux-musl)
14+
ffi (1.17.3)
15+
ffi (1.17.3-aarch64-linux-gnu)
16+
ffi (1.17.3-aarch64-linux-musl)
17+
ffi (1.17.3-arm-linux-gnu)
18+
ffi (1.17.3-arm-linux-musl)
19+
ffi (1.17.3-arm64-darwin)
20+
ffi (1.17.3-x86-linux-gnu)
21+
ffi (1.17.3-x86-linux-musl)
22+
ffi (1.17.3-x86_64-darwin)
23+
ffi (1.17.3-x86_64-linux-gnu)
24+
ffi (1.17.3-x86_64-linux-musl)
2525
fiddle (1.1.8)
2626
get_process_mem (1.0.0)
2727
bigdecimal (>= 2.0)
@@ -40,9 +40,9 @@ GEM
4040
rake (13.3.1)
4141
rake-compiler (1.3.0)
4242
rake
43-
rake-compiler-dock (1.10.0)
44-
rb_sys (0.9.119)
45-
rake-compiler-dock (= 1.10.0)
43+
rake-compiler-dock (1.11.0)
44+
rb_sys (0.9.124)
45+
rake-compiler-dock (= 1.11.0)
4646
regexp_parser (2.11.3)
4747
rspec (3.13.2)
4848
rspec-core (~> 3.13.0)
@@ -92,7 +92,7 @@ GEM
9292
prettier_print (>= 1.2.0)
9393
unicode-display_width (3.2.0)
9494
unicode-emoji (~> 4.1)
95-
unicode-emoji (4.1.0)
95+
unicode-emoji (4.2.0)
9696
yard (0.9.37)
9797
yard-rustdoc (0.4.2)
9898
syntax_tree (~> 6.0)

ext/src/helpers/tmplock.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use magnus::{
22
rb_sys::{protect, AsRawValue},
3+
value::ReprValue,
34
RString,
45
};
56

67
pub trait Tmplock {
7-
fn as_locked_slice(&self) -> Result<(&[u8], TmplockGuard), magnus::Error>;
8-
fn as_locked_str(&self) -> Result<(&str, TmplockGuard), magnus::Error>;
8+
fn as_locked_slice(&self) -> Result<(&[u8], Option<TmplockGuard>), magnus::Error>;
9+
fn as_locked_str(&self) -> Result<(&str, Option<TmplockGuard>), magnus::Error>;
910
}
1011

1112
#[derive(Debug)]
@@ -25,20 +26,28 @@ impl Drop for TmplockGuard {
2526
}
2627

2728
impl Tmplock for RString {
28-
fn as_locked_slice(&self) -> Result<(&[u8], TmplockGuard), magnus::Error> {
29+
fn as_locked_slice(&self) -> Result<(&[u8], Option<TmplockGuard>), magnus::Error> {
2930
let raw = self.as_raw();
3031
let slice = unsafe { self.as_slice() };
31-
let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?;
32-
let guard = TmplockGuard { raw };
32+
let guard = if self.is_frozen() {
33+
None
34+
} else {
35+
let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?;
36+
Some(TmplockGuard { raw })
37+
};
3338

3439
Ok((slice, guard))
3540
}
3641

37-
fn as_locked_str(&self) -> Result<(&str, TmplockGuard), magnus::Error> {
42+
fn as_locked_str(&self) -> Result<(&str, Option<TmplockGuard>), magnus::Error> {
3843
let str_result = unsafe { self.as_str()? };
39-
let raw = self.as_raw();
40-
let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?;
41-
let guard = TmplockGuard { raw };
44+
let guard = if self.is_frozen() {
45+
None
46+
} else {
47+
let raw = self.as_raw();
48+
let raw = protect(|| unsafe { rb_sys::rb_str_locktmp(raw) })?;
49+
Some(TmplockGuard { raw })
50+
};
4251

4352
Ok((str_result, guard))
4453
}

spec/integration/ractor_spec.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
Wasmtime::Instance.new(store, mod).invoke("hello")
2222
end
2323

24-
result = r.take
24+
result = value(r)
2525
expect(result).to eq([1, 2, 3.0, 4.0])
2626
end
2727

@@ -42,7 +42,13 @@
4242
end
4343

4444
ractors.each do |ractor|
45-
expect(ractor.take).to eq([1, 2, 3.0, 4.0])
45+
expect(value(ractor)).to eq([1, 2, 3.0, 4.0])
4646
end
4747
end
48+
49+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("4.0")
50+
def value(ractor) = ractor.value
51+
else
52+
def value(ractor) = ractor.take
53+
end
4854
end

wasmtime.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ Gem::Specification.new do |spec|
2929

3030
spec.rdoc_options += ["--exclude", "vendor"]
3131

32-
spec.add_dependency "rb_sys", "~> 0.9.119"
32+
spec.add_dependency "rb_sys", "~> 0.9.124"
3333
end

0 commit comments

Comments
 (0)