mruby 3.1.0 download

トップへPathお知らせPathmruby 3.1.0 download
print

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互換のキーワード引数が導入されました。
キーワード引数は基本的に序数引数と分離されています。

その他の強化された機能

Configuration Options Changed
いくつかの設定マクロが利用可能になりました。
  • 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
     
Core Libraries
New Methods
  • Array#product
    Array#repeated_combination
    Array#repeated_permutation
    Kernel#__ENCODING__
    Random.bytes
    Random#bytes
    String#center
     
New Gem Enhancement
  • 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)
     
Tools
  • mruby-config now supports --cc and --ld options.
    ・mruby -vのコードダンプ出力から OP_` という接頭辞を削除しました。
    ・オプション --no-ext-opsmrbc による OP_EXT{1,2,3} の使用を禁止することができるようになりました。
##mruby開発者向け機能
  • ・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 VM and bytecode
バイナリ形式の改善により、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 .
     
再導入された Instructions
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
可変個数の引数を持つメソッドコールのためのこれらの命令は、もはや必要ありません。これらは n=15OP_SEND 命令でカバーされています。

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])
     
OP_GETIDX and OP_SETIDX
Execute obj[int] and obj[int] = value respectively, where obj is string|array|hash .

OP_SSEND and OP_SSENDB
これらはそれぞれ OP_SENDOP_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_floatmrb_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- ##影響を受けないCVEsについて
以下のCVEは、本リリースでは問題を起こしません。後のリリースで修正されます。 -------------------------------------------------------------------------------------------------------------------------
mruby 3.0.0 以降、274 個のファイルに対して 983 回のコミットを行い、16,929 個の追加と 11,685 個の削除を行いました。更新の詳細については see Commit Log.
mruby 3.1.0` のリリースにおいて、バグフィックスと改良に取り組んでくれたすべてのコントリビューターに感謝します。

mruby
mrubyとは
Document

ページの先頭へ戻る