Posted by naruse on 11 Nov 2022
We’re happy to announce the discharge of Ruby 3.2.0-preview3. Ruby 3.2 provides many options and efficiency enhancements.
WASI primarily based WebAssembly assist
That is an preliminary port of WASI primarily based WebAssembly assist. This permits a CRuby binary to be obtainable on Net browser, Serverless Edge setting, and different WebAssembly/WASI embedders. At present this port passes primary and bootstrap take a look at suites not utilizing Thread API.
Background
WebAssembly (Wasm) is initially launched to run applications safely and quick in internet browsers. However its goal – working applications efficinently with safety on varied setting – is lengthy needed not solely by internet but in addition by normal functions.
WASI (The WebAssembly System Interface) is designed for such use circumstances. Although such functions want to speak with working methods, WebAssembly runs on a digital machine which didn’t have a system interface. WASI standardizes it.
WebAssembly/WASI Help in Ruby intends to leverage these initiatives. It allows Ruby builders to write down functions which runs on such promised platform.
Use case
This assist encourages builders can make the most of CRuby in WebAssembly setting. An instance use case of it’s TryRuby playground’s CRuby assist. Now you possibly can attempt unique CRuby in your internet browser.
Technical factors
Right now’s WASI and WebAssembly itself has some lacking options to implement Fiber, exception, and GC as a result of it’s nonetheless evolving and in addition for safety causes. So CRuby fills the hole through the use of Asyncify, which is a binary transformation method to regulate execution in userland.
As well as, we constructed a VFS on prime of WASI in order that we will simply pack Ruby apps right into a single .wasm file. This makes distribution of Ruby apps a bit simpler.
Associated hyperlinks
Regexp enhancements in opposition to ReDoS
It’s recognized that Regexp matching could take unexpectedly lengthy. In case your code makes an attempt to match an probably inefficient Regexp in opposition to an untrusted enter, an attacker could exploit it for environment friendly Denial of Service (so-called Common expression DoS, or ReDoS).
We have now launched two enhancements that considerably mitigate ReDoS.
Improved Regexp matching algorithm
Since Ruby 3.2, Regexp’s matching algorithm has been significantly improved through the use of memoization method.
# This matching takes 10 sec. in Ruby 3.1, and does 0.003 sec. in Ruby 3.2
/^a*b?a*$/ =~ "a" * 50000 + "x"
The improved matching algorithm permits most of Regexp matching (about 90% in our experiments) to be accomplished in linear time.
(For preview customers: this optimization could devour reminiscence proportional to the enter size for every matching. We anticipate no sensible issues to come up as a result of this reminiscence allocation is often delayed, and a standard Regexp matching ought to devour at most 10 instances as a lot reminiscence because the enter size. Should you run out of reminiscence when matching Regexps in a real-world utility, please report it.)
The unique proposal is https://bugs.ruby-lang.org/points/19104
Regexp timeout
The optimization above can’t be utilized to some type of common expressions, equivalent to together with superior options (e.g., back-references or look-around), or with big mounted variety of repetitions. As a fallback measure, a timeout function for Regexp matching can also be launched.
Regexp.timeout = 1.0
/^a*b?a*()1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in a single second
Observe that Regexp.timeout
is a worldwide configuration. If you wish to use totally different timeout settings for some particular Regexps, chances are you’ll need to use timeout
key phrase for Regexp.new
.
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*()1$", timeout: Float::INFINITY)
long_time_re =~ "a" * 50000 + "x" # by no means interrupted
The unique proposal is https://bugs.ruby-lang.org/points/17837
Different Notable New Options
Not bundle third occasion sources
Language
-
Nameless relaxation and key phrase relaxation arguments can now be handed as
arguments, as a substitute of simply utilized in methodology parameters.
[Feature #18351]def foo(*) bar(*) finish def baz(**) quux(**) finish
-
A proc that accepts a single positional argument and key phrases will
now not autosplat. [Bug #18633]proca, **okay.name([1, 2]) # Ruby 3.1 and earlier than # => 1 # Ruby 3.2 and after # => [1, 2]
-
Fixed project analysis order for constants set on specific
objects has been made per single attribute project
analysis order. With this code:foo
is now referred to as earlier thanbaz
. Equally, for a number of assignments
to constants, left-to-right analysis order is used. With this
code:foo1::BAR1, foo2::BAR2 = baz1, baz2
The next analysis order is now used:
foo1
foo2
baz1
baz2
-
Discover sample is now not experimental.
[Feature #18585] -
Strategies taking a relaxation parameter (like
*args
) and wishing to delegate key phrase
arguments by means offoo(*args)
should now be marked withruby2_keywords
(if not already the case). In different phrases, all strategies wishing to delegate
key phrase arguments by means of*args
should now be marked withruby2_keywords
,
with no exception. This may make it simpler to transition to different methods of
delegation as soon as a library can require Ruby 3+. Beforehand, theruby2_keywords
flag was stored if the receiving methodology took*args
, however this was a bug and an
inconsistency. A very good method to search out the potentially-missingruby2_keywords
is to run the take a look at suite, for the place it fails discover the final methodology which should
obtain key phrase arguments, useplaces nil, caller, nil
there, and examine every
methodology/block on the decision chain which should delegate key phrases is appropriately marked
asruby2_keywords
. [Bug #18625] [Bug #16466]def goal(**kw) finish # By accident labored with out ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords # wanted in 3.2+. Identical to (*args, **kwargs) or (...) can be wanted on # each #foo and #bar when migrating away from ruby2_keywords. ruby2_keywords def bar(*args) goal(*args) finish ruby2_keywords def foo(*args) bar(*args) finish foo(okay: 1)
Efficiency enhancements
YJIT
- Help arm64 / aarch64 on UNIX platforms.
- Constructing YJIT requires Rust 1.58.1+. [Feature #18481]
Different notable modifications since 3.1
- Hash
- Hash#shift now all the time returns nil if the hash is
empty, as a substitute of returning the default worth or
calling the default proc. [Bug #16908]
- Hash#shift now all the time returns nil if the hash is
- MatchData
- Module
- Proc
- Refinement
- RubyVM::AbstractSyntaxTree
- Add
error_tolerant
possibility forparse
,parse_file
andof
. [[Feature #19013]]
- Add
- Set
- Set is now obtainable as a builtin class with out the necessity for
require "set"
. [Feature #16989]
It’s at present autoloaded by way of theSet
fixed or a name toEnumerable#to_set
.
- Set is now obtainable as a builtin class with out the necessity for
- String
- String#byteindex and String#byterindex have been added. [Feature #13110]
- Replace Unicode to Model 14.0.0 and Emoji Model 14.0. [Feature #18037]
(additionally applies to Regexp) - String#bytesplice has been added. [Feature #18598]
- Struct
- A Struct class may also be initialized with key phrase arguments
with outkeyword_init: true
onStruct.new
[Feature #16806]
- A Struct class may also be initialized with key phrase arguments
Compatibility points
Observe: Excluding function bug fixes.
Eliminated constants
The next deprecated constants are eliminated.
Eliminated strategies
The next deprecated strategies are eliminated.
Stdlib compatibility points
Psych
now not bundles libyaml sources.
Customers want to put in the libyaml library themselves by way of the bundle
system. [Feature #18571]
C API updates
Up to date C APIs
The next APIs are up to date.
- PRNG replace
rb_random_interface_t
up to date and versioned.
Extension libraries which use this interface and constructed for older variations.
Additionallyinit_int32
perform must be outlined.
Eliminated C APIs
The next deprecated APIs are eliminated.
rb_cData
variable.- “taintedness” and “trustedness” capabilities. [Feature #16131]
Normal libraries updates
-
SyntaxSuggest
- The function of
syntax_suggest
previouslydead_end
is built-in in Ruby.
[Feature #18159]
- The function of
-
ErrorHighlight
- Now it factors an argument(s) of TypeError and ArgumentError
take a look at.rb:2:in `+': nil cannot be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
- The next default gems are up to date.
- RubyGems 3.4.0.dev
- bigdecimal 3.1.2
- bundler 2.4.0.dev
- cgi 0.3.2
- date 3.2.3
- error_highlight 0.4.0
- and so forth 1.4.0
- io-console 0.5.11
- io-nonblock 0.1.1
- io-wait 0.3.0.pre
- ipaddr 1.2.4
- json 2.6.2
- logger 1.5.1
- net-http 0.2.2
- net-protocol 0.1.3
- ostruct 0.5.5
- psych 5.0.0.dev
- reline 0.3.1
- securerandom 0.2.0
- set 1.0.3
- stringio 3.0.3
- syntax_suggest 0.0.1
- timeout 0.3.0
- The next bundled gems are up to date.
- minitest 5.16.3
- net-imap 0.2.3
- rbs 2.6.0
- typeprof 0.21.3
- debug 1.6.2
- The next default gems are actually bundled gems.
See NEWS
or commit logs
for extra particulars.
With these modifications, 2719 information modified, 191269 insertions(+), 120315 deletions(-)
since Ruby 3.1.0!
Obtain
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.gz
SIZE: 20086542 SHA1: dafca8116d36ceaa32482ab38359768de8c3ae5e SHA256: c041d1488e62730d3a10dbe7cf7a3b3e4268dc867ec20ec991e7d16146640487 SHA512: 860634d95e4b9c48f18d38146dfbdc3c389666d45454248a4ccdfc3a5d3cd0c71c73533aabf359558117de9add1472af228d8eaec989c9336b1a3a6f03f1ae88
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.xz
SIZE: 14799804 SHA1: c94e2add05502cb5c39afffc995b7c8f000f7df0 SHA256: d3f5619de544240d92a5d03aa289e71bd1103379622c523a0e80ed029a74b3bb SHA512: c1864e2e07c3711eaa17d0f85dfbcc6e0682b077782bb1c155315af45139ae66dc4567c73682d326975b0f472111eb0a70f949811cb54bed0b3a816ed6ac34df
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.zip
SIZE: 24426893 SHA1: 346c051c4be7ab8d0b551fd2ff8169785697db62 SHA256: cf49aa70e7ebd8abebffd5e49cd3bd92e5b9f3782d587cc7ed88c98dd5f17069 SHA512: 4f22b5ea91be17ef5f68cf0acb1e3a226dcc549ad71cc9b40e623220087c4065ca9bea942710f668e5c94ca0323da8d2ccd565f95a9085c1a0e38e9c0543b22f
What’s Ruby
Ruby was first developed by Matz (Yukihiro Matsumoto) in 1993,
and is now developed as Open Supply. It runs on a number of platforms
and is used all around the world particularly for internet improvement.