From 5734d98437b1d253d520389c62fa87b46ba9adf3 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 24 Mar 2025 14:18:17 -0500 Subject: [PATCH 1/5] Don't re-raise as RuntimeException We expect exceptions from catString, so just re-raise directly. This caused the ugly internal RuntimeException trace in ruby/rake#619. This does not fix that issue, but it properly lets the original Ruby exception propagate. --- ext/java/org/jruby/ext/stringio/StringIO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/java/org/jruby/ext/stringio/StringIO.java b/ext/java/org/jruby/ext/stringio/StringIO.java index 2eb0588..0179661 100644 --- a/ext/java/org/jruby/ext/stringio/StringIO.java +++ b/ext/java/org/jruby/ext/stringio/StringIO.java @@ -1662,7 +1662,7 @@ private static void catString(RubyString myString, RubyString str) { try { RubyString unused = (RubyString) CAT_WITH_CODE_RANGE.invokeExact(myString, str); } catch (Throwable t) { - throw new RuntimeException(t); + Helpers.throwException(t); } } From c3c4e0580e12da1b884e8c201c242249339936ea Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 24 Mar 2025 14:19:47 -0500 Subject: [PATCH 2/5] Re-get the string encoding after conversion --- ext/java/org/jruby/ext/stringio/StringIO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/java/org/jruby/ext/stringio/StringIO.java b/ext/java/org/jruby/ext/stringio/StringIO.java index 0179661..83bd60f 100644 --- a/ext/java/org/jruby/ext/stringio/StringIO.java +++ b/ext/java/org/jruby/ext/stringio/StringIO.java @@ -1696,13 +1696,14 @@ private long stringIOWrite(ThreadContext context, Ruby runtime, IRubyObject arg) try { final Encoding enc = getEncoding(); if (enc == null) return 0; - final Encoding encStr = str.getEncoding(); + Encoding encStr = str.getEncoding(); if (enc != encStr && enc != ASCIIEncoding.INSTANCE && enc != USASCIIEncoding.INSTANCE) { RubyString converted = EncodingUtils.strConvEnc(context, str, encStr, enc); if (converted == str && encStr != ASCIIEncoding.INSTANCE && encStr != USASCIIEncoding.INSTANCE) { /* conversion failed */ rb_enc_check(context, enc, str); } str = converted; + encStr = str.getEncoding(); } final ByteList strByteList = str.getByteList(); len = str.size(); From f63359bfbbbbb3429ca7e6211b41ba712f751278 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 24 Mar 2025 14:31:23 -0500 Subject: [PATCH 3/5] Set up Java 21 for jruby-head builds These builds compile the extension, so they need to also have the command line `javac` be Java 21 when building against JRuby 10. --- .github/workflows/ubuntu.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 75af42a..d320513 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -29,6 +29,12 @@ jobs: git config --global core.eol lf git config --global advice.detachedHead 0 - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + if: >- + matrix.ruby == 'jruby-head' - name: Set up Ruby uses: ruby/setup-ruby@v1 with: From e99bdde7cbf85f6c0f7ad80afa4a45915d0e7c2b Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 24 Mar 2025 14:39:40 -0500 Subject: [PATCH 4/5] Fix null StringIO modifiable check See ruby/stringio@eb4ee4921867c06baf3b7cee95119570953821bb --- ext/java/org/jruby/ext/stringio/StringIO.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/java/org/jruby/ext/stringio/StringIO.java b/ext/java/org/jruby/ext/stringio/StringIO.java index 83bd60f..e30be62 100644 --- a/ext/java/org/jruby/ext/stringio/StringIO.java +++ b/ext/java/org/jruby/ext/stringio/StringIO.java @@ -2201,8 +2201,13 @@ private void checkWritable() { } private void checkModifiable() { - checkFrozen(); - if (getPtr().string.isFrozen()) throw getRuntime().newIOError("not modifiable string"); + if (getPtr().string == null || getPtr().string.isNil()) { + /* Null device StringIO */ + } else if (getPtr().string.isFrozen()) { + throw getRuntime().newIOError("not modifiable string"); + } else { + getPtr().string.modify(); + } } private void checkInitialized() { From 667fee83a0dab23565eae7fafae8259d50bf829d Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 24 Mar 2025 14:43:52 -0500 Subject: [PATCH 5/5] Also setup Java 21 for Windows jruby-head build --- .github/workflows/windows.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 5b3d117..85382fb 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -30,6 +30,12 @@ jobs: git config --global core.eol lf git config --global advice.detachedHead 0 - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + if: >- + matrix.ruby == 'jruby-head' - name: Set up Ruby uses: ruby/setup-ruby@v1 with: