New features:
- Compilation of C extensions is now done with an internal LLVM toolchain producing both native code and bitcode. This means more C extensions should compile out of the box and this should resolve most linker-related issues.
- It is no longer necessary to install LLVM for installing C extensions on TruffleRuby.
- It is no longer necessary to install libc++ and libc++abi for installing C++ extensions on TruffleRuby.
- On macOS, it is no longer necessary to install the system headers package (#1417).
- License updated to EPL 2.0/GPL 2.0/LGPL 2.1 like recent JRuby.
Bug fixes:
rb_undef_method
now works for private methods (#1731).- Fixed several issues when requiring C extensions concurrently (#1565).
self.method ||= value
with a private method now works correctly (#1673).- Fixed
RegexpError: invalid multibyte escape
for binary regexps with a non-binary String (#1433). - Arrays now report their methods to other languages for interopability (#1768).
- Installing
sassc
now works due to using the LLVM toolchain (#1753). - Renamed
Truffle::Interop.respond_to?
to avoid conflict with Ruby'srespond_to?
(#1491). - Warn only if
$VERBOSE
istrue
when a magic comment is ignored (#1757). - Make C extensions use the same libssl as the one used for the openssl C extension (#1770).
Compatibility:
GC.stat
can now take an optional argument (#1716).Kernel#load
withwrap
has been implemented (#1739).- Implemented
Kernel#spawn
with:chdir
(#1492). - Implemented
rb_str_drop_bytes
, notably used by OpenSSL (#1740). - Include executables of default gems, needed for
rails new
in Rails 6. - Use compilation flags similar to MRI for C extension compilation.
- Warn for
gem update --system
as it is not fully supported yet and is often not needed. - Pass
-undefined dynamic_lookup
to the linker on macOS like MRI.
Performance:
- Core methods are no longer always cloned, which reduces memory footprint and should improve warmup.
- Inline cache calls to
rb_intern()
with a constant name in C extensions. - Improve allocation speed of native handles for C extensions.
- Improve the performance of
NIL_P
andINT2FIX
in C extensions. - Various fixes to improve Rack performance.
- Optimize
String#gsub(String)
by not creating aRegexp
and usingString#index
instead.
New features:
Fiddle
has been implemented.
Bug fixes:
- Set
RbConfig::CONFIG['ruby_version']
to the same value as the TruffleRuby version. This fixes reusing C extensions between different versions of TruffleRuby with Bundler (#1715). - Fixed
Symbol#match
returningMatchData
(#1706). - Allow
Time#strftime
to be called with binary format strings. - Do not modify the argument passed to
IO#write
when the encoding does not match (#1714). - Use the class where the method was defined to check if an
UnboundMethod
can be used for#define_method
(#1710). - Fixed setting
$~
forEnumerable
andEnumerator::Lazy
's#grep
and#grep_v
. - Improved errors when interacting with single-threaded languages (#1709).
Compatibility:
- Added
Kernel#then
(#1703). FFI::Struct#[]=
is now supported for inline character arrays.blocking: true
is now supported forFFI::Library#attach_function
.- Implemented
Proc#>>
and#<<
(#1688). Thread.report_on_exception
is nowtrue
by default like MRI 2.5+.BigDecimal
compatibility has been generally improved in several ways.
Changes:
- An interop read message sent to a
Proc
will no longer call theProc
.
Performance:
- Several
String
methods have been made faster by the usage of vector instructions when searching for a single-byte character in a String. - Methods needing the caller frame are now better optimized.
Ruby is an experimental language in the GraalVM 19.1.0 release
Bug fixes:
- Sharing for thread-safety of objects is now triggered later as intended, e.g., when a second
Thread
is started. - Fixed
Array#to_h
so it doesn't set a default value (#1698). - Removed extra
public
methods onIO
(#1702). - Fixed
Process.kill(signal, Process.pid)
when the signal is trapped as:IGNORE
(#1702). - Fixed
Addrinfo.new(String)
to reliably find the address family (#1702). - Fixed argument checks in
BasicSocket#setsockopt
(#1460). - Fixed
ObjectSpace.trace_object_allocations
(#1456). - Fixed
BigDecimal#{clone,dup}
so it now just returns the receiver, per Ruby 2.5+ semantics (#1680). - Fixed creating
BigDecimal
instances from non-finiteFloat
values (#1685). - Fixed
BigDecimal#inspect
output for non-finite values (e.g, NaN or -Infinity) (#1683). - Fixed
BigDecimal#hash
to return the same value for twoBigDecimal
objects that are equal (#1656). - Added missing
BigDecimal
constant definitions (#1684). - Implemented
rb_eval_string_protect
. - Fixed
rb_get_kwargs
to correctly handle optional and rest arguments. - Calling
Kernel#raise
with a raised exception will no longer set the cause of the exception to itself (#1682). - Return a
FFI::Function
correctly for functions returning a callback. - Convert to intuitive Ruby exceptions when INVOKE fails (#1690).
- Implemented
FFI::Pointer#clear
(#1687). - Procs will now yield to the block in their declaration context even when called with a block argument (#1657).
- Fixed problems with calling POSIX methods if
Symbol#[]
is redefined (#1665). - Fixed sharing of
Array
andHash
elements for thread-safety of objects (#1601). - Fixed concurrent modifications of
Gem::Specification::LOAD_CACHE
(#1601). - Fix
TCPServer#accept
to set#do_not_reverse_lookup
correctly on the createdTCPSocket
.
Compatibility:
- Exceptions from
coerce
are no longer rescued, like MRI. - Implemented
Integer#{allbits?,anybits?,nobits?}
. Integer#{ceil,floor,truncate}
now accept a precision andInteger#round
accepts a rounding mode.- Added missing
Enumerable#filter
andEnumerator::Lazy#filter
aliases to the respectiveselect
method (#1610). - Implemented more
Ripper
methods as no-ops (#1694). - Implemented
rb_enc_sprintf
(#1702). - Implemented
ENV#{filter,filter!}
aliases forselect
andselect!
. - Non-blocking
StringIO
andSocket
APIs now supportexception: false
like MRI (#1702). - Increased compatibility of
BigDecimal
. String#-@
now performs string deduplication (#1608).Hash#merge
now preserves the key order from the original hash for merged values (#1650).- Coerce values given to
FFI::Pointer
methods. FrozenError
is now defined and is used forcan't modify frozen
object exceptions.StringIO
is now available by default like in MRI, because it is required by RubyGems.
Changes:
- Interactive sources (like the GraalVM polyglot shell) now all share the same binding (#1695).
- Hash code calculation has been improved to reduce hash collisions for
Hash
and other cases.
Performance:
eval(code, binding)
for a fixedcode
containing blocks is now much faster. This improves the performance of renderingERB
templates containing loops.rb_str_cat
is faster due to the C string now being concatenated without first being converted to a Ruby string or having its encoding checked. As a side effect the behaviour ofrb_str_cat
should now more closely match that of MRI.
Ruby is an experimental language in the GraalVM 19.0.0 release
Bug fixes:
- The debugger now sees global variables as the global scope.
- Temporary variables are no longer visible in the debugger.
- Setting breakpoints on some lines has been fixed.
- The OpenSSL C extension is now always recompiled, fixing various bugs when using the extension (e.g., when using Bundler in TravisCI) (#1676, #1627, #1632).
- Initialize
$0
when not run from the 'ruby' launcher, which is needed torequire
gems (#1653).
Compatibility:
do...end
blocks can now haverescue/else/ensure
clauses like MRI (#1618).
Changes:
TruffleRuby.sulong?
has been replaced byTruffleRuby.cexts?
, andTruffleRuby.graal?
has been replaced byTruffleRuby.jit?
. The old methods will continue to work for now, but will produce warnings, and will be removed at a future release.
Bug fixes:
- Fixed
Hash#merge
with no arguments to return a new copy of the receiver (#1645). - Fixed yield with a splat and keyword arguments (#1613).
- Fixed
rb_scan_args
to correctly handle kwargs in combination with optional args. - Many fixes for
FFI::Pointer
to be more compatible with theffi
gem.
New features:
- Rounding modes have been implemented or improved for
Float
,Rational
,BigDecimal
(#1509). - Support Homebrew installed in other prefixes than
/usr/local
(#1583). - Added a pure-Ruby implementation of FFI which passes almost all Ruby FFI specs (#1529, #1524).
Changes:
- Support for the Darkfish theme for RDoc generation has been removed.
Compatibility:
- The
KeyError
raised fromENV#fetch
andHash#fetch
now matches MRI's message formatting (#1633). - Add the missing
key
andreceiver
values toKeyError
raised fromENV#fetch
. String#unicode_normalize
has been moved to the core library like in MRI.StringScanner
will now match a regexp beginning with^
even when not scanning from the start of the string.Module#define_method
is now public like in MRI.Kernel#warn
now supports theuplevel:
keyword argument.
Bug fixes:
- Improved compatibility with MRI's
Float#to_s
formatting (#1626). - Fixed
String#inspect
when the string uses a non-UTF-8 ASCII-compatible encoding and has non-ASCII characters. - Fixed
puts
for strings with non-ASCII-compatible encodings. rb_protect
now returnsQnil
when an error occurs.- Fixed a race condition when using the interpolate-once (
/o
) modifier in regular expressions. - Calling
StringIO#close
multiple times no longer raises an exception (#1640). - Fixed a bug in include file resolution when compiling C extensions.
New features:
Process.clock_getres
has been implemented.
Changes:
debug
,profile
,profiler
, which were already marked as unsupported, have been removed.- Our experimental JRuby-compatible Java interop has been removed - use
Polyglot
andJava
instead. - The Trufle handle patches applied to
psych
C extension have now been removed. - The
rb_tr_handle_*
functions have been removed as they are no longer used in any C extension patches. - Underscores and dots in options have become hyphens, so
--exceptions.print_uncaught_java
is now--exceptions-print-uncaught-java
, for example. - The
rb_tr_handle_*
functions have been removed as they are no longer used in any C extension patches.
Bug fixes:
autoload :C, "path"; require "path"
now correctly triggers the autoload.- Fixed
UDPSocket#bind
to specify family and socktype when resolving address. - The
shell
standard library can now berequire
-d. - Fixed a bug where
for
could result in aNullPointerException
when trying to assign the iteration variable. - Existing global variables can now become aliases of other global variables (#1590).
Compatibility:
- ERB now uses StringScanner and not the fallback, like on MRI. As a result
strscan
is required byrequire 'erb'
(#1615). - Yield different number of arguments for
Hash#each
andHash#each_pair
based on the block arity like MRI (#1629). - Add support for the
base
keyword argument toDir.{[], glob}
.
Updated to Ruby 2.6.2.
Bug fixes:
- Implement
rb_io_wait_writable
(#1586). - Fixed error when using arrows keys first within
irb
orpry
(#1478, #1486). - Coerce the right hand side for all
BigDecimal
operations (#1598). - Combining multiple
**
arguments containing duplicate keys produced an incorrect hash. This has now been fixed (#1469). IO#read_nonblock
now returns the passed buffer object, if one is supplied.- Worked out autoloading issue (#1614).
New features:
- Implemented
String#delete_prefix
,#delete_suffix
, and related methods. - Implemented
Dir.children
andDir#children
. - Implemented
Integer#sqrt
.
Changes:
-Xoptions
has been removed - use--help:languages
instead.-Xlog=
has been removed - use--log.level=
instead.-J
has been removed - use--vm.
instead.-J-cp lib.jar
and so on have removed - use--vm.cp=lib.jar
or--vm.classpath=lib.jar
instead.--jvm.
and--native.
have been deprecated, use--vm.
instead to pass VM options.-Xoption=value
has been removed - use--option=value
instead.- The
-X
option now works as in MRI. --help:debug
is now--help:internal
.ripper
is still not implemented, but the module now exists and has some methods that are implemented as no-ops.
Note that as TruffleRuby RC 13 is built on Ruby 2.4.4 it is still vulnerable to CVE-2018-16395. This will be fixed in the next release.
New features:
- Host interop with Java now works on SubstrateVM too.
Bug fixes:
- Fixed
Enumerator::Lazy
which wrongly rescuedStandardError
(#1557). - Fixed several problems with
Numeric#step
related to default arguments, infinite sequences, and bad argument types (#1520). - Fixed incorrect raising of
ArgumentError
withRange#step
when at least one component of theRange
isFloat::INFINITY
(#1503). - Fixed the wrong encoding being associated with certain forms of heredoc strings (#1563).
- Call
#coerce
on right hand operator ifBigDecimal
is the left hand operator (#1533). - Fixed return type of division of
Integer.MIN_VALUE
andLong.MIN_VALUE
by -1 (#1581). Exception#cause
is now correctly set for internal exceptions (#1560).rb_num2ull
is now implemented as well as being declared in theruby.h
header (#1573).rb_sym_to_s
is now implemented (#1575).R_TYPE_P
now returns the type number for a wider set of Ruby objects (#1574).rb_fix2str
has now been implemented.rb_protect
will now work even ifNilClass#==
has been redefined.BigDecimal
has been moved out of theTruffle
module to match MRI.StringIO#puts
now correctly handlesto_s
methods which do not return strings (#1577).Array#each
now behaves like MRI when the array is modified (#1580).- Clarified that
$SAFE
can never be set to a non-zero value. - Fix compatibility with RubyGems 3 (#1558).
Kernel#respond_to?
now returns false if a method is protected and theinclude_all
argument is false (#1568).
Changes:
TRUFFLERUBY_CEXT_ENABLED
is no longer supported and C extensions are now always built, regardless of the value of this environment variable.- Getting a substring of a string created by a C extension now uses less memory as only the requested portion will be copied to a managed string.
-Xoptions
has been deprecated and will be removed - use--help:languages
instead.-Xlog=
has been deprecated and will be removed - use--log.level=
instead.-J
has been deprecated and will be removed - use--jvm.
instead.-J-cp lib.jar
and so on have been deprecated and will be removed - use--jvm.cp=lib.jar
or--jvm.classpath=lib.jar
instead.-J-cmd
,--jvm.cmd
,JAVA_HOME
,JAVACMD
, andJAVA_OPTS
do not work in any released configuration of TruffleRuby, so have been removed.-Xoption=value
has been deprecated and will be removed - use--option=value
instead.TracePoint
now raises anArgumentError
for unsupported events.TracePoint.trace
andTracePoint#inspect
have been implemented.
Compatibility:
- Improved the exception when an
-S
file isn't found. - Removed the message from exceptions raised by bare
raise
to better match MRI (#1487). TracePoint
now handles the:class
event.
Performance:
- Sped up
String
handling in native extensions, quite substantially in some cases, by reducing conversions between native and managed strings and allowing for mutable metadata in native strings.
Bug fixes:
- Fixed a bug with
String#lines
and similar methods with multibyte characters (#1543). - Fixed an issue with
String#{encode,encode!}
double-processing strings using XML conversion options and a new destination encoding (#1545). - Fixed a bug where a raised cloned exception would be caught as the original exception (#1542).
- Fixed a bug with
StringScanner
and patterns starting with^
(#1544). - Fixed
Enumerable::Lazy#uniq
with infinite streams (#1516).
Compatibility:
- Change to a new system for handling Ruby objects in C extensions which greatly increases compatibility with MRI.
- Implemented
BigDecimal#to_r
(#1521). Symbol#to_proc
now returns-1
like on MRI (#1462).
New features:
- macOS clocks
CLOCK_MONOTONIC_RAW
,_MONOTONIC_RAW_APPROX
,_UPTIME_RAW
,_UPTIME_RAW_APPROX
, and_PROCESS_CPUTIME_ID
have been implemented (#1480). - TruffleRuby now automatically detects native access and threading permissions from the
Context
API, and can run code with no permissions given (Context.create()
).
Bug fixes:
- FFI::Pointer now does the correct range checks for signed and unsigned values.
- Allow signal
0
to be used withProcess.kill
(#1474). IO#dup
now properly sets the newIO
instance to be close-on-exec.IO#reopen
now properly resets the receiver to be close-on-exec.StringIO#set_encoding
no longer raises an exception if the underlyingString
is frozen (#1473).- Fix handling of
Symbol
encodings inMarshal#dump
andMarshal#load
(#1530).
Compatibility:
- Implemented
Dir.each_child
. - Adding missing support for the
close_others
option toexec
andspawn
. - Implemented the missing
MatchData#named_captures
method (#1512).
Changes:
Process::CLOCK_
constants have been given the same value as in standard Ruby.
Performance:
- Sped up accesses to native memory through FFI::Pointer.
- All core files now make use of frozen
String
literals, reducing the number ofString
allocations for core methods. - New -Xclone.disable option to disable all manual cloning.
New features:
- The
nkf
andkconv
standard libraries were added (#1439). Mutex
andConditionVariable
have a new fast path for acquiring locks that are unlocked.Queue
andSizedQueue
,#close
and#closed?
, have been implemented.Kernel#clone(freeze)
has been implemented (#1454).Warning.warn
has been implemented (#1470).Thread.report_on_exception
has been implemented (#1476).- The emulation symbols for
Process.clock_gettime
have been implemented.
Bug fixes:
- Added
rb_eEncodingError
for C extensions (#1437). - Fixed race condition when creating threads (#1445).
- Handle
exception: false
for IO#write_nonblock (#1457). File.expand_path
now raises an exception for a non-absolute user-home.ArgumentError
messages now better match MRI (#1467).- Added support for
:float_millisecond
,:millisecond
, and:second
time units toProcess.clock_gettime
(#1468). - Fixed backtrace of re-raised exceptions (#1459).
- Updated an exception message in Psych related to loading a non-existing class so that it now matches MRI.
- Fixed a JRuby-style Java interop compatibility issue seen in
test-unit
. - Fixed problem with calling
warn
if$stderr
has been reassigned. - Fixed definition of
RB_ENCODING_GET_INLINED
(#1440).
Changes:
- Timezone messages are now logged at
CONFIG
level, use-Xlog=CONFIG
to debug if the timezone is incorrectly shown asUTC
.
Security:
- CVE-2018-16396, tainted flags are not propagated in Array#pack and String#unpack with some directives has been mitigated by adding additional taint operations.
New features:
- LLVM for Oracle Linux 7 can now be installed without building from source.
Bug fixes:
- Times can now be created with UTC offsets in
+/-HH:MM:SS
format. Proc#to_s
now hasASCII-8BIT
as its encoding instead of the incorrectUTF-8
.String#%
now has the correct encoding forUTF-8
andUS-ASCII
format strings, instead of the incorrectASCII-8BIT
.- Updated
BigDecimal#to_s
to usee
instead ofE
for exponent notation. - Fixed
BigDecimal#to_s
to allowf
as a format flag to indicate conventional floating point notation. Previously onlyF
was allowed.
Changes:
- The supported version of LLVM for Oracle Linux has been updated from 3.8 to 4.0.
mysql2
is now patched to avoid a bug in passingNULL
torb_scan_args
, and now passes the majority of its test suite.- The post-install script now automatically detects if recompiling the OpenSSL C extension is needed. The post-install script should always be run in TravisCI as well, see
doc/user/standalone-distribution.md
. - Detect when the system libssl is incompatible more accurately and add instructions on how to recompile the extension.
New features:
Java.synchronized(object) { }
andTruffleRuby.synchronized(object) { }
methods have been added.- Added a
TruffleRuby::AtomicReference
class. - Ubuntu 18.04 LTS is now supported.
- macOS 10.14 (Mojave) is now supported.
Changes:
- Random seeds now use Java's
NativePRNGNonBlocking
. - The supported version of Fedora is now 28, upgraded from 25.
- The FFI gem has been updated from 1.9.18 to 1.9.25.
- JCodings has been updated from 1.0.30 to 1.0.40.
- Joni has been updated from 2.1.16 to 2.1.25.
Performance:
- Performance of setting the last exception on a thread has now been improved.
New features:
- Useful
inspect
strings have been added for more foreign objects. - The C extension API now defines a preprocessor macro
TRUFFLERUBY
. - Added the rbconfig/sizeof native extension for better MRI compatibility.
- Support for
pg
1.1. The extension now compiles successfully, but may still have issues with some datatypes.
Bug fixes:
readline
can now be interrupted by the interrupt signal (Ctrl+C). This fixes Ctrl+C to work in IRB.- Better compatibility with C extensions due to a new "managed struct" type.
- Fixed compilation warnings which produced confusing messages for end users (#1422).
- Improved compatibility with Truffle polyglot STDIO.
- Fixed version check preventing TruffleRuby from working with Bundler 2.0 and later (#1413).
- Fixed problem with
Kernel.public_send
not tracking its caller properly (#1425). rb_thread_call_without_gvl()
no longer holds the C-extensions lock.- Fixed
caller_locations
when called insidemethod_added
. - Fixed
mon_initialize
when called insideinitialize_copy
(#1428). Mutex
correctly raises aTypeError
when trying to serialize withMarshal.dump
.
Performance:
- Reduced memory footprint for private/internal AST nodes.
- Increased the number of cases in which string equality checks will become compile-time constants.
- Major performance improvement for exceptional paths where the rescue body does not access the exception object (e.g.,
x.size rescue 0
).
Changes:
- Many clean-ups to our internal patching mechanism used to make some native extensions run on TruffleRuby.
- Removed obsoleted patches for Bundler compatibility now that Bundler 1.16.5 has built-in support for TruffleRuby.
- Reimplemented exceptions and other APIs that can return a backtrace to use Truffle's lazy stacktraces API.
New features:
Polyglot.export
can now be used with primitives, and will now convert strings to Java, and.import
will convert them from Java.- Implemented
--encoding
,--external-encoding
,--internal-encoding
. rb_object_tainted
and similar C functions have been implemented.rb_struct_define_under
has been implemented.RbConfig::CONFIG['sysconfdir']
has been implemented.Etc
has been implemented (#1403).- The
-Xcexts=false
option disables C extensions. - Instrumentation such as the CPUSampler reports methods in a clearer way like
Foo#bar
,Gem::Specification.each_spec
,block in Foo#bar
instead of justbar
,each_spec
,block in bar
(which is what MRI displays in backtraces). - TruffleRuby is now usable as a JSR 223 (
javax.script
) language. - A migration guide from JRuby (
doc/user/jruby-migration.md
) is now included. kind_of?
works as an alias foris_a?
on foreign objects.- Boxed foreign strings unbox on
to_s
,to_str
, andinspect
.
Bug fixes:
- Fix false-positive circular warning during autoload.
- Fix Truffle::AtomicReference for
concurrent-ruby
. - Correctly look up
llvm-link
alongclang
andopt
so it is no longer needed to add LLVM toPATH
on macOS for Homebrew and MacPorts. - Fix
alias
to work when in a refinement module (#1394). Array#reject!
no longer truncates the array if the block raises an exception for an element.- WeakRef now has the same inheritance and methods as MRI's version.
- Support
-Wl
linker argument for C extensions. Fixes compilation ofmysql2
andpg
. - Using
Module#const_get
with a scoped argument will now correctly autoload the constant if needed. - Loaded files are read as raw bytes, rather than as a UTF-8 string and then converted back into bytes.
- Return 'DEFAULT' for
Signal.trap(:INT) {}
. Avoids a backtrace when quitting a Sinatra server with Ctrl+C. - Support
Signal.trap('PIPE', 'SYSTEM_DEFAULT')
, used by the gemrouge
(#1411). - Fix arity checks and handling of arity
-2
forrb_define_method()
. - Setting
$SAFE
to a negative value now raises aSecurityError
. - The offset of
DATA
is now correct in the presence of heredocs. - Fix double-loading of the
json
gem, which led to duplicate constant definition warnings. - Fix definition of
RB_NIL_P
to be early enough. Fixes compilation ofmsgpack
. - Fix compilation of megamorphic interop calls.
Kernel#singleton_methods
now correctly ignores prepended modules of non-singleton classes. Fixes loadingsass
whenactivesupport
is loaded.- Object identity numbers should never be negative.
Performance:
- Optimize keyword rest arguments (
def foo(**kwrest)
). - Optimize rejected (non-Symbol keys) keyword arguments.
- Source
SecureRandom.random_bytes
from/dev/urandom
rather than OpenSSL. - C extension bitcode is no longer encoded as Base64 to pass it to Sulong.
- Faster
String#==
using vectorization.
Changes:
- Clarified that all sources that come in from the Polyglot API
eval
method will be treated as UTF-8, and cannot be re-interpreted as another encoding using a magic comment. - The
-Xembedded
option can now be set set on the launcher command line. - The
-Xplatform.native=false
option can now load the core library, by enabling-Xpolyglot.stdio
. $SAFE
andThread#safe_level
now cannot be set to1
- raising an error rather than warning as before.-Xsafe
allows it to be set, but there are still no checks.- Foreign objects are now printed as
#<Foreign:system-identity-hash-code>
, except for foreign arrays which are now printed as#<Foreign [elements...]>
. - Foreign objects
to_s
now callsinspect
rather than Java'stoString
. - The embedded configuration (
-Xembedded
) now warns about features which may not work well embedded, such as signals. - The
-Xsync.stdio
option has been removed - use standard RubySTDOUT.sync = true
in your program instead.
New features:
- It is no longer needed to add LLVM (
/usr/local/opt/llvm@4/bin
) toPATH
on macOS. - Improve error message when LLVM,
clang
oropt
is missing. - Automatically find LLVM and libssl with MacPorts on macOS (#1386).
--log.ruby.level=
can be used to set the log level from any launcher.- Add documentation about installing with Ruby managers/installers and how to run TruffleRuby in CI such as TravisCI (#1062, #1070).
String#unpack1
has been implemented.
Bug fixes:
- Allow any name for constants with
rb_const_get()
/rb_const_set()
(#1380). - Fix
defined?
with an autoload constant to not raise but returnnil
if the autoload fails (#1377). - Binary Ruby Strings can now only be converted to Java Strings if they only contain US-ASCII characters. Otherwise, they would produce garbled Java Strings (#1376).
#autoload
now correctly callsmain.require(path)
dynamically.- Hide internal file from user-level backtraces (#1375).
- Show caller information in warnings from the core library (#1375).
#require
and#require_relative
should keep symlinks in$"
and__FILE__
(#1383).- Random seeds now always come directly from
/dev/urandom
for MRI compatibility. - SIGINFO, SIGEMT and SIGPWR are now defined (#1382).
- Optional and operator assignment expressions now return the value assigned, not the value returned by an assignment method (#1391).
WeakRef.new
will now return the correct type of object, even ifWeakRef
is subclassed (#1391).- Resolving constants in prepended modules failed, this has now been fixed (#1391).
- Send and
Symbol#to_proc
now take account of refinements at their call sites (#1391). - Better warning when the timezone cannot be found on WSL (#1393).
- Allow special encoding names in
String#force_encoding
and raise an exception on bad encoding names (#1397). - Fix
Socket.getifaddrs
which would wrongly return an empty array (#1375). Binding
now remembers the file and line at which it was created for#eval
. This is notably used bypry
'sbinding.pry
.- Resolve symlinks in
GEM_HOME
andGEM_PATH
to avoid related problems (#1383). - Refactor and fix
#autoload
so other threads see the constant defined while the autoload is in progress (#1332). - Strings backed by
NativeRope
s now make a copy of the rope whendup
ed. String#unpack
now taints return strings if the format was tainted, and now does not taint the return array if the format was tainted.- Lots of fixes to
Array#pack
andString#unpack
tainting, and a better implementation ofP
andp
. - Array literals could evaluate an element twice under some circumstances. This has now been fixed.
Performance:
- Optimize required and optional keyword arguments.
rb_enc_to_index
is now faster by eliminating an expensive look-up.
Changes:
-Xlog=
now needs log level names to be upper case.-Dtruffleruby.log
andTRUFFLERUBY_LOG
have been removed - use-Dpolyglot.log.ruby.level
.- The log format, handlers, etc are now managed by the Truffle logging system.
- The custom log levels
PERFORMANCE
andPATCH
have been removed.
TruffleRuby was not updated in RC 4
New features:
is_a?
can be called on foreign objects.
Bug fixes:
- It is no longer needed to have
ruby
in$PATH
to run the post-install hook. Qnil
/Qtrue
/Qfalse
/Qundef
can now be used as initial value for global variables in C extensions.- Fixed error message when the runtime libssl has no SSLv2 support (on Ubuntu 16.04 for instance).
RbConfig::CONFIG['extra_bindirs']
is now a String as other RbConfig values.SIGPIPE
is correctly caught on SubstrateVM, and the corresponding write() raisesErrno::EPIPE
when the read end of a pipe or socket is closed.- Use the magic encoding comment for determining the source encoding when using eval().
- Fixed a couple bugs where the encoding was not preserved correctly.
Performance:
- Faster stat()-related calls, by returning the relevant field directly and avoiding extra allocations.
rb_str_new()
/rb_str_new_cstr()
are much faster by avoiding extra copying and allocations.String#{sub,sub!}
are faster in the common case of an empty replacement string.- Eliminated many unnecessary memory copy operations when reading from
IO
with a delimiter (e.g.,IO#each
), leading to overall improvedIO
reading for common use cases such as iterating through lines in aFile
. - Use the byte[] of the given Ruby String when calling eval() directly for parsing.
New features:
- We are now compatible with Ruby 2.4.4.
object.class
on a JavaClass
object will give you an object on which you can call instance methods, rather than static methods which is what you get by default.- The log level can now also be set with
-Dtruffleruby.log=info
orTRUFFLERUBY_LOG=info
. -Xbacktraces.raise
will print Ruby backtraces whenever an exception is raised.Java.import name
imports Java classes as top-level constants.- Coercion of foreign numbers to Ruby numbers now works.
to_s
works on all foreign objects and calls the JavatoString
.to_str
will try toUNBOX
and then re-tryto_str
, in order to provoke the unboxing of foreign strings.
Changes:
- The version string now mentions if you're running GraalVM Community Edition (
GraalVM CE
) or GraalVM Enterprise Edition (GraalVM EE
). - The inline JavaScript functionality
-Xinline_js
has been removed. - Line numbers
< 0
, in the various eval methods, are now warned about, because we don't support these at all. Line numbers> 1
are warned about (at the fine level) but they are shimmed by adding blank lines in front to get to the correct offset. Line numbers starting at0
are also warned about at the fine level and set to1
instead. - The
erb
standard library has been patched to stop using a -1 line number. -Xbacktraces.interleave_java
now includes all the trailing Java frames.- Objects with a
[]
method, except forHash
, now do not return anything forKEYS
, to avoid the impression that you couldREAD
them.KEYINFO
also returns nothing for these objects, except forArray
where it returns information on indices. String
now returnsfalse
forHAS_KEYS
.- The supported additional functionality module has been renamed from
Truffle
toTruffleRuby
. Anything not documented indoc/user/truffleruby-additions.md
should not be used. - Imprecise wrong gem directory detection was replaced. TruffleRuby newly marks its gem directories with a marker file, and warns if you try to use TruffleRuby with a gem directory which is lacking the marker.
Bug fixes:
- TruffleRuby on SubstrateVM now correctly determines the system timezone.
Kernel#require_relative
now coerces the feature argument to a path and canonicalizes it before requiring, and it now uses the current directory as the directory for a synthetic file name from#instance_eval
.
New features:
- The Ruby version has been updated to version 2.3.7.
Security:
- CVE-2018-6914, CVE-2018-8779, CVE-2018-8780, CVE-2018-8777, CVE-2017-17742 and CVE-2018-8778 have been mitigated.
Changes:
RubyTruffleError
has been removed and uses replaced with standard exceptions.- C++ libraries like
libc++
are now not needed if you don't run C++ extensions.libc++abi
is now never needed. Documentation updated to make it more clear what the minimum requirements for pure Ruby, C extensions, and C++ extensions separately. - C extensions are now built by default -
TRUFFLERUBY_CEXT_ENABLED
is assumedtrue
unless set tofalse
. - The
KEYS
interop message now returns an array of Java strings, rather than Ruby strings.KEYS
on an array no longer returns indices. HAS_SIZE
now only returnstrue
forArray
.- A method call on a foreign object that looks like an operator (the method name does not begin with a letter) will call
IS_BOXED
on the object and based on that will possiblyUNBOX
and convert to Ruby. - Now using the native version of Psych.
- The supported version of LLVM on Oracle Linux has been dropped to 3.8.
- The supported version of Fedora has been dropped to 25, and the supported version of LLVM to 3.8, due to LLVM incompatibilities. The instructions for installing
libssl
have changed to match.
New features:
- The Ruby version has been updated to version 2.3.6.
- Context pre-initialization with TruffleRuby
--native
, which significantly improves startup time and loads thedid_you_mean
gem ahead of time. - The default VM is changed to SubstrateVM, where the startup is significantly better. Use
--jvm
option for full JVM VM. - The
Truffle::Interop
module has been replaced with a newPolyglot
module which is designed to use more idiomatic Ruby syntax rather than explicit methods. A new document describes polyglot programming at a higher level. - The
REMOVABLE
,MODIFIABLE
andINSERTABLE
Truffle interop key info flags have been implemented. equal?
on foreign objects will check if the underlying objects are equal if both are Java interop objects.delete
on foreign objects will sendREMOVE
,size
will sendGET_SIZE
, andkeys
will sendKEYS
.respond_to?(:size)
will sendHAS_SIZE
,respond_to?(:keys)
will sendHAS_KEYS
.- Added a new Java-interop API similar to the one in the Nashorn JavaScript implementation, as also implemented by Graal.js. The
Java.type
method returns a Java class object on which you can use normal interop methods. Needs the--jvm
flag to be used. - Supported and tested versions of LLVM for different platforms have been more precisely documented.
Changes:
- Interop semantics of
INVOKE
,READ
,WRITE
,KEYS
andKEY_INFO
have changed significantly, so thatINVOKE
maps to Ruby method calls,READ
calls[]
or returns (bound)Method
objects, andWRITE
calls[]=
.
Performance:
Dir.glob
is much faster and more memory efficient in cases that can reduce to direct filename lookups.SecureRandom
now defers loading OpenSSL until it's needed, reducing time to loadSecureRandom
.Array#dup
andArray#shift
have been made constant-time operations by sharing the array storage and keeping a starting index.
Bug fixes:
- Interop key-info works with non-string-like names.
Internal changes:
- Changes to the lexer and translator to reduce regular expression calls.
- Some JRuby sources have been updated to 9.1.13.0.
New features:
- A new embedded configuration is used when TruffleRuby is used from another language or application. This disables features like signals which may conflict with the embedding application, and threads which may conflict with other languages, and enables features such as the use of polyglot IO streams.
Performance:
- Conversion of ASCII-only Ruby strings to Java strings is now faster.
- Several operations on multi-byte character strings are now faster.
- Native I/O reads are about 22% faster.
Bug fixes:
- The launcher accepts
--native
and similar options in theTRUFFLERUBYOPT
environment variable.
Internal changes:
- The launcher is now part of the TruffleRuby repository, rather than part of the GraalVM repository.
ArrayBuilderNode
now usesArrayStrategies
andArrayMirrors
to remove direct knowledge of array storage.RStringPtr
andRStringPtrEnd
now report as pointers for interop purposes, fixing several issues withchar *
usage in C extensions.