summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enumerator/mrblib
AgeCommit message (Collapse)Author
2021-10-12Support Ruby3.0 keyword arguments.Yukihiro "Matz" Matsumoto
The Difference Since Ruby1.9, the keyword arguments were emulated by Ruby using the hash object at the bottom of the arguments. But we have gradually moved toward keyword arguments separated from normal (positinal) arguments. At the same time, we value compatibility, so that Ruby3.0 keyword arguments are somewhat compromise. Basically, keyword arguments are separated from positional arguments, except when the method does not take any formal keyword arguments, given keyword arguments (packed in the hash object) are considered as the last argument. And we also allow non symbol keys in the keyword arguments. In that case, those keys are just passed in the `**` hash (or raise `ArgumentError` for unknown keys). The Instruction Changes We have changed `OP_SEND` instruction. `OP_SEND` instruction used to take 3 operands, the register, the symbol, the number of (positional) arguments. The meaning of the third operand has been changed. It is now considered as `n|(nk<<4)`, where `n` is the number of positional arguments, and `nk` is the number of keyword arguments, both occupies 4 bits in the operand. The number `15` in both `n` and `nk` means variable sized arguments are packed in the object. Positional arguments will be packed in the array, and keyword arguments will be packed in the hash object. That means arguments more than 14 values are always packed in the object. Arguments information for other instructions (`OP_SENDB` and `OP_SUPER`) are also changed. It works as the third operand of `OP_SEND`. the difference between `OP_SEND` and `OP_SENDB` is just trivial. It assigns `nil` to the block hidden arguments (right after arguments). The instruction `OP_SENDV` and `OP_SENDVB` are removed. Those instructions are replaced by `OP_SEND` and `OP_SENDB` respectively with the `15` (variable sized) argument information. Calling Convention When calling a method, the stack elements shall be in the order of the receiver of the method, positional arguments, keyword arguments and the block argument. If the number of positional or keyword arugument (`n` or `nk`) is zero, corresponding arguments will be empty. So when `n=0` and `nk=0` the stack layout (from bottom to top) will be: +-----------------------+ | recv | block (or nil) | +-----------------------+ The last elements `block` should be explicitly filled before `OP_SEND` or assigned to `nil` by `OP_SENDB` internally. In other words, the following have exactly same behavior: OP_SENDB clears `block` implicitly: ``` OP_SENDB reg sym 0 ``` OP_SEND clears `block` implicitly: ``` OP_LOADNIL R2 OP_SEND R2 sym 0 ``` When calling a method with only positional arguments (n=0..14) without keyword arguments, the stack layout will be like following: +--------------------------------------------+ | recv | arg1 | ... | arg_n | block (or nil) | +--------------------------------------------+ When calling a method with arguments packed in the array (n=15) which means argument splat (*) is used in the actual arguments, or more than 14 arguments are passed the stack layout will be like following: +-------------------------------+ | recv | array | block (or nil) | +-------------------------------+ The number of the actual arguments is determined by the length of the argument array. When keyword arguments are given (nk>0), keyword arguments are passed between positional arguments and the block argument. For example, when we pass one positional argument `1` and one keyword argument `a: 2`, the stack layout will be like: +------------------------------------+ | recv | 1 | :a | 2 | block (or nil) | +------------------------------------+ Note that keyword arguments consume `2*nk` elements in the stack when `nk=0..14` (unpacked). When calling a method with keyword arguments packed in the hash object (nk=15) which means keyword argument splat (**) is used or more than 14 keyword arguments in the actual arguments, the stack layout will be like: +------------------------------+ | recv | hash | block (or nil) | +------------------------------+ Note for mruby/c When mruby/c authors try to support new keyword arguments, they need to handle the new meaning of the argument information operand. If they choose not to support keyword arguments in mruby/c, it just raise error when `nk` (taken by `(c>>4)&0xf`) is not zero. And combine `OP_SENDV` behavior with `OP_SEND` when `n` is `15`. If they want to support keyword arguments seriously, contact me at <[email protected]> or `@yukihiro_matz`. I can help you.
2021-09-04Rename `Kernel#__method__` to `Kernel#__callee__`KOBAYASHI Shuji
Because the current behavior of `__method__` is equivalent to `__callee__`. Example: # example.rb def src __send__(ARGV[0]) end alias dst src %w[src dst].each {|n| puts "call #{n} => #{__send__(n).inspect}"} Ruby: $ ruby example.rb __method__ call src => :src call dst => :src $ ruby example.rb __callee__ call src => :src call dst => :dst mruby: $ mruby example.rb __method__ call src => :src call dst => :dst
2020-10-12Generate C struct from `irep` instead of binary dump.Yukihiro "Matz" Matsumoto
2019-09-16Merge pull request #4255 from shuujii/enumerator-size-is-not-supportedYukihiro "Matz" Matsumoto
`Enumerator#size` is not supported [ci skip]
2019-09-14Replace `loop` method with `while true` loop to gain performance.Yukihiro "Matz" Matsumoto
2019-09-13Add `Enumerator.produce` from Ruby2.7Yukihiro "Matz" Matsumoto
2019-04-21Commented out `String#scan` because it is not implemented yetKOBAYASHI Shuji
2019-02-08Add `NoMethodError` tests to `mruby-enumerator`KOBAYASHI Shuji
2019-02-08Update #4265 patch.Yukihiro "Matz" Matsumoto
* Update doc comment to clarify `Enumerator.new` without a block is deprecated and left only for internal use. * Fixed some cases `mruby` raise `ArgumentError` too eagerly compared with `CRuby`.
2019-02-08Fix `Enumerator#(initialize|inspect)` for `nil`/`false`KOBAYASHI Shuji
2019-01-31`Enumerator#size` is not supported [ci skip]KOBAYASHI Shuji
2019-01-30Remove unneeded `dup` in `Enumerator#initialize`KOBAYASHI Shuji
2018-12-30mruby-enumerator: Refine accessors (obj/meth/args/fib).KOBAYASHI Shuji
- `fib=` writer is not used. - All accessors are used as public (e.g. in `initialized_copy`).
2018-11-19Removed `to_ary` conversion method.Yukihiro "Matz" Matsumoto
2018-11-19Remove implicit conversion using `to_int` method.Yukihiro "Matz" Matsumoto
The ISO standard does not include implicit type conversion using `to_int`. This implicit conversion often causes vulnerability. There will be no more attacks like #4120. In addition, we have added internal convenience method `__to_int` which does type check and conversion (from floats).
2018-11-19Check method existence for Enumerators; fix #3920Yukihiro "Matz" Matsumoto
The issue #3920 was fixed but the fundamental flaw of lack of stack depth check along with fibers still remains, even though it's not easy to cause the issue. Use `MRB_GC_FIXED_ARENA` to avoid the issue for workaround. After this patch, `obj.to_enum` raises `ArgumentError` if the object does not respond to the enumerating method. This is incompatible to CRuby but I think this behavior is better and CRuby should be updated to behave like this.
2018-03-27Reimplement `Enumerable#zip` with Enumeratorksss
for fix some specs - [passes each element of the result array to a block and return nil if a block is given](https://github.com/ruby/spec/blob/a585ec35d185435e5c11f371ba4ed2a29d8817bd/core/enumerable/zip_spec.rb#L11-L17) - [converts arguments to arrays using #to_ary](https://github.com/ruby/spec/blob/a585ec35d185435e5c11f371ba4ed2a29d8817bd/core/enumerable/zip_spec.rb#L23-L27) - [converts arguments to enums using #to_enum](https://github.com/ruby/spec/blob/a585ec35d185435e5c11f371ba4ed2a29d8817bd/core/enumerable/zip_spec.rb#L29-L34) - [gathers whole arrays as elements when each yields multiple](https://github.com/ruby/spec/blob/a585ec35d185435e5c11f371ba4ed2a29d8817bd/core/enumerable/zip_spec.rb#L36-L39)
2017-08-11Check method existence in `to_enum'; ref #3773Yukihiro "Matz" Matsumoto
2017-07-30Improved speed of enumeration methodsChristopher Aue
2017-06-21Use `alias enum_for to_enum` instead of `alias :enum_for :to_enum`.Yukihiro "Matz" Matsumoto
2017-03-30Fix Enumerator#each_with_index with blockKenji Okimoto
In previous version, ``` a = [3, 2, 1] e = a.each e.sort_by(&:to_i) # => [] ``` In this version, ``` a = [3, 2, 1] e = a.each e.sort_by(&:to_i) # => [1, 2, 3] ```
2016-12-01Support svalueksss
2016-12-01Support nil argument as no argumentksss
2016-12-01Support Enumerable methodsksss
2015-10-21Revert "Mark core gems with mrbgem tag"Seba Gamboa
This reverts commit 5cdcce8dbddd94ecb9503a0a1d47370c4ef97177.
2015-10-20Remove obvious warnings from docsSeba Gamboa
2015-10-20Fix enumerator doc errorsSeba Gamboa
2015-10-20Mark core gems with mrbgem tagSeba Gamboa
2014-08-08move StopIteration to core; close #2518Yukihiro "Matz" Matsumoto
2014-05-13should not use String#<< which is defined in mruby-string-ext; use ↵Yukihiro "Matz" Matsumoto
Array#join instead; ref #2239
2014-04-06wrap args by parensYukihiro "Matz" Matsumoto
2014-04-06Add args in Enumerator#inspectJun Hiroe
2014-03-30revert #1974; ref #1979Yukihiro "Matz" Matsumoto
2014-03-29Enumerator#initialize support duck-typeksss
2014-03-29Fix a typoJun Hiroe
2014-03-27Enumerable#zip to use enumerator if mruby-enumerator gem is availableYukihiro "Matz" Matsumoto
2014-03-27use __svalue instead of ary2svYukihiro "Matz" Matsumoto
2014-03-15optimize from each to enumerator_block_callksss
2014-03-15fix variable name typoksss
2014-03-15fix self modifying bugksss
2014-03-15fix return value for with_indexksss
2014-03-14make private method enumerator_block_callksss
2014-03-14move dependency check from runtime to mrbgem.rakeYukihiro "Matz" Matsumoto
2014-03-14remove ambiguity warningsYukihiro "Matz" Matsumoto
2014-03-14mruby-enumerator: move definitions in core_mod.rb to mrblib coreYukihiro "Matz" Matsumoto
2014-03-13add mruby-enumeratorksss