summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-range-ext
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-08-21Organize the include of header filesdearblue
- `#include <math.h>` is done in `mruby.h`. Eliminate the need to worry about the `MRB_NO_FLOAT` macro. - Include mruby header files before standard header files. If the standard header file is already placed before `mruby.h`, the standard header file added in the future tends to be placed before `mruby.h`. This change should some reduce the chances of macros that must be defined becoming undefined in C++ or including problematic header files in a particular mruby build configuration.
2021-05-13range.c: avoid use of `mrb_fixnum_p`.Yukihiro "Matz" Matsumoto
`mrb_int` may not fit in `fixnum` (inline integer).
2020-12-15refactor: remove trailing whitespace from C, Header, Ruby and YAML filesJohn Bampton
Lint
2020-10-29Fix typo in `Range#last`KOBAYASHI Shuji
2020-10-29Add beginless/endless ranges tests.Yukihiro "Matz" Matsumoto
2020-10-29Raise exception from `Range#first` with beginless ranges.Yukihiro "Matz" Matsumoto
2020-10-29Implement `Range#last` in `mruby-range-ext` in Ruby.Yukihiro "Matz" Matsumoto
This reduce unnecessary calls of `mrb_funcall()`.
2020-10-15Merge branch 'work_for_merge' of https://github.com/zubycz/mruby into ↵Yukihiro "Matz" Matsumoto
zubycz-work_for_merge
2020-10-13Introduce endless range (a part of #5085)taiyoslime
Co-Authored-By: n4o847 <[email protected]> Co-Authored-By: smallkirby <[email protected]>
2020-10-12Reorganize `Integer` system.Yukihiro "Matz" Matsumoto
- Integrate `Fixnum` and `Integer` - Remove `Integral` - `int / int -> int` - Replace `mrb_fixnum()` to `mrb_int()` - Replace `mrb_fixnum_value()` to `mrb_int_value()`. - Use `mrb_integer_p()` instead of `mrb_fixnum_p()`
2020-10-12Integrate `Fixnum` class into `Integer` classdearblue
* The `Fixnum` constant is now an alias for the `Integer` class. * Remove `struct mrb_state::fixnum_class` member. If necessary, use `struct mrb_state::integer_class` instead.
2020-10-12Rename float configuration option names.Yukihiro "Matz" Matsumoto
- `MRB_WITHOUT_FLOAT` => `MRB_NO_FLOAT` - `MRB_USE_FLOAT` => `MRB_USE_FLOAT32` The former is to use `USE_XXX` naming convention. The latter is to make sure `float` is 32bit float and not floating point number in general.
2020-10-12Use `mrb_funcall_id()` extensively.Yukihiro "Matz" Matsumoto
Except for support files e.g. `mruby-test/driver.c`, which are not target of symbol collection via `rake gensym`.
2020-10-12fix improper test of Range#mintaiyoslime
2020-06-20Add `mrb_get_arg1()` that retrieves single (and only) argument.Yukihiro "Matz" Matsumoto
`mrb_get_arg1()` raises `ArgumentError` if the method does not receive one argument. And replaces all `mrb_get_args(mrb, "o", &arg)` by the new function.
2019-09-14Remove `mrb_funcall` from `<=>` operations.Yukihiro "Matz" Matsumoto
2019-09-05Fix `Range#max` test (`TypeError` is raised) on 32-bit mode with word boxingKOBAYASHI Shuji
2019-08-24Fix `Range#max` test (`TypeError` is raised) on 32-bit modeKOBAYASHI Shuji
2019-07-17Merge branch 'master' into fix-range-min-with-mruby-range-extYukihiro "Matz" Matsumoto
2019-07-17Fix `(fixnum_value ... float_value).min` with `mruby-range-ext`KOBAYASHI Shuji
Before this patch: $ bin/mruby -e 'p (2...4.0).min' #=> TypeError After this patch (same as CRuby and without `mruby-range-ext`): $ bin/mruby -e 'p (2...4.0).min' #=> 2
2019-07-17Allow `mruby-range-ext` to work with `MRB_WITHOUT_FLOAT`; ref 2add8641KOBAYASHI Shuji
2019-07-17Allow `mruby-range-ext` to work with `MRB_WITHOUT_FLOAT`; ref #4576Yukihiro "Matz" Matsumoto
2019-07-14Error needed/conflicts configurationdearblue
The purpose is to clarify the error if there is a needed/conflicts configuration at compile time.
2019-07-09Fix Range#min fast path with exclusive rangeRyan Lopopolo
2019-07-09Add a fast path for Float and Fixnum ranges for Range#max and Range#minRyan Lopopolo
If no block is given and the Range has Fixnum or Float endpoints, do not iterate with each and instead compare the endpoints directly. This implementation passes all of the applicable specs from Ruby Spec.
2019-07-09Add Range#max and Range#min tests from Ruby SpecRyan Lopopolo
2019-01-04Remove `mrb_` prefix from static functions in `mruby-range-ext`; #4213Yukihiro "Matz" Matsumoto
2019-01-01range: Embed edges in RRange on boxing environment.KOBAYASHI Shuji
[Breaking changes] Developers must use following APIs for accessing attributes of RRange because RRange structure depends on boxing setting. - mrb_range_beg - mrb_range_end - mrb_range_excl_p
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).
2017-08-11Should not include `float.h` here.Yukihiro "Matz" Matsumoto
2017-01-02add explicit castsYukihiro "Matz" Matsumoto
2016-12-03Check before retrieving struct RRange pointer; fix #3320Yukihiro "Matz" Matsumoto
range->edges may be NULL for example when #initialize_copy removed.
2016-11-24Fixed Range.size to use proper floating point toleranceTomasz Dąbrowski
2016-11-22remove unnecessary ".!"; ref #3261Yukihiro "Matz" Matsumoto
2016-11-21Reimplements Range#firstksss
Range#first shouldn't call `Range#to_a` on infinity range.
2016-11-19Use mrb_float instead of doubleksss
2016-11-19Fix Range#size resultsksss
2015-11-27include changed from by quotes ("") to by brackets (<>); close #3032Yukihiro "Matz" Matsumoto
2015-06-28Rename extended xxxx class or module to xxxx class or module extensionJun Hiroe
2015-06-28Fix typo; Replace extensional with extendedJun Hiroe
2014-05-19reimplement Range#size using double with fixing corner cases; ref #2293Yukihiro "Matz" Matsumoto
2014-05-19Add Range#sizeJun Hiroe
2014-03-21use mrb_get_args("i")Yukihiro "Matz" Matsumoto
2014-03-17move summary of mrbgems in default gembox to its spectake_cheeze
2014-01-02tiny word boxing optimizationcremno
2013-08-04Improve test of mruby-range-ext GEMDaniel Bovensiepen
2013-07-23"spec.author" is better for single-author gems.Tomoyuki Sahara
"spec.author=" expects a String represents a single author. "spec.authors=" expects an Array which is a list of multiple authors. http://guides.rubygems.org/specification-reference/
2013-07-15Repalace int with mrb_bool because a return value is boolean.Jun Hiroe
2013-04-25rename every ARGS_XXX to MRB_ARGS_XXX; ref #1206Yukihiro "Matz" Matsumoto