mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
54072e329c
to replace the address for TCP/IP connection [Feature #5180] There're 3 layers of hostname: * host address for TCP/IP * TLS server name * HTTP Host header value To test DNS round robin or check server certificate from server local, people sometimes want to connect server with given IP address but keep TLS server name and HTTP Host header value. closes [Feature #15215] closes https://github.com/ruby/ruby/pull/1893 closes https://github.com/ruby/ruby/pull/1977
705 lines
20 KiB
Text
705 lines
20 KiB
Text
# -*- rdoc -*-
|
|
|
|
= NEWS for Ruby 2.7.0
|
|
|
|
This document is a list of user visible feature changes made between
|
|
releases except for bug fixes.
|
|
|
|
Note that each entry is kept so brief that no reason behind or reference
|
|
information is supplied with. For a full list of changes with all
|
|
sufficient information, see the ChangeLog file or Redmine
|
|
(e.g. <tt>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</tt>)
|
|
|
|
== Changes since the 2.6.0 release
|
|
|
|
=== Language changes
|
|
|
|
==== Pattern matching
|
|
|
|
* Pattern matching is introduced as an experimental feature. [Feature #14912]
|
|
|
|
case [0, [1, 2, 3]]
|
|
in [a, [b, *c]]
|
|
p a #=> 0
|
|
p b #=> 1
|
|
p c #=> [2, 3]
|
|
end
|
|
|
|
case {a: 0, b: 1}
|
|
in {a: 0, x: 1}
|
|
:unreachable
|
|
in {a: 0, b: var}
|
|
p var #=> 1
|
|
end
|
|
|
|
json = <<END
|
|
{
|
|
"name": "Alice",
|
|
"age": 30,
|
|
"children": [{ "name": "Bob", "age": 2 }]
|
|
}
|
|
END
|
|
if JSON.parse(json, symbolize_names: true) in
|
|
{name: "Alice", children: [{name: "Bob", age: age}]}
|
|
p age #=> 2
|
|
end
|
|
|
|
* See the following slides in detail
|
|
* https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7
|
|
|
|
==== The spec of keyword arguments is changed towards 3.0
|
|
|
|
* Automatic conversion of keyword arguments and positional arguments is
|
|
deprecated, and conversion will be removed in Ruby 3. [Feature #14183]
|
|
|
|
* When a method call passes a Hash at the last argument, and when it
|
|
passes no keywords, and when the called method accepts keywords, a
|
|
warning is emitted. To continue treating as keywords, add a double
|
|
splat operator to avoid the warning and ensure correct behavior in
|
|
Ruby 3.
|
|
|
|
def foo(key: 42); end; foo({key: 42}) # warned
|
|
def foo(**kw); end; foo({key: 42}) # warned
|
|
def foo(key: 42); end; foo(**{key: 42}) # OK
|
|
def foo(**kw); end; foo(**{key: 42}) # OK
|
|
|
|
* When a method call passes keywords to a method that accepts keywords,
|
|
but it does not pass enough required positional arguments, the
|
|
keywords are treated as a final required positional argument, and a
|
|
warning is emitted. Pass the argument as a hash instead of keywords
|
|
to avoid the warning and ensure correct behavior in Ruby 3.
|
|
|
|
def foo(h, **kw); end; foo(key: 42) # warned
|
|
def foo(h, key: 42); end; foo(key: 42) # warned
|
|
def foo(h, **kw); end; foo({key: 42}) # OK
|
|
def foo(h, key: 42); end; foo({key: 42}) # OK
|
|
|
|
* When a method accepts specific keywords but not a keyword splat, and
|
|
a hash or keywords splat is passed to the method that includes both
|
|
Symbol and non-Symbol keys, the hash will continue to be split, and
|
|
a warning will be emitted. You will need to update the calling code
|
|
to pass separate hashes to ensure correct behavior in Ruby 3.
|
|
|
|
def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned
|
|
def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
|
|
def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
|
|
|
|
* If a method does not accept keywords, and is called with keywords,
|
|
the keywords are still treated as a positional hash, with no warning.
|
|
This behavior will continue to work in Ruby 3.
|
|
|
|
def foo(opt={}); end; foo( key: 42 ) # OK
|
|
|
|
* Non-symbols are allowed as a keyword argument keys if method accepts
|
|
arbitrary keywords. [Feature #14183]
|
|
|
|
* Non-Symbol keys in a keyword arguments hash were prohibited in 2.6.0,
|
|
but are now allowed again. [Bug #15658]
|
|
|
|
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
|
|
|
|
* <code>**nil</code> is allowed in method definitions to explicitly mark
|
|
that the method accepts no keywords. Calling such a method with keywords
|
|
will result in an ArgumentError. [Feature #14183]
|
|
|
|
def foo(h, **nil); end; foo(key: 1) # ArgumentError
|
|
def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
|
|
def foo(h, **nil); end; foo("str" => 1) # ArgumentError
|
|
def foo(h, **nil); end; foo({key: 1}) # OK
|
|
def foo(h, **nil); end; foo({"str" => 1}) # OK
|
|
|
|
* Passing an empty keyword splat to a method that does not accept keywords
|
|
no longer passes an empty hash, unless the empty hash is necessary for
|
|
a required parameter, in which case a warning will be emitted. Remove
|
|
the double splat to continue passing a positional hash. [Feature #14183]
|
|
|
|
h = {}; def foo(*a) a end; foo(**h) # []
|
|
h = {}; def foo(a) a end; foo(**h) # {} and warning
|
|
h = {}; def foo(*a) a end; foo(h) # [{}]
|
|
h = {}; def foo(a) a end; foo(h) # {}
|
|
|
|
==== Numbered parameter
|
|
|
|
* Numbered parameter as the default block parameter is introduced as an
|
|
experimental feature. [Feature #4475]
|
|
|
|
[1, 2, 10].map { _1.to_s(16) } #=> ["1", "2", "a"]
|
|
|
|
You can still define a local variable named _1 and so on, and that is honored when present, but renders warning.
|
|
|
|
_1 = 0
|
|
[1].each { p _1 } # prints 0 instead of 1, but also warns.
|
|
|
|
==== proc/lambda without block is deprecated
|
|
|
|
* Proc.new and Kernel#proc with no block in a method called with a block is
|
|
warned now.
|
|
|
|
def foo
|
|
proc
|
|
end
|
|
foo { puts "Hello" } #=> warning: Capturing the given block using Proc.new is deprecated; use `&block` instead
|
|
|
|
* Kernel#lambda with no block in a method called with a block raises an exception.
|
|
|
|
def bar
|
|
lambda
|
|
end
|
|
bar { puts "Hello" } #=> tried to create Proc object without a block (ArgumentError)
|
|
|
|
==== Other miscellaneous changes
|
|
|
|
* A beginless range is experimentally introduced. It might not be as useful
|
|
as an endless range, but would be good for DSL purpose. [Feature #14799]
|
|
|
|
ary[..3] # identical to ary[0..3]
|
|
where(sales: ..100)
|
|
|
|
* Setting <code>$;</code> to non-nil value is warned now. Use of it in
|
|
String#split is warned too.
|
|
|
|
* Setting <code>$,</code> to non-nil value is warned now. Use of it in
|
|
Array#join is warned too.
|
|
|
|
* Quoted here-document identifier must end within the same line.
|
|
|
|
<<"EOS
|
|
" # This had been warned since 2.4; Now it raises a SyntaxError
|
|
EOS
|
|
|
|
* The flip-flop syntax deprecation is reverted. [Feature #5400]
|
|
|
|
* Comment lines can be placed between fluent dot now.
|
|
|
|
foo
|
|
# .bar
|
|
.baz # => foo.baz
|
|
|
|
* Calling a private method with a literal <code>self</code> as the receiver
|
|
is now allowed. [Feature #11297] [Feature #16123]
|
|
|
|
* Modifier rescue now operates the same for multiple assignment as single
|
|
assignment:
|
|
|
|
a, b = raise rescue [1, 2]
|
|
# Previously parsed as: (a, b = raise) rescue [1, 2]
|
|
# Now parsed as: a, b = (raise rescue [1, 2])
|
|
|
|
* +yield+ in singleton class syntax is warned and will be deprecated later [Feature #15575].
|
|
|
|
def foo
|
|
class << Object.new
|
|
yield
|
|
end
|
|
end
|
|
foo { p :ok } #=> warning: `yield' in class syntax will not be supported from Ruby 3.0.
|
|
|
|
* Argument forwarding by <code>(...)</code> is introduced. [Feature #16253]
|
|
|
|
def foo(...)
|
|
bar(...)
|
|
end
|
|
|
|
All arguments to +foo+ are forwarded to +bar+, including keyword and
|
|
block arguments.
|
|
Note that the parentheses are mandatory. `bar ...` is parsed as an endless range.
|
|
|
|
* Access and setting of <code>$SAFE</code> is now always warned. <code>$SAFE</code>
|
|
will become a normal global variable in Ruby 3.0. [Feature #16131]
|
|
|
|
* <code>Object#{taint,untaint,trust,untrust}</code> and related functions in the C-API
|
|
no longer have an effect (all objects are always considered untainted), and are now
|
|
warned in verbose mode. This warning will be disabled even in non-verbose mode in
|
|
Ruby 3.0, and the methods and C functions will be removed in Ruby 3.2. [Feature #16131]
|
|
|
|
=== Core classes updates (outstanding ones only)
|
|
|
|
Array::
|
|
|
|
New method::
|
|
|
|
* Added Array#intersection. [Feature #16155]
|
|
|
|
Comparable::
|
|
|
|
Modified method::
|
|
|
|
* Comparable#clamp now accepts a Range argument. [Feature #14784]
|
|
|
|
-1.clamp(0..2) #=> 0
|
|
1.clamp(0..2) #=> 1
|
|
3.clamp(0..2) #=> 2
|
|
|
|
Complex::
|
|
|
|
New method::
|
|
|
|
* Added Complex#<=>. So 0 <=> 0i will not raise NoMethodError. [Bug #15857]
|
|
|
|
Dir::
|
|
|
|
Modified methods::
|
|
|
|
* Dir.glob and Dir.[] no longer allow NUL-separated glob pattern.
|
|
Use Array instead. [Feature #14643]
|
|
|
|
Encoding::
|
|
|
|
New encoding::
|
|
|
|
* Added new encoding CESU-8 [Feature #15931]
|
|
|
|
Enumerable::
|
|
|
|
New methods::
|
|
|
|
* Added Enumerable#filter_map. [Feature #15323]
|
|
|
|
[1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
|
|
|
|
* Added Enumerable#tally. [Feature #11076]
|
|
|
|
["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
|
|
|
|
Enumerator::
|
|
|
|
New methods::
|
|
|
|
* Added Enumerator.produce to generate Enumerator from any custom
|
|
data-transformation. [Feature #14781]
|
|
|
|
require 'date'
|
|
dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
|
|
dates.detect(&:tuesday?) #=> next tuesday
|
|
|
|
* Added Enumerator::Lazy#eager that generates a non-lazy enumerator
|
|
from a lazy enumerator. [Feature #15901]
|
|
|
|
a = %w(foo bar baz)
|
|
e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
|
|
p e.class #=> Enumerator
|
|
p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
|
|
|
|
* Added Enumerator::Yielder#to_proc so that a Yielder object
|
|
can be directly passed to another method as a block
|
|
argument. [Feature #15618]
|
|
|
|
Fiber::
|
|
|
|
New method::
|
|
|
|
* Added Fiber#raise that behaves like Fiber#resume but raises an
|
|
exception on the resumed fiber. [Feature #10344]
|
|
|
|
File::
|
|
|
|
Modified method::
|
|
|
|
* File.extname now returns a dot string at a name ending with a dot on
|
|
non-Windows platforms. [Bug #15267]
|
|
|
|
File.extname("foo.") #=> "."
|
|
|
|
FrozenError::
|
|
|
|
New method::
|
|
|
|
* Added FrozenError#receiver to return the frozen object that
|
|
modification was attempted on. To set this object when raising
|
|
FrozenError in Ruby code, pass it as the second argument to
|
|
FrozenError.new. [Feature #15751]
|
|
|
|
GC::
|
|
|
|
New method::
|
|
|
|
* Added GC.compact method for compacting the heap.
|
|
This function compacts live objects in the heap so that fewer pages may
|
|
be used, and the heap may be more CoW friendly. [Feature #15626]
|
|
|
|
Details on the algorithm and caveats can be found here:
|
|
https://bugs.ruby-lang.org/issues/15626
|
|
|
|
IO::
|
|
|
|
New method::
|
|
|
|
* Added IO#set_encoding_by_bom to check the BOM and set the external
|
|
encoding. [Bug #15210]
|
|
|
|
Integer::
|
|
|
|
Modified method::
|
|
|
|
* Integer#[] now supports range operation. [Feature #8842]
|
|
|
|
0b01001101[2, 4] #=> 0b0011
|
|
0b01001100[2..5] #=> 0b0011
|
|
0b01001100[2...6] #=> 0b0011
|
|
^^^^
|
|
|
|
Method::
|
|
|
|
Modified method::
|
|
|
|
* Method#inspect shows much information. [Feature #14145]
|
|
|
|
Module::
|
|
|
|
New methods::
|
|
|
|
* Added Module#const_source_location to retrieve the location where a
|
|
constant is defined. [Feature #10771]
|
|
|
|
* Added Module#ruby2_keywords for marking a method as passing keyword
|
|
arguments through a regular argument splat, useful when delegating
|
|
all arguments to another method in a way that can be backwards
|
|
compatible with older Ruby versions. [Bug #16154]
|
|
|
|
Modified methods::
|
|
|
|
* Module#autoload? now takes an +inherit+ optional argument, like as
|
|
Module#const_defined?. [Feature #15777]
|
|
|
|
* Module#name now always returns a frozen String. The returned String is
|
|
always the same for a given Module. This change is
|
|
experimental. [Feature #16150]
|
|
|
|
|
|
NilClass / TrueClass / FalseClass::
|
|
|
|
Modified methods::
|
|
|
|
* NilClass#to_s, TrueClass#to_s and FalseClass#to_s now always return a
|
|
frozen String. The returned String is always the same for each of these
|
|
values. This change is experimental. [Feature #16150]
|
|
|
|
ObjectSpace::WeakMap::
|
|
|
|
Modified method::
|
|
|
|
* ObjectSpace::WeakMap#[]= now accepts special objects as either key or
|
|
values. [Feature #16035]
|
|
|
|
Regexp::
|
|
|
|
Modified method::
|
|
|
|
* Regexp#match and Regexp#match? with a +nil+ argument are deprecated
|
|
and will raise a TypeError in the next release. [Feature #13083]
|
|
|
|
RubyVM::
|
|
|
|
Removed method::
|
|
|
|
* +RubyVM.resolve_feature_path+ moved to
|
|
<code>$LOAD_PATH.resolve_feature_path</code>. [Feature #15903] [Feature #15230]
|
|
|
|
String::
|
|
|
|
Unicode::
|
|
|
|
* Update Unicode version and Emoji version from 11.0.0 to
|
|
12.0.0. [Feature #15321]
|
|
|
|
* Update Unicode version to 12.1.0, adding support for
|
|
U+32FF SQUARE ERA NAME REIWA. [Feature #15195]
|
|
|
|
* Update Unicode Emoji version to 12.1 [Feature #16272]
|
|
|
|
Symbol::
|
|
|
|
New methods::
|
|
|
|
* Added Symbol#start_with? and Symbol#end_with? method. [Feature #16348]
|
|
|
|
Time::
|
|
|
|
New methods::
|
|
|
|
* Added Time#ceil method. [Feature #15772]
|
|
|
|
* Added Time#floor method. [Feature #15653]
|
|
|
|
Modified method::
|
|
|
|
* Time#inspect is separated from Time#to_s and it shows its sub
|
|
second. [Feature #15958]
|
|
|
|
UnboundMethod::
|
|
|
|
New method::
|
|
|
|
* Added UnboundMethod#bind_call method. [Feature #15955]
|
|
|
|
<code>umethod.bind_call(obj, ...)</code> is semantically equivalent
|
|
to <code>umethod.bind(obj).call(...)</code>. This idiom is used in
|
|
some libraries to call a method that is overridden. The added
|
|
method does the same without allocation of intermediate Method
|
|
object.
|
|
|
|
class Foo
|
|
def add_1(x)
|
|
x + 1
|
|
end
|
|
end
|
|
class Bar < Foo
|
|
def add_1(x) # override
|
|
x + 2
|
|
end
|
|
end
|
|
|
|
obj = Bar.new
|
|
p obj.add_1(1) #=> 3
|
|
p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2
|
|
p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
|
|
|
|
|
|
$LOAD_PATH::
|
|
|
|
New method::
|
|
|
|
* Added <code>$LOAD_PATH.resolve_feature_path</code>. [Feature #15903] [Feature #15230]
|
|
|
|
=== Stdlib updates (outstanding ones only)
|
|
|
|
Bundler::
|
|
|
|
* Upgrade to Bundler 2.1.0.pre.3
|
|
See https://github.com/bundler/bundler/blob/2-1-stable/CHANGELOG.md#210pre3-november-12-2019
|
|
|
|
CGI::
|
|
|
|
* CGI.escapeHTML becomes 2~5x faster when there's at least one escaped character.
|
|
https://github.com/ruby/ruby/pull/2226
|
|
|
|
CSV::
|
|
|
|
* Upgrade to 3.1.2.
|
|
See https://github.com/ruby/csv/blob/master/NEWS.md.
|
|
|
|
Date::
|
|
|
|
* Date.jisx0301, Date#jisx0301, and Date.parse support the new Japanese
|
|
era. [Feature #15742]
|
|
|
|
Delegator::
|
|
|
|
* Object#DelegateClass accepts a block and module_evals it in the context
|
|
of the returned class, similar to Class.new and Struct.new.
|
|
|
|
ERB::
|
|
|
|
* Prohibit marshaling ERB instance.
|
|
|
|
IRB::
|
|
|
|
* Introduce syntax highlight inspired by pry.gem to Binding#irb source lines,
|
|
REPL input, and inspect output of some core-class objects.
|
|
|
|
* Introduce multiline mode by Reline.
|
|
|
|
* Show documents when completion.
|
|
|
|
* Enable auto indent and save/load history by default.
|
|
|
|
Net::FTP::
|
|
|
|
* Add Net::FTP#features to check available features, and Net::FTP#option to
|
|
enable/disable each of them. [Feature #15964]
|
|
|
|
Net::HTTP::
|
|
|
|
* Add ipaddr optional parameter to Net::HTTP#start to replace the address for
|
|
TCP/IP connection [Feature #5180]
|
|
|
|
Net::IMAP::
|
|
|
|
* Add Server Name Indication (SNI) support. [Feature #15594]
|
|
|
|
open-uri::
|
|
|
|
* Warn open-uri's "open" method at Kernel.
|
|
Use URI.open instead. [Misc #15893]
|
|
|
|
* The default charset of text/* media type is UTF-8 instead of
|
|
ISO-8859-1. [Bug #15933]
|
|
|
|
OptionParser::
|
|
|
|
* Now show "Did you mean?" for unknown option. [Feature #16256]
|
|
|
|
test.rb:
|
|
|
|
require 'optparse'
|
|
OptionParser.new do |opts|
|
|
opts.on("-f", "--foo", "foo") {|v| }
|
|
opts.on("-b", "--bar", "bar") {|v| }
|
|
opts.on("-c", "--baz", "baz") {|v| }
|
|
end.parse!
|
|
|
|
example:
|
|
|
|
$ ruby test.rb --baa
|
|
Traceback (most recent call last):
|
|
test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption)
|
|
Did you mean? baz
|
|
bar
|
|
|
|
Pathname::
|
|
|
|
* Delegates 3 arguments from Pathname.glob to Dir.glob to
|
|
accept base: keyword.
|
|
|
|
Racc::
|
|
|
|
* Merge 1.4.15 from upstream repository and added cli of racc.
|
|
|
|
Reline::
|
|
|
|
* New stdlib that is compatible with readline stdlib by pure Ruby and also
|
|
has a multiline mode.
|
|
|
|
REXML::
|
|
|
|
* Upgrade to 3.2.3.
|
|
See https://github.com/ruby/rexml/blob/master/NEWS.md.
|
|
|
|
RSS::
|
|
|
|
* Upgrade to RSS 0.2.8.
|
|
See https://github.com/ruby/rss/blob/master/NEWS.md.
|
|
|
|
RubyGems::
|
|
|
|
* Upgrade to RubyGems 3.1.0.pre3
|
|
See https://github.com/rubygems/rubygems/blob/3.1/History.txt#L3
|
|
|
|
StringScanner::
|
|
|
|
* Upgrade to 1.0.3.
|
|
See https://github.com/ruby/strscan/blob/master/NEWS.md.
|
|
|
|
=== Compatibility issues (excluding feature bug fixes)
|
|
|
|
* The following libraries are no longer bundled gems.
|
|
Install corresponding gems to use these features.
|
|
* CMath (cmath gem)
|
|
* Scanf (scanf gem)
|
|
* Shell (shell gem)
|
|
* Synchronizer (sync gem)
|
|
* ThreadsWait (thwait gem)
|
|
* E2MM (e2mmap gem)
|
|
|
|
Proc::
|
|
* Proc#to_s format was changed. [Feature #16101]
|
|
|
|
=== Stdlib compatibility issues (excluding feature bug fixes)
|
|
|
|
* Promote stdlib to default gems
|
|
* The following default gems was published at rubygems.org
|
|
* benchmark
|
|
* cgi
|
|
* delegate
|
|
* getoptlong
|
|
* net-pop
|
|
* net-smtp
|
|
* open3
|
|
* pstore
|
|
* singleton
|
|
* The following default gems only promoted ruby-core, Not yet published at rubygems.org.
|
|
* monitor
|
|
* observer
|
|
* timeout
|
|
* tracer
|
|
* uri
|
|
* yaml
|
|
|
|
pathname::
|
|
|
|
* Kernel#Pathname when called with a Pathname argument now returns
|
|
the argument instead of creating a new Pathname. This is more
|
|
similar to other Kernel methods, but can break code that modifies
|
|
the return value and expects the argument not to be modified.
|
|
|
|
profile.rb, Profiler__::
|
|
|
|
* Removed from standard library. No one maintains it from Ruby 2.0.0.
|
|
|
|
=== C API updates
|
|
|
|
* Many <code>*_kw</code> functions have been added for setting whether
|
|
the final argument being passed should be treated as keywords. You
|
|
may need to switch to these functions to avoid keyword argument
|
|
separation warnings, and to ensure correct behavior in Ruby 3.
|
|
|
|
* The <code>:</code> character in rb_scan_args format string is now
|
|
treated as keyword arguments. Passing a positional hash instead of
|
|
keyword arguments will emit a deprecation warning.
|
|
|
|
* C API declarations with +ANYARGS+ are changed not to use +ANYARGS+
|
|
https://github.com/ruby/ruby/pull/2404
|
|
|
|
=== Implementation improvements
|
|
|
|
Fiber::
|
|
|
|
* Allow selecting different coroutine implementation by using
|
|
`--with-coroutine=`, e.g.
|
|
|
|
./configure --with-coroutine=ucontext
|
|
./configure --with-coroutine=copy
|
|
|
|
* Replace previous stack cache with fiber pool cache. The fiber pool
|
|
allocates many stacks in a single memory region. Stack allocation
|
|
becomes O(log N) and fiber creation is amortized O(1). Around 10x
|
|
performance improvement was measured in micro-benchmarks.
|
|
|
|
File::
|
|
* File.realpath now uses realpath(3) on many platforms, which can
|
|
significantly improve performance.
|
|
|
|
Hash::
|
|
* Change data structure of small Hash objects. [Feature #15602]
|
|
|
|
Monitor::
|
|
* Monitor class is written in C-extension. [Feature #16255]
|
|
|
|
Thread::
|
|
|
|
* VM stack memory allocation is now combined with native thread stack,
|
|
improving thread allocation performance and reducing allocation related
|
|
failures. ~10x performance improvement was measured in micro-benchmarks.
|
|
|
|
JIT::
|
|
|
|
* JIT-ed code is recompiled to less-optimized code when an optimization assumption is invalidated.
|
|
|
|
* Method inlining is performed when a method is considered as pure.
|
|
This optimization is still experimental and many methods are NOT considered as pure yet.
|
|
|
|
* Default value of +--jit-max-cache+ is changed from 1,000 to 100
|
|
|
|
* Default value of +--jit-min-calls+ is changed from 5 to 10,000
|
|
|
|
=== Miscellaneous changes
|
|
|
|
* Support for IA64 architecture has been removed. Hardware for testing was
|
|
difficult to find, native fiber code is difficult to implement, and it added
|
|
non-trivial complexity to the interpreter. [Feature #15894]
|
|
|
|
* Require compilers to support C99 [Misc #15347]
|
|
|
|
* Details of our dialect: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99
|
|
|
|
* Ruby's upstream repository is changed from Subversion to Git.
|
|
|
|
* https://git.ruby-lang.org/ruby.git
|
|
|
|
* RUBY_REVISION class is changed from Integer to String.
|
|
|
|
* RUBY_DESCRIPTION includes Git revision instead of Subversion's one.
|
|
|
|
* Support built-in methods in Ruby with `__builtin_` syntax. [Feature #16254]
|
|
Some methods are defined in *.rb (such as trace_point.rb).
|
|
For example, it is easy to define a method which accepts keyword arguments.
|