mruby 3.4.0
We are announcing the first stable release of mruby 3.4 series - mruby 3.4.0.
Describes the new features and changes in mruby 3.4.
The main changes in mruby 3.4 are also described in doc/mruby3.4.md.
User visible changes in mruby3.4
from mruby3.3
“NOTE:” are changes to be aware of.
The language
- mruby now supports
private
and protected
visibitily (b0db0bd)
- Maximum length of inlined symbols reduced from 5 to 4 characters to provide space for visibility flags (6442a01)
- Many methods are made private according to CRuby visibility (4a0e806)
- Generate OP_SSEND for
self.method
type calls (111fe4b)
initialize
method will be always private (eb8b412)
- Add new hooks
method_removed
, method_undefined
(9c74f6e)
- Add new hooks
singleton_method_removed
, singleton_method_undefined
(0863c08)
- Updated
OP_DEF
output from codedump (3a3e877)
- Better handling of binary strings, e.g. String#b (b0127f0)
- Hash
to_s
format has changed (baeeb5e)
- Some encoding related method such as
#force_encoding
(e47b4ca), #b
(b0127f0)
- Constant folding for
String#+
(6687bdd)
- Remove Float bit-operation (db8368f)
- use SWAR technique for strlen performance (cbb31e6)
- use merge sort for
Array#sort
(5bd63d6)
Changes in C API
- pool.c renamed to mempool.c (and mrb_pool to mrb_mempool) (49525fa)
- mrb_pool_value renamed to mrb_irep_pool to reduce confusion (62ef5db)
- rename BOXNIX_SET_VALUE to BOXNO_SET_VALUE (#6397)
MRB_FROZEN_P()
is replaced by mrb_frozen_p()
(c11d18e)
- rename
color
to gc_color
(0e79f6b, 1e36d76)
- add
obj->frozen
instead of flags MRB_SET_FROZEN_FLAG
/MRB_UNSET_FROZEN_FLAG
(8276143)
Build & Configuration
- New Build Target:
test:run:serial
, test:run:serial:lib
, test:run:serial:bin
(#6423)
- New Platform: Playstation Portable (#6022)
- New Platform: emscripten (#6487)
- New Config: no-float (with MRB_NO_FLOAT) (32200f1)
Changes in mrbgems
- mruby-print: removed; if you do not use
mruby-io
, mruby use #print
etc. in the core (8c8bbd9)
- mruby-enum-lazy: Add Enumerable::Lazy#grep_v to mruby-enum-lazy (#6171)
- mruby-io: Add
level
argument to File.dirname
(#6463)
- mruby-io: File.absolute_path? (#6482)
- mruby-io: File.absolute_path (96113a2)
- mruby-toplevel-ext: top-level public/private/protected moved to the core (2a876d2)
- mruby-metaprog: method list methods now works according to the visibility (9229da1)
- mruby-metaprog:
public_instance_methods
, private_instance_methods
, protected_instance_methods
(9e3e7b2)
- mruby-encoding: MRB_UTF8_STRING turned on automatically with this gem (74bdae9)
Fixed GitHub Issues
- #6173 Fails to build with tcc(Tiny C Compiler)
- #6156 ‘/LIBPATH’ issue
- #6183 “.e”.to_f returns NAN
- #6182 mrb_read_float() converts “0.3” with a small error compared to strtod()
- #6210 Unary minus seems broken
- #6255 Wrong number of characters in broken UTF-8 string
- #4038 Heap buffer overflow in OP_ENTER
- #6262 Unable to define == for objects when using Array#delete
- #6267 When MRB_UTF8_STRING is enabled, giving byte characters for String#index and String#split gives wrong results
- #6277 MSVC: can’t use malloc() in string.c with WIN32_LEAN_AND_MEAN
- #6240 Differentiate between lib and lib64 in the build settings.
- #6304 Calling method_missing with only Kwargs passes arguments incorrectly
- #6317 mrb_gc_register() may cause GC and collect the object being protected
- #6307 Planned change patch for mrb_vm_exec()
- #6298 foo :bar {} is legal in mruby?
- #6326 Detect “Use-after-free” with address sanitizer
- #5358 static warning from getpwnam
- #6339 mrb_ary_delete() may refer to an invalid address (use-after-free)
- #6346 Block kwargs are passed as last positional arg when using yield
- #6365 powl() not available when compiling for Dreamcast
- #6369 100x Performance Regression from 3.1
- #6270 NODE_ZSUPER from deeply nested blocks will result in a truncated digits for block index in OP_ARGARY
- #6297 Assigning to a block variable changes the actual block (thus affecting block_given? and yield)
- #6389 instance_exec named block args don’t work properly
- #6388 Recent commit broke my windows build
- #6411 Wrong function unwinding when using return in a block
- #6439 OP_JMPUW does not call the ensure block when it jumps to the beginning of the begin block
- #6441 break inside while loop will execute the ensure block outside of the while loop
- #6453 Bigint: incorrect behavior of ^ operator
- #6452 Bigint: weird mod behavior
- #6451 Bigint: incorrect division behavior
- #6456 bigint: bug with division of a small number by a bigint
- #6466 mruby-bin-mruby using Kernel#p and Kernel#print in bintest fails test
- #6467 Heap-Use-After-Free due to Recursive group_by Calls
- #6471 Discrepancy in codegen for binary operations between master branch and 3.3.0
- #6477 heap-buffer-overflow in mrb_vm_exec
- #6485 Hash#rehash does not check if the hash is frozen
- #6483 Hash#default_proc= accepts arbitrary objects that are not callable
- #6491 Destroy existing string literals when composing string literals
Merged Pull Requests (User Visible Ones)
- #6171 Add Enumerable::Lazy#grep_v to mruby-enum-lazy
- #6174 Fix MRUBY_PACKAGE_DIR in mruby-config.bat
- #6175 Corrected strange conditional in mrb_vm_run()
- #6176 Stop assuming alias proc in CI_PROC_SET()
- #6177 gha: add macOS 14 to the build
- #6184 Remove the L_STOP label
- #6185 Added mrb_callinfo::u.keep_context for clarity
- #6186 Omit NULL check of e->cxt in OP_RETURN_BLK
- #6191 Speed up symbol equality comparison
- #6192 Fix
OP_STOP
with exception
- #6193 Fix wrong assertion in
OP_SENDB
.
- #6194 Simplify the calculation of the number of closures in
MRB_TT_FIBER
- #6197 Fix int_xor to call flo_xor.
- #6201 tasks/doc.rake: standardize the
rake doc
error messages
- #6202 Remove the
.yardoc
folder with rake doc:clean:api
- #6204 Clean up the
.editorconfig
file
- #6209 Minor
.gitignore
clean up
- #6211 Minor
.gitignore
clean up; order entries
- #6216 Shared empty
iv_tbl
of module
- #6217 Strict declaration for
mrb_istruct_size()
- #6219 Avoid assigning a fixed value in the loop
- #6220 Reorganize
mrb_cache_entry
and mrb_method_t
types
- #6221 Arranging
each_backtrace()
- #6222 Need to synchronize
dbg->regs
after VM call in mrdb
- #6224
mrb_env_unshare()
to break the link to fiber
- #6225 Revert “Adjust environment when
mrb_exec_irep
happened.”
- #6227 fix:
Array#shuffle(!)
result distribution
- #6228 Revert “
env
referred from top-level callinfo should not be unshared; fix #4019”
- #6230 Fix status of fiber after switched by exception raised
- #6231 Add a way to let other gems handle closing of fds in mruby-io
- #6232 Fold the code for freeing
env
- #6233 Free stack memory at end of fiber
- #6235 fix
Array#delete
always firing the block when deleting nil
- #6236 unify the code for filter methods (and speed up
#reject!
)
- #6237 Stricter env objects to attach to ci
- #6238 Minimize zero initialization of the stack
- #6243 Fixed base64 decoding in
mruby-pack
- #6244 Revise scope of role of
mrb_vm_run()
- #6246 Fix typo in
test/t/hash.rb
- #6249 Fix grammar in
src/vm.c
; catched
-> caught
- #6250 Fix spelling
- #6251 Clean up root move
CODEOWNERS
to .github
directory
- #6253 Allow recycling fibers by GC if not referenced directly
- #6256 Update documentation for
mrb_top_run()
- #6257 fix some mrbconf.md typos
- #6260 Remove
exc_caught
from mrb_vm_exec()
- #6261 fix:
to_a
integer ranges with begin > end
failing
- #6263 fix:
Array#delete
mistakenly calling block even if not passed
- #6264 Must pass keyword arguments for
Kernel#to_enum
- #6265 Fixes
Dir.children
and Dir.each_child
- #6266 Passes the nonexistent key as a block argument in
Array#delete
- #6273 Improvements to
mrb_protect_atexit()
- #6275 Fixed
Binding#eval
that failed to assign to the same variable
- #6276 Always run
atexit
on the top-level call frame
- #6279 Include headers for malloc() explicitly; fix #6277
- #6280 Remove
MRB_ENV_CLOSED
flag
- #6281 Fixes local variables in
mruby-binding
.
- #6283 Simplify
uvenv()
- #6288 Detach
env
of ci explicitly on atexit
- #6289 Simplify
OP_RETURN_BLK
and OP_BREAK
- #6290 Allow to change the output directory name of the
libmruby
file
- #6293 Changed the instruction table in
opcode.md
- #6294 Optimise
mrb_iv_get
- #6302 Minor cleanup in mrb_str_init
- #6303 mrb_str_aset_m() should return replace instead of str
- #6305 Protect keyword arguments in
prepare_missing()
- #6308 Assume that
MRB_CATCH()
has mrb->exc
set
- #6310 Doubling the call stack when extending it
- #6311 Added fast-path for positional arguments less than 15 in
OP_SEND
- #6312 Omit error checking at
OP_RETURN
, OP_RETURN_BLK
and OP_BREAK
- #6313 Fix wrong column number in opcode.md
- #6314 Optimize even?/odd? for big integers
- #6318 Shrink variables in
mrb_vm_exec()
- #6320 Shrinking the code in
OP_BREAK
and OP_RETURN_BLK
- #6321 Avoid warnings in
lib/**/*.rb
- #6322 Fix mrb_ro_data_p on Intel Mac
- #6324 Remove
localjump_error()
- #6327 fix ncurses linking issues
- #6328 Fix use-after-free in
obj_free()
for env objects
- #6329 Fix use-after-free in
mrb_obj_alloc()
- #6330 Add a precondition to call
mrb_env_unshare()
.
- #6331 Restore the GC arena with tests
- #6332 Must not depend on the “host” build to generate
mruby-compiler/core/y.tab.c
- #6333 Reduce the number of branch instructions in the
heap_p()
- #6335 Add
return_ci
in CHECKPOINT_MAIN()
of OP_RETURN
- #6338 Need to place static proc objects into 8-byte alignments
- #6340 Fix use-after-free for
Array#<=>
- #6341 Need to restore the GC arena after some function calls
- #6344 prefer using
mrb_yield
to call block arguments
- #6347 codegen.c,parse.y: remove flattening of
yield
arguments; fix #6346
- #6348 Cancel the warning disablement
- #6349 Perform GC before deleting directories
- #6350 Fixed character encoding conversion function mismatch
- #6351 Remove unnecessary
mrb_gc_arena_restore()
- #6353 Fix use-after-free in
mrb_ary_delete()
- #6356 Making splat argument objects invisible from Ruby side
- #6373 Add build config for Milk-V Duo (RISC-V Linux) board
- #6382 Make array objects invisible in
mrb_gc_register()
- #6385 Small improvements for
mrb_gc_register()
- #6386 Avoid calling
mrb_gv_set()
from mrb_gc_unregister()
- #6387 Small improvements for
mrb_gc_unregister()
- #6390 Fix use-after-free by
mrb_gc_unregistor()
- #6391 Fixed argument forwarding in
instance_exec
- #6392 Fix argument forwarding in
mrb_exec_irep()
- #6393 Follow-up to #6391
- #6395 Storing method-id inside Symbol#to_proc
- #6396 Milk-V Build Config: update GPIO gem URL
- #6397 boxing_no.h: rename BOXNIX_SET_VALUE -> BOXNO_SET_VALUE
- #6399 Add macOS 15 to the build
- #6405
io_read
: use %i
instead of %d
in call to mrb_raisef
- #6407 Allow to exclude specific files in
rake install
- #6408 Improve compliance with C++ standards
- #6410 Put
#include <stdlib.h>
in parse.y
- #6412 Distinguish the call frame of the generator with
OP_RETURN_BLK
- #6413 Add links to documentation in
README.md
- #6415 Fix numbered parameters when used as a singleton
- #6416 Optimize the “new” method’s iseq
- #6419 Follow Ruby’s behavior for numbered parameters in -> {}
- #6420 Update
labeler.yml
: add label for the tools
directory
- #6422 Add annotations for function names defined in the preprocessor
- #6423 Adding a serialized test task
- #6427 Need to update
ci
variable after re-entry to VM
- #6428 Change the limits of OP_ADDI and OP_SUBI from 0-127 to 0-255.
- #6429 Fix numbered parameters when used as hash keys
- #6432 Moving code in macro arguments out of macros
- #6434 Added document “Layout of the mruby filesystem”
- #6436 Make
rake doc:update-index
prettier friendly
- #6437 Add more details to the pre-commit config
- #6438 Remove unused
MRuby::Build#list_install_excludes
method
- #6440 Fix
redo
keyword
- #6442 Fixed wrong range condition in
OP_JMPUW
- #6443 Fix NODE_NEGATE for bigints
- #6444 Add test cases for bigints
- #6446 Omit the
_WIN64
definition check
- #6447 Fixed
File.expand_path
- #6448 Suppress presym in
mruby/ext/io.h
file
- #6449 Using presym in the
mruby-io/src/file_test.c
file
- #6450 Change
MRB_WITH_IO_PREAD_PWRITE
configuration name
- #6454 mruby-bigint: handle rhs bigint in int_mod and int_divmod functions
- #6455 mruby-bigint: fix rounding behavior in mpz_mdiv and mpz_mdivmod functions
- #6457 bigint: fix bug with division of a small number by a bigint
- #6459
FileTest
is a module
- #6461 To create a release package file in draft
- #6462 Properly cast the return value of
memchr()
- #6463 Add
level
argument to File.dirname
- #6465 Add initial playstation portable crossbuild support
- #6468 Fixed missing changes to
IB_FIND_BY_KEY()
parameter names
- #6469 Add more
const
qualifier for RProc
- #6472 Moved tests for
Integer#quo
- #6473 Hide
mpz_and()
symbol
- #6473 Hide mpz_and() symbol
- #6474 Avoid array object creation with “unknown keyword” error
- #6475 Don’t include deleted mruby-print
- #6478 Fixed buffer overrun in function
chars2bytes()
- #6479 Reimplementation of
File.expand_path
method
- #6482 Add
File.absolute_path?
method
- #6487 Add Emscripten toolchain & build_config
We have done 1,188 commits to 354 files with 20,650 additions and 21,537 deletions since mruby 3.3.0. For more detail of the updates, see Commit Log.
Thanks to all the contributors who have worked on bug fixes and improvements in the release of mruby 3.4.0
.