Instructions that access pool[i]/syms[i] where i>255.
Load a 16/32-bit integer.
*`OP_LOADL16`
*`OP_STRING16`
*`OP_LOADSYM16`
### `OP_JMPUW`
Instructions that load a 32 bit integer.
Unwinds jump table for rescue/ensure.
*`OP_LOADI32`
### `OP_RAISEIF`
Instruction that unwinds jump table for rescue/ensure.
Renamed from `OP_RAISE`
### `OP_SYMBOL`
Generates a symbol from the pool string. This is a combination of `OP_STRING` and `OP_INTERN`.
### `OP_GETIDX` and `OP_SETIDX`
Execute `obj[int]` and `obj[int] = value` respectively, where `obj` is `string|array|hash`.
### `OP_SSEND` and `OP_SSENDB`
They are similar to `OP_SEND` and `OP_SENDB` respectively. They initialize the `R[a]` by `self` so that we can skip one `OP_LOADSEND` instruction for each call.
## Changed Instructions
### Jump instructions
*`OP_JMPUW`
Jump addresses used to be specified by absolute offset from the start of `iseq`. Now they are relative offset from the address of the next instruction.
### `OP_SEND` and `OP_SENDB`
Method calling instructions are unified. Now `OP_SEND` and `OP_SENDB` (method call with a block) can support both splat arguments and keyword arguments as well.
When `n == 15`, the method takes arguments packed in an array. When `nk == 15`, the method takes keyword arguments packed in a hash.
*`OP_RAISEIF`
### `OP_ARYPUSH`
Instruction that is reserved for the future keyword argument support.
Now takes 2 operands and pushes multiple entries to an array.
* OP_SENDVK
## Removed Instructions
...
...
@@ -165,12 +141,17 @@ Instructions for old exception handling
*`OP_EPUSH`
*`OP_EPOP`
Instructions for method calls with variable number of arguments. They are covered by `OP_SEND` instruction with `n=15`.
No more operand extension
*`OP_EXT1`
*`OP_EXT2`
*`OP_EXT3`
*`OP_SENDV`
*`OP_SENDVB`
## Changed Instructions
Jump addresses used to be specified by absolute offset from the start of `iseq`. Now they are relative offset from the address of the next instruction.
## `Random` now use `xoshiro128++`
## `Random` now use `xoshiro128++`.
For better and faster random number generation.
...
...
@@ -178,4 +159,4 @@ For better and faster random number generation.
Preallocated symbols are interned at compile-time. They can be accessed via symbols macros (e.g. `MRB_SYM()`).
See [Symbols](./guides/symbol.md).
See [Symbols](https://github.com/mruby/mruby/blob/master/doc/guides/symbol.md).
# User visible changes in `mruby3.1` from `mruby3.0`
# Build System
## `build_config` directory
Several configurations for new platforms are added:
*`cross-mingw-winetest.rb`
*`cross-mingw.rb`
*`nintendo_switch.rb`
*`serenity.rb`
Some new configurations for added for convenience.
*`minimal`: minimal configuration
*`host-f32`: compiles with `mrb_float` as 32 bit `float`
*`host-nofloat`: compiles with no float configuration
And `android_arm64-v8a.rb` was renamed to `android_arm64_v8a.rb` for consistency.
# Language Changes
## Keyword Arguments
CRuby3.0 compatible keyword arguments are introduced.
Keyword arguments are basically separated from ordinal arguments
# Configuration Options Changed
Some configuration macros are available:
*`MRB_WORDBOX_NO_FLOAT_TRUNCATE`: by default, float values are packed in the word if possible, but define this macro to allocate float values in the heap.
*`MRB_USE_RO_DATA_P_ETEXT`: define this macro if `_etext` is available on your platform.
*`MRB_NO_DEFAULT_RO_DATA_P`: define this macro to avoid using predefined `mrb_ro_data_p()` function
# Internal Changes
## Reintroduced Instructions
`mruby3.0` removed `OP_EXT1`, `OP_EXT2`, `OP_EXT3` for operand extension. But the operand size limitations was too tight for real-world application.
`mruby3.1` reintroduces those extension instructions.
## Removed Instructions
`mruby3.1` removed following instructions.
*`OP_LOADL16`
*`OP_LOADSYM16`
*`OP_STRING16`
*`OP_LAMBDA16`
*`OP_BLOCK16`
*`OP_METHOD16`
*`OP_EXEC16`
Those instructions are no longer needed by reintroduction of extension instructions.
*`OP_SENDV`
*`OP_SENDVB`
Those instructions for method calls with variable number of arguments are no longer needed. They are covered by `OP_SEND` instruction with `n=15`.
## New Instructions
`mruby3.1` introduces following new instructions.
*`OP_GETIDX`: takes 2 operands `a[b]`
*`OP_SETIDX`: takes 3 operands `a[b]=c`
*`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_GETIDX` and `OP_SETIDX`
Execute `obj[int]` and `obj[int] = value` respectively, where `obj` is `string|array|hash`.
### `OP_SSEND` and `OP_SSENDB`
They are similar to `OP_SEND` and `OP_SENDB` respectively. They initialize the `R[a]` by `self` first so that we can skip one `OP_LOADSELF` instruction for each call.
## Changed Instructions
### `OP_SEND` and `OP_SENDB`
Method calling instructions are unified. Now `OP_SEND` and `OP_SENDB` (method call with a block) can support both splat arguments and keyword arguments as well.