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: 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: diff --git a/ext/java/org/jruby/ext/stringio/StringIO.java b/ext/java/org/jruby/ext/stringio/StringIO.java index 2eb0588..e30be62 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); } } @@ -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(); @@ -2200,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() {