Open
Description
Here's the remaining checklist of changes needed to support Ruby 2.3. The original bulk was implemented in JRuby 9.1 for #3479.
This list is currently based on https://github.com/ruby/ruby/blob/v2_3_0/NEWS
Language changes
- Changes in how super works for methods copied from parent to child. See https://bugs.ruby-lang.org/issues/3351 and RSpec mocks isn't properly rolling back stubbed any_instance methods with ruby 2.3.0-preview2 rspec/rspec-mocks#1042
Core classes updates (outstanding ones only)
- Encoding
- new Encoding::IBM037 (alias ebcdic-cp-us; dummy)
- Enumerator::Lazy
- Enumerator::Lazy#grep_v (https://bugs.ruby-lang.org/issues/11773) (3f92c0d)
- IO
- new mode flag File::SHARE_DELETE is available.
this flag means to permit deleting opened file on Windows, but currently
this affect only files opened as binary. (https://bugs.ruby-lang.org/issues/11218) - IO#advise no longer raises Errno::ENOSYS in cases where it was
detected at build time but not available at runtime. (https://bugs.ruby-lang.org/issues/11806)
- new mode flag File::SHARE_DELETE is available.
- Proc
- Testing of Proc#call optimizations
- RubyVM::InstructionSequence (May or may not be supportable in JRuby; very specific to MRI)
- add the following methods as a primitive tool of iseq loader.
See sample/iseq_loader.rb for usage.
Note that loader does not have verifier so it is easy to cause
critical problem by loading modified/broken binary data.
See https://bugs.ruby-lang.org/issues/11788 for more details. (experimental feature)- RubyVM::InstructionSequence#to_binary(extra_data = nil)
- RubyVM::InstructionSequence.load_from_binary(binary)
- RubyVM::InstructionSequence.load_from_binary_extra_data(binary)
- add the following methods as a primitive tool of iseq loader.
Core classes compatibility issues (excluding feature bug fixes)
- File::Stat
- On Windows File::Stat#ino always returned 0, but now returns
BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low.
- On Windows File::Stat#ino always returned 0, but now returns
- pack/unpack (Array/String)
- j and J directives for pointer width integer type. (https://bugs.ruby-lang.org/issues/11215)
Stdlib updates (outstanding ones only)
Only items relevant to JRuby
- Bundle did_you_mean gem Bundle did_you_mean gem #3480
- ObjectSpace (objspace) (Most of these are specific to MRI and not relevant to JRuby)
- ObjectSpace.count_symbols is added.
- ObjectSpace.count_imemo_objects is added.
- ObjectSpace.internal_class_of is added.
- ObjectSpace.internal_super_of is added.
- StringIO
- In read-only mode, StringIO#set_encoding no longer sets the encoding
of its buffer string. Setting the encoding of the string directly
without StringIO#set_encoding may cause unpredictable behavior now.
(https://bugs.ruby-lang.org/issues/11827)
- In read-only mode, StringIO#set_encoding no longer sets the encoding
Implementation improvements
Only items relevant to JRuby
- Case dispatch is now optimized for all special constant literals
including nil, true, and false. Previously, only literal strings,
symbols, integers and floats compiled to optimized case dispatch.
(https://bugs.ruby-lang.org/issues/11769) (We have implemented the Fixnum part of this in JRuby for case/when eqq calls do not cache #3513 and JRuby is super-slow to execute a big and trivial case-when statement #3672 but are missing other types that MRI optimizes). - Instance variables on non-pure Ruby classes (T_DATA, T_FILE,
etc..) is less expensive to store than before. (https://bugs.ruby-lang.org/issues/11170) (We have enabled reified instance variables in this release, where up to ten variables will be represented as Java fields. There is likely more we can do here.) - All accesses to members of big Struct objects are performed in
constant-time. Previously, Struct elements beyond the first 10
10 elements used a linear scan. (https://bugs.ruby-lang.org/issues/10585) (We should do a pass over our Struct class to look for opportunities. Most operations should already be constant time. A quick exploration revealed that#[]
currently still does a linear search.) - CGI.escapeHTML is optimized with C extention.
Optimize CGI.escapeHTML for ASCII-compatible encodings ruby/ruby#1164 (JRuby may want to follow suit if this is a commonly-called method.)