2022/6/23
mruby 3.1.0 download
mruby 3.1.0
mruby 3.1 シリーズ初の安定版mruby3.1.0をリリースです。mruby 3.1.0.
mruby 3.1 の新機能と変更点について説明しています。
mruby 3.1での主な変更点は、doc/mruby3.1.md.のページでも説明しています。
-------------------------------------------------------------------------------------------------------------------------
新機能
Core Language Features
Keyword Arguments
CRuby3.0互換のキーワード引数が導入されました。
キーワード引数は基本的に序数引数と分離されています。
その他の強化された機能
- ・Implement endless-def Ruby:Feature#16746
・Replace R-assignment by single-line pattern matching Ruby:Feature#15921
・Support squiggly heredocs. #5246
・ハッシュ値省略 Ruby:Feature#14579
いくつかの設定マクロが利用可能になりました。
- ・MRB_WORDBOX_NO_FLOAT_TRUNCATE: デフォルトでは、float 値は可能な限り word に詰め込まれますが、このマクロを定義すると float 値をヒープに割り当てることができます。
・MRB_USE_RO_DATA_P_ETEXT: お使いのプラットフォームで _etext が利用可能な場合は、このマクロを定義します。
・MRB_NO_DEFAULT_RO_DATA_P: 定義済みの mrb_ro_data_p() 関数を使用しないようにするには、このマクロを定義します。
Updated Features
New build configurations
build_config ディレクトリにいくつかの新しいビルドコンフィギュレーションが追加されました。
- ・cross-mingw-winetest.rb
・cross-mingw.rb
・nintendo_switch.rb
・serenity.rb
・minimal: minimal configuration
・host-f32: compiles with mrb_float as as 32 bit float
・host-nofloat: compiles with no float configuration
・android_arm64_v8a.rb: renamed from android_arm64-v8a.rb
New Methods
- ・Array#product
・Array#repeated_combination
・Array#repeated_permutation
・Kernel#__ENCODING__
・Random.bytes
・Random#bytes
・String#center
- ・mrbgems/mruby-pack now supports M directive (Q encoding)
・mrbgems/mruby-pack now supports X directive (back-up by bytes)
・mrbgems/mruby-pack now supports @ directive (absolute position)
・mrbgems/mruby-pack now supports w directive (BER compression)
- ・mruby-config now supports --cc and --ld options.
・mruby -vのコードダンプ出力から OP_` という接頭辞を削除しました。
・オプション --no-ext-ops で mrbc による OP_EXT{1,2,3} の使用を禁止することができるようになりました。
- ・receiveクラス/モジュールの mrb_get_args() に新しい指定子 c を追加しました。
Breaking Changes
互換性のない変更されたメソッド
- ・Kernel#printf (mruby-sprintf) Format specifiers %a and %A are removed.
・Kernel#puts (mruby-print) Now expand Array arguments.
バイナリ形式の改善により、mrubyのバイナリには後方互換性がなくなりました。
mruby 3.1上でmrubyのバイナリを実行するには、mruby 3.1 の mrbc を使って再コンパイルしてください。
- ・Upgrade mruby VM version RITE_VM_VER to 0300 (means mruby 3.0 or after).
・Upgrade mruby binary version RITE_BINARY_FORMAT_VER to 0300 .
mruby3.0 では、オペランド拡張のための OP_EXT1, OP_EXT2, OP_EXT3 が削除されました。しかし、オペランドサイズの制限は実際のアプリケーションでは厳しすぎたようです。
mruby3.1` では、これらの拡張命令を再導入しました。
削除されたInstructions
mruby3.1では以下のInstructionsが削除されました。
- ・OP_LOADL16
・OP_LOADSYM16
・OP_STRING16
・OP_LAMBDA16
・OP_BLOCK16
・OP_METHOD16
- ・OP_SENDV
・OP_SENDVB
New Instructions
mruby3.1では下記の新しいInstructionsが追加されました。
- ・OP_GETIDX: takes 1 operands R[a][a+1]
・OP_SETIDX: takes 1 operands R[a][a+1]=R[a+2]
・OP_SSEND: takes 3 operands a=self.b(c...) ; see OP_SEND
・OP_SSENDB: takes 3 operands a=self.b(c...){...}; see OP_SEND
・OP_SYMBOL: takes 2 operands R[a] = intern(Pool[b])
Execute obj[int] and obj[int] = value respectively, where obj is string|array|hash .
OP_SSEND and OP_SSENDB
これらはそれぞれ OP_SEND と OP_SENDB に似ています。これらは R[a] を最初に self で初期化するので、それぞれの呼び出しに対して OP_LOADSELF 命令を1つスキップすることができます。
OP_SYMBOL
poolに置かれた文字列をシンボルとして取り出します。
Changed Instructions
OP_SEND and OP_SENDB
メソッド呼び出し命令は統一されています。OP_SENDとOP_SENDB` (ブロックを使ったメソッドコール) は、splat引数とキーワード引数の両方をサポートすることができるようになりました。
命令の簡単な説明です。
|OP_SEND | BBB | R[a] = R[a].call(Syms[b],R[a+1..n],R[a+n+1],R[a+n+2]..nk) c=n|nk<<4 |
|OP_SENDB | BBB | R[a] = R[a].call(Syms[b],R[a+1..n],R[a+n+1..nk],R[a+n+2..nk],&R[a+n+2*nk+2]) c=n|nk<<4 |
オペランド C は引数の数を指定します。下位 4 ビット (n) は序数引数の数を表し、上位 4 ビット (nk) はキーワード引数の数を表します。
n == 15のとき、このメソッドは配列にパックされた引数を受け取る。nk == 15 のとき、このメソッドはハッシュでパックされたキーワード引数を受け取ります。
OP_ARYPUSH
2 つのオペランドを受け取り、配列に複数のエントリをプッシュするようになりました。
Boxing が更新されました
Word Boxing
MRB_WORD_BOXINGは、デフォルトで mrb_float のサイズが mrb_int のサイズと同じか小さい場合に、浮動小数点数をワードにpackするようになりました。 mrb_float と mrb_int のサイズが同じ場合、 mrb_float の最後の2ビットが切り取られ、フラグとして使用されます。完全な精度が必要な場合は、上記のように MRB_WORDBOX_NO_FLOAT_TRUNCATE を定義する必要があります。
NaN Boxing
以前の NaN ボクシングは NaN 表現で値をpackしていましたが、ポインタの取り出しは浮動小数点数の参照よりはるかに頻繁です。そこで、NaN表現に定数オフセットを追加し、ポインタ表現の上位ビットをクリアするようにしました。このような表現を”Favor Pointer”NaN Boxingと呼びます。
また、以前のNaNボックスでは、NaN値にフィットするように mrb_int のサイズを4バイト(32ビット)に制限していました。現在は、32ビットの範囲に収まらない場合は、Word Boxingと同じようにヒープに整数値を確保します。
Constant Folding
コードgeneratorを更新し、命令数を削減した。
a = 2 * 5
will be interpreted as
a = 10
In addition, we have improved peephole optimizations, for example:
GETIV R4 :@foo
MOVE R1 R4
to
GETIV R1 :@foo
String#hash now use FNV1a algorithm
For better and faster hash values.
-------------------------------------------------------------------------------------------------------------------------
Major bug fixes
- ・Fix infinite recursive call bugs in integer division 98799aa6
・Fix to raise TypeError with super inside instance_eval / class_eval #5476
・Fix to call method_added hooks on method definitions; #2339
・Fix a potential buffer overflow in time_zonename 26340a88
・Fix Module.instance_eval bug #5528
・Fix fix M packing bug bfe2bd49
・Fix a bug regarding attribute assignment with kargs de2b4bd0
・Fix SIGSEGV with mrbgems/mruby-method #5580
・Fix print error before cleanup in codegen_error() #5603
・Fix a bug in unpacking BER #5611
・Fix a bug with numbered parameters as arguments #5605
・Fix mrb_ary_shift_m initialization bug 27d1e013
・Fix keyword argument with super #5628
・Fix a bug with numbered parameters on toplevel 7e7f1b2f
・Fix keyword argument bug #5632
・Fix multiple assignments in parameters #5647
・Fix keyword parameters not passing through super #5660
・Fix infinite loop from unclosed here-doc #5676
・Fix negative integer division bug #5678
CVEs
修正済 CVEs
本リリースでは、以下のCVEを修正しました。
CVE-2021-
- ・CVE-2021-4110
・CVE-2021-4188
・CVE-2022-0080
・CVE-2022-0240
・CVE-2022-0326
・CVE-2022-0481
・CVE-2022-0631
・CVE-2022-0632
・CVE-2022-0890
・CVE-2022-1071
・CVE-2022-1106
・CVE-2022-1201
・CVE-2022-1427
以下のCVEは、本リリースでは問題を起こしません。後のリリースで修正されます。
- ・CVE-2022-0481
・CVE-2022-0525
・CVE-2022-0570
・CVE-2022-0614
・CVE-2022-0623
・CVE-2022-0630
・CVE-2022-0717
・CVE-2022-1212
・CVE-2022-1276
・CVE-2022-1286
mruby 3.0.0 以降、274 個のファイルに対して 983 回のコミットを行い、16,929 個の追加と 11,685 個の削除を行いました。更新の詳細については see Commit Log.
mruby 3.1.0` のリリースにおいて、バグフィックスと改良に取り組んでくれたすべてのコントリビューターに感謝します。