JRuby 10.1.3.0 Released
Thursday, November 05 2026
The JRuby community is pleased to announce the release of JRuby 10.1.3.0.
- Homepage: https://www.jruby.org/
- Download: https://www.jruby.org/download
JRuby 10.1.x targets Ruby 4.0 compatibility.
Thank you to our contributors this release, you help keep JRuby moving forward!
JRuby activity has increased over the last several months, and this release contains dozens of bug fixes and performance improvements from new contributors. This page will be updated with targeted release notes later today.
160 Issues and PRs resolved for 10.1.3.0
- #1958 Attribute loss with
#raise and several arguments
- #2515 openssl net-ssh camellia192 tests fails with jruby9k
- #3242 BigDecimal initializer does not mirror YARV behavior
- #6446 Date parse not working for strings with week number but no day number or year
- #8034 DateTime.jd ignores fractional seconds
- #9329 Wrong union-by-value argument passing in JRuby
- #9500 Fix dir for eval filenames
- #9606 Impossible to
eval with require_relative
- #9611 Missing –help strings
- #9647 upgrade jruby-openssl to 0.19.x line
- #9671 Preserve incoming callInfo when forwarding arguments
- #9676 Implement method coverage
- #9680 Using
set_temporary_name makes Class#name ignore nesting
- #9682 Fix line coverage of statements inside string interpolation and heredocs
- #9686 Merge Prism parser binding and compiler into core
- #9693 Pass unions by value with the C ABI’s register classes
- #9699 Wrong union-by-value argument passing in JRuby
- #9702 Pass unions by value with the C ABI’s register classes
- #9708 Read nonblocking when the fiber scheduler has no io_read
- #9727 Jar resources issues with IO#seek #pos or #pread
- #9733 Pass IO::WRITABLE, not FMODE_WRITABLE, to the scheduler’s io_wait
- #9734 Fiber#raise: transfer into transferred fibers instead of resuming
- #9741 Reduce cost of some runtime helper calls
- #9742 Method defined on a class stays invisible to indy call sites while another thread runs a module’s bulk invalidation
- #9743 JRuby mistakes != for a setter
- #9744 JRuby 10.0/CRuby 3.4+ compat: assignment to an outer local variable named
it inside a block seems to assume/create a block level shadow
- #9745 Use implicit defined check supported by JRuby 10.1
- #9748 Update 10.1 to latest 4.0 stdlib and tests
- #9749 Release the IO lock while a write waits through the fiber scheduler
- #9750 Yield socket pairs to a block and close them afterwards
- #9751 Implement branch coverage
- #9752 Fully read jar URL resources to make them seekable
-
#9758 [Array#-, #&, #
call #hash on elements where MRI does not]#9758
- #9759 Concurrent reads of a frozen two-item array can permanently replace its elements with
nil
- #9760 Interrupt fibers waiting through the scheduler when their IO closes
- #9761 Replace Ant in rake helpers with Ruby process launching
- #9765 Only refuse to resume fibers suspended by a transfer
- #9766 Remove the org.jruby.ant Ant tasks and the Ant build dependency
- #9768 IO#close raises Errno::EBADF after Thread#kill closed the channel underneath it
- #9769 Join threads through the Fiber Scheduler
- #9770 Match CRuby’s line coverage and branch locations
- #9782 Add @CRuby annotation linking Java code to CRuby functions
- #9786 Migrate error-prone primitive packing to a single util
- #9788 Support JDK 27
- #9790 Block on Mutex and ConditionVariable through the fiber scheduler
- #9791 Wake Queue#pop(timeout:) waiters when the queue is closed
- #9793 Parse proc call shorthand .() and ::() after a command with a do block
- #9794 SWAR and Arrays.mismatches optimizations for StringSupport.searchNonAscii, ByteList.memcmp, and ByteList.startsWIth.
- #9795 Keep coverage source positions off AST nodes when Coverage isn’t in use
- #9796 fix(string): prevent ArrayIndexOutOfBoundsException in strip on 4-byte GB18030 strings
- #9797 fix(module): clear temporary name when module assigned to constant in named parent
- #9798 [fix] preserve DateTime#jd fractional sec
- #9799 [fix] omit absent date fragments in parser
- #9800 [fix] preserve exception attributes when replacing message
- #9801 Honor AI_NUMERICHOST in Socket.getaddrinfo
- #9802 [compat] undefine BigDecimal.new
- #9803 Wait for child processes through the fiber scheduler
- #9804 Convert MRI comments to @CRuby
- #9805 Let Queue#pop and SizedQueue#push wait through the fiber scheduler
- #9806 Hand the scheduler’s io_read the caller’s part of the read buffer
- #9810 Replace deprecated Ruby#newTypeError(String) in IRRuntimeHelpers
- #9812 Use SOURCE retention for @CRuby
- #9813 Make socket “accept” methods dont block fibers (Fiber::Scheduler support)
- #9815 Fall back to normal call path for non-symbol keyword keys
- #9816 [compat] match BigDecimal float comparison (#5904)
- #9817 [compat] BigDecimal precision with trailing zeros (#3242)
- #9820 JIT emits invalid bytecode for a call with keyword arguments and a block-pass argument (VerifyError)
- #9821 Check that the JIT can compile every method and block
- #9822 JIT can’t compile a range with one string literal endpoint and one non-literal endpoint (IllegalArgumentException: value null)
- #9823 JIT emits invalid bytecode for a range literal with an Integer begin and a non-Integer literal end, such as (1..10.0)
- #9824 JIT can’t compile an operator call on self with a literal Integer or Float argument, such as self + 1 or self == 0
- #9825 JIT can’t compile
__ENCODING__ on one side of a branch (ArrayIndexOutOfBoundsException in ASM frame computation)
- #9826 JIT can’t compile a for loop body that contains a block (NullPointerException in prepareBlock)
- #9827 JIT can’t compile
when *array in a file that uses refinements (NullPointerException in invokeEQQ)
- #9829 With Java assertions on, the JIT can’t compile a block containing a case/in with more than one in clause (AssertionError: Somehow EQQ is the last instr in the scope)
- #9830 Don’t assert that an eqq is followed by another instruction
- #9831 Don’t load the context twice for ENCODING
- #9832 Pass the scope field to refined call sites for splatted when
- #9833 Push a range for every end when the begin is a Fixnum
- #9837 Read the instructions array patterns use from persisted IR
- #9838 Give string range endpoints the scope’s file name
- #9839 Check visibility of the operator in self[i] op= value
- #9840 Convert block-pass arguments in the direct keyword call path
- #9841 Give a block its parent scope when compiling a for body on its own
- #9842 Fix compiled operator calls on self with a literal argument
- #9843 Raise TypeError in system when the fiber scheduler’s process_wait returns nil
- #9846 Fix Range#include? of an empty range of single characters
- #9848 Keep file and line on compiled string range endpoints
- #9849 Binding#local_variable_get fails inside a block in a for loop
- #9850 Fix Binding#local_variable_get inside a block in a for loop
- #9851 Build literal ranges that can raise with an instruction
- #9852 Offer buffered writes to the fiber scheduler’s io_write too
- #9854 AOT-compiled array pattern raises NoMatchingPatternKeyError message for a length mismatch
- #9855 Fix local_variables at the top level and in methods
- #9856 Push the Symbol class for BuiltinClass in AOT bytecode
- #9859 Update asm to get recent security fixes
- #9861 Consider lowering JIT_MAXSIZE
- #9862 Wait for TCPSocket connects through the fiber scheduler
- #9864 Resolve host names through the fiber scheduler’s address_resolve
- #9867 Reduce default max JIT size to 500
- #9878 Keep waiting for a resumed fiber when Thread#raise is deferred
- #9884 Zlib::GzipReader#read does not accept an outbuf argument
- #9885 Only mark stdio as TTY when it is a terminal
- #9888 Module#name keeps an anonymous-rooted name after the module is assigned to a named constant
- #9890 Update Joni for expansion limits
- #9891 Give a module rooted at an anonymous module a permanent name
- #9893 Pass a module’s name on to the modules nested in it
- #9896 Cap heap buffer writes at 2MB per call
- #9897 [deps] bump jruby-openssl to 0.19.4
- #9901 Calculate a module’s name without building lists
- #9904 A runtime in a disposable class loader can’t be garbage collected after tearDown
- #9906 Fix GzipReader.read/readpartial with outbuf
- #9909 Resolve require_relative against eval filenames
- #9910 Document missing options in jruby –help
- #9911 Fix Thread#backtrace for a new thread
- #9914 Build Integer Range#to_a arrays at their final size
- #9915 Compare Fixnums and Floats by value in Array#== and #eql?
- #9916 Use the shortest round-trip digits in Float#to_s
- #9917 Compare Integer and Float search arguments directly in Array
- #9918 Select on FIFOs and devices with their own jnr-enxio selector
- #9919 Write files in full instead of capping heap writes
- #9920 Support buffer size and keepalive socket options on UNIX sockets
- #9924 Update io-console for isatty alias fix
- #9926 Make the Builtins redefinition bits catch prepends and inherited methods
- #9929 Treat not-implemented methods as undefined in method_defined? and defined?
- #9930 Fix tests excluded during the Ruby 4.0.9 test sync
- #9931 Add Socket::ResolutionError and fix TCPSocket.new timeouts and local binding
- #9932 Fix several argument and syntax bugs found in excluded MRI tests
- #9933 Raise more of CRuby’s syntax errors
- #9935 Fix IO, ARGF, Zlib and Tempfile behavior behind 19 excluded MRI tests
- #9936 Fix multibyte character literals and other String behavior behind 15 excluded MRI tests
- #9938 Treat 0 from a fiber scheduler’s io_wait as no events ready
- #9939 Keep IO::Buffer.for’s string as an external source
- #9941 Resolve every socket host through the fiber scheduler’s address_resolve
- #9943 Give CRuby’s warnings for method redefinition, visibility calls and more
- #9946 Optimize Complex and Rational literal values
- #9948 Remove SLEEP status update from Regexp matches
- #9955 Add an ASCII fast path for String#casecmp?
- #9957 Fill in a Fiber#raise backtrace in the fiber it is raised in
- #9961 Add a single-byte fast path for String#capitalize and fix :ascii case mapping
- #9964 Use the passed context for to_str checks in Array#join
- #9966 Preserve buffered socket input when writing
- #9970
Float#to_r returns an Integer for floats >= 2**52
- #9971 Return every socket type getaddrinfo(3) gives for an IP address
- #9974 Keep $~ and $_ per fiber
- #9975 Faster String#dump, #scrub and #codepoints on ASCII-heavy strings
- #9976 Raise instead of clobbering in File.rename onto a directory
- #9978 Raise a copy of a frozen exception instead of mutating it
- #9979 Fix RubyGems defaults triggering redefinition warnings
- #9982 Process::CLOCK_MONOTONIC stops while macOS sleeps, but Thread#join timeouts keep counting
- #9985 Count time asleep in CLOCK_MONOTONIC on macOS
- #9986 Mutex#synchronize can still exit with the lock held after Thread#raise / Timeout (contended path, follow-up to #8585)
- #9988 Update joni to 2.2.9
- #9992 Return a Rational from Float#to_r for floats of magnitude 2**52 or more
- #9993 Report arity -2 for Symbol#to_proc like CRuby
- #9995 Fix targeted thread events on shared monitors
- #9997 Return false from String#== for an object without respond_to?
- #9998 Treat a one-character range in tr as that character
- #9999 Signal.trap with numeric USR1 value traps SIGBUS on Linux
- #10004 Update jar-dependencies to 0.6.2
The JRuby community is pleased to announce the release of JRuby 10.1.3.0.
- Homepage: https://www.jruby.org/
- Download: https://www.jruby.org/download
JRuby 10.1.x targets Ruby 4.0 compatibility.
Thank you to our contributors this release, you help keep JRuby moving forward! JRuby activity has increased over the last several months, and this release contains dozens of bug fixes and performance improvements from new contributors. This page will be updated with targeted release notes later today.
160 Issues and PRs resolved for 10.1.3.0
- #1958 Attribute loss with
#raiseand several arguments - #2515 openssl net-ssh camellia192 tests fails with jruby9k
- #3242 BigDecimal initializer does not mirror YARV behavior
- #6446 Date parse not working for strings with week number but no day number or year
- #8034 DateTime.jd ignores fractional seconds
- #9329 Wrong union-by-value argument passing in JRuby
- #9500 Fix dir for eval filenames
- #9606 Impossible to
evalwithrequire_relative - #9611 Missing –help strings
- #9647 upgrade jruby-openssl to 0.19.x line
- #9671 Preserve incoming callInfo when forwarding arguments
- #9676 Implement method coverage
- #9680 Using
set_temporary_namemakes Class#name ignore nesting - #9682 Fix line coverage of statements inside string interpolation and heredocs
- #9686 Merge Prism parser binding and compiler into core
- #9693 Pass unions by value with the C ABI’s register classes
- #9699 Wrong union-by-value argument passing in JRuby
- #9702 Pass unions by value with the C ABI’s register classes
- #9708 Read nonblocking when the fiber scheduler has no io_read
- #9727 Jar resources issues with IO#seek #pos or #pread
- #9733 Pass IO::WRITABLE, not FMODE_WRITABLE, to the scheduler’s io_wait
- #9734 Fiber#raise: transfer into transferred fibers instead of resuming
- #9741 Reduce cost of some runtime helper calls
- #9742 Method defined on a class stays invisible to indy call sites while another thread runs a module’s bulk invalidation
- #9743 JRuby mistakes != for a setter
- #9744 JRuby 10.0/CRuby 3.4+ compat: assignment to an outer local variable named
itinside a block seems to assume/create a block level shadow - #9745 Use implicit defined check supported by JRuby 10.1
- #9748 Update 10.1 to latest 4.0 stdlib and tests
- #9749 Release the IO lock while a write waits through the fiber scheduler
- #9750 Yield socket pairs to a block and close them afterwards
- #9751 Implement branch coverage
- #9752 Fully read jar URL resources to make them seekable
-
#9758 [Array#-, #&, # call #hash on elements where MRI does not]#9758 - #9759 Concurrent reads of a frozen two-item array can permanently replace its elements with
nil - #9760 Interrupt fibers waiting through the scheduler when their IO closes
- #9761 Replace Ant in rake helpers with Ruby process launching
- #9765 Only refuse to resume fibers suspended by a transfer
- #9766 Remove the org.jruby.ant Ant tasks and the Ant build dependency
- #9768 IO#close raises Errno::EBADF after Thread#kill closed the channel underneath it
- #9769 Join threads through the Fiber Scheduler
- #9770 Match CRuby’s line coverage and branch locations
- #9782 Add @CRuby annotation linking Java code to CRuby functions
- #9786 Migrate error-prone primitive packing to a single util
- #9788 Support JDK 27
- #9790 Block on Mutex and ConditionVariable through the fiber scheduler
- #9791 Wake Queue#pop(timeout:) waiters when the queue is closed
- #9793 Parse proc call shorthand .() and ::() after a command with a do block
- #9794 SWAR and Arrays.mismatches optimizations for StringSupport.searchNonAscii, ByteList.memcmp, and ByteList.startsWIth.
- #9795 Keep coverage source positions off AST nodes when Coverage isn’t in use
- #9796 fix(string): prevent ArrayIndexOutOfBoundsException in strip on 4-byte GB18030 strings
- #9797 fix(module): clear temporary name when module assigned to constant in named parent
- #9798 [fix] preserve DateTime#jd fractional sec
- #9799 [fix] omit absent date fragments in parser
- #9800 [fix] preserve exception attributes when replacing message
- #9801 Honor AI_NUMERICHOST in Socket.getaddrinfo
- #9802 [compat] undefine BigDecimal.new
- #9803 Wait for child processes through the fiber scheduler
- #9804 Convert MRI comments to @CRuby
- #9805 Let Queue#pop and SizedQueue#push wait through the fiber scheduler
- #9806 Hand the scheduler’s io_read the caller’s part of the read buffer
- #9810 Replace deprecated Ruby#newTypeError(String) in IRRuntimeHelpers
- #9812 Use SOURCE retention for @CRuby
- #9813 Make socket “accept” methods dont block fibers (Fiber::Scheduler support)
- #9815 Fall back to normal call path for non-symbol keyword keys
- #9816 [compat] match BigDecimal float comparison (#5904)
- #9817 [compat] BigDecimal precision with trailing zeros (#3242)
- #9820 JIT emits invalid bytecode for a call with keyword arguments and a block-pass argument (VerifyError)
- #9821 Check that the JIT can compile every method and block
- #9822 JIT can’t compile a range with one string literal endpoint and one non-literal endpoint (IllegalArgumentException: value null)
- #9823 JIT emits invalid bytecode for a range literal with an Integer begin and a non-Integer literal end, such as (1..10.0)
- #9824 JIT can’t compile an operator call on self with a literal Integer or Float argument, such as self + 1 or self == 0
- #9825 JIT can’t compile
__ENCODING__on one side of a branch (ArrayIndexOutOfBoundsException in ASM frame computation) - #9826 JIT can’t compile a for loop body that contains a block (NullPointerException in prepareBlock)
- #9827 JIT can’t compile
when *arrayin a file that uses refinements (NullPointerException in invokeEQQ) - #9829 With Java assertions on, the JIT can’t compile a block containing a case/in with more than one in clause (AssertionError: Somehow EQQ is the last instr in the scope)
- #9830 Don’t assert that an eqq is followed by another instruction
- #9831 Don’t load the context twice for ENCODING
- #9832 Pass the scope field to refined call sites for splatted when
- #9833 Push a range for every end when the begin is a Fixnum
- #9837 Read the instructions array patterns use from persisted IR
- #9838 Give string range endpoints the scope’s file name
- #9839 Check visibility of the operator in self[i] op= value
- #9840 Convert block-pass arguments in the direct keyword call path
- #9841 Give a block its parent scope when compiling a for body on its own
- #9842 Fix compiled operator calls on self with a literal argument
- #9843 Raise TypeError in system when the fiber scheduler’s process_wait returns nil
- #9846 Fix Range#include? of an empty range of single characters
- #9848 Keep file and line on compiled string range endpoints
- #9849 Binding#local_variable_get fails inside a block in a for loop
- #9850 Fix Binding#local_variable_get inside a block in a for loop
- #9851 Build literal ranges that can raise with an instruction
- #9852 Offer buffered writes to the fiber scheduler’s io_write too
- #9854 AOT-compiled array pattern raises NoMatchingPatternKeyError message for a length mismatch
- #9855 Fix local_variables at the top level and in methods
- #9856 Push the Symbol class for BuiltinClass in AOT bytecode
- #9859 Update asm to get recent security fixes
- #9861 Consider lowering JIT_MAXSIZE
- #9862 Wait for TCPSocket connects through the fiber scheduler
- #9864 Resolve host names through the fiber scheduler’s address_resolve
- #9867 Reduce default max JIT size to 500
- #9878 Keep waiting for a resumed fiber when Thread#raise is deferred
- #9884 Zlib::GzipReader#read does not accept an outbuf argument
- #9885 Only mark stdio as TTY when it is a terminal
- #9888 Module#name keeps an anonymous-rooted name after the module is assigned to a named constant
- #9890 Update Joni for expansion limits
- #9891 Give a module rooted at an anonymous module a permanent name
- #9893 Pass a module’s name on to the modules nested in it
- #9896 Cap heap buffer writes at 2MB per call
- #9897 [deps] bump jruby-openssl to 0.19.4
- #9901 Calculate a module’s name without building lists
- #9904 A runtime in a disposable class loader can’t be garbage collected after tearDown
- #9906 Fix GzipReader.read/readpartial with outbuf
- #9909 Resolve require_relative against eval filenames
- #9910 Document missing options in jruby –help
- #9911 Fix Thread#backtrace for a new thread
- #9914 Build Integer Range#to_a arrays at their final size
- #9915 Compare Fixnums and Floats by value in Array#== and #eql?
- #9916 Use the shortest round-trip digits in Float#to_s
- #9917 Compare Integer and Float search arguments directly in Array
- #9918 Select on FIFOs and devices with their own jnr-enxio selector
- #9919 Write files in full instead of capping heap writes
- #9920 Support buffer size and keepalive socket options on UNIX sockets
- #9924 Update io-console for isatty alias fix
- #9926 Make the Builtins redefinition bits catch prepends and inherited methods
- #9929 Treat not-implemented methods as undefined in method_defined? and defined?
- #9930 Fix tests excluded during the Ruby 4.0.9 test sync
- #9931 Add Socket::ResolutionError and fix TCPSocket.new timeouts and local binding
- #9932 Fix several argument and syntax bugs found in excluded MRI tests
- #9933 Raise more of CRuby’s syntax errors
- #9935 Fix IO, ARGF, Zlib and Tempfile behavior behind 19 excluded MRI tests
- #9936 Fix multibyte character literals and other String behavior behind 15 excluded MRI tests
- #9938 Treat 0 from a fiber scheduler’s io_wait as no events ready
- #9939 Keep IO::Buffer.for’s string as an external source
- #9941 Resolve every socket host through the fiber scheduler’s address_resolve
- #9943 Give CRuby’s warnings for method redefinition, visibility calls and more
- #9946 Optimize Complex and Rational literal values
- #9948 Remove SLEEP status update from Regexp matches
- #9955 Add an ASCII fast path for String#casecmp?
- #9957 Fill in a Fiber#raise backtrace in the fiber it is raised in
- #9961 Add a single-byte fast path for String#capitalize and fix :ascii case mapping
- #9964 Use the passed context for to_str checks in Array#join
- #9966 Preserve buffered socket input when writing
- #9970
Float#to_rreturns an Integer for floats >= 2**52 - #9971 Return every socket type getaddrinfo(3) gives for an IP address
- #9974 Keep $~ and $_ per fiber
- #9975 Faster String#dump, #scrub and #codepoints on ASCII-heavy strings
- #9976 Raise instead of clobbering in File.rename onto a directory
- #9978 Raise a copy of a frozen exception instead of mutating it
- #9979 Fix RubyGems defaults triggering redefinition warnings
- #9982 Process::CLOCK_MONOTONIC stops while macOS sleeps, but Thread#join timeouts keep counting
- #9985 Count time asleep in CLOCK_MONOTONIC on macOS
- #9986 Mutex#synchronize can still exit with the lock held after Thread#raise / Timeout (contended path, follow-up to #8585)
- #9988 Update joni to 2.2.9
- #9992 Return a Rational from Float#to_r for floats of magnitude 2**52 or more
- #9993 Report arity -2 for Symbol#to_proc like CRuby
- #9995 Fix targeted thread events on shared monitors
- #9997 Return false from String#== for an object without respond_to?
- #9998 Treat a one-character range in tr as that character
- #9999 Signal.trap with numeric USR1 value traps SIGBUS on Linux
- #10004 Update jar-dependencies to 0.6.2