summaryrefslogtreecommitdiffhomepage
path: root/include
AgeCommit message (Collapse)Author
2022-01-07Update version to `3.1.0RC`.stablemimaki
2022-01-05Allows handling of unaligned cptrs for `MRB_NAN_BOXING`dearblue
It seems to be preferable to be able to handle pointers of type `char` as well. For this purpose, `mrb_nanbox_tt_inline` has been reorganized. - `MRB_NANBOX_TT_POINTER` has been split into `MRB_NANBOX_TT_OBJECT` and `MRB_NANBOX_TT_CPTR` - `MRB_NANBOX_TT_SYMBOL` has been merged into `MRB_NANBOX_TT_MISC`
2022-01-04Merge pull request #5623 from dearblue/more-presymYukihiro "Matz" Matsumoto
Improves presym scanning
2022-01-02Assert that `MRB_METHOD_CACHE_SIZE` is a power of 2dearblue
The `mrb_static_assert_powerof2()` macro has been introduced for this purpose.
2022-01-02Improves presym scanningdearblue
The main purpose is to increase the chances of finding presym and to prevent errors due to C++11 lambda expressions. - The argument to receive the class may be written, for example, `mrb_class_get()`. - The argument that receives the implementation function of the method may be a C++ lambda expression. In this case, if multiple variable declarations are separated by colons, the preprocessor will recognize them as argument delimiters and report an error. This patch prevents it from happening. ```c++ // When preprocessing... func([] { int x, y, z; }) // ^^^^^^^^^^ 1st argument? // ^ 2nd argument? // ^^^^ 3rd argument? ```
2021-12-31numeric.c: merge `mrb_as_float` implementation to `mrb_ensure_float_type`.Yukihiro "Matz" Matsumoto
Since they are basically duplicated functionality. `mrb_as_float` is now a macro defined using `mrb_ensure_float_type`; #5620
2021-12-29object.c: introduce `mrb_ensure_{int,float}_type`.Yukihiro "Matz" Matsumoto
Since `mrb_to_integer` and `mrb_to_float` does not convert the object but checks types, they are named so by historical reason. We introduced properly named functions. This commit obsoletes the following functions: * mrb_to_integer() * mrb_to_int() * mrb_to_float() Use `mrb_ensure_int_type()` instead for the first 2 functions. Use `mrb_ensure_float_type()` for the last.
2021-12-29common.h: include `<sys/types.h>` for `ssize_t`; #5617Yukihiro "Matz" Matsumoto
2021-12-28Fix build error and refine definition of `ssize_t` on MSVC.mimaki
2021-12-17Add `bin/mrbc --no-ext-ops` switchdearblue
Print an error if `OP_EXT[123]` is needed when generating mruby binary. This may be useful for mruby/c. Inspired by #5590.
2021-12-15boxing_nan.h: remove false description in the comment [ci skip]Yukihiro "Matz" Matsumoto
Ref #5597
2021-12-14proc.c: add `mrb_state` argument to `mrb_proc_copy()`.Yukihiro "Matz" Matsumoto
The function may invoke the garbage collection and it requires `mrb_state` to run.
2021-12-09irep.h: `c` operand may require 16 bits for `BSS` operand type.Yukihiro "Matz" Matsumoto
fix #5593
2021-11-26Check more `MRB_ARGS_NONE()`dearblue
The `__id__` method implemented in the C function has `MRB_ARGS_NONE()` specified, but it is also effective in the following cases. ```ruby p nil.__id__ opts: 1 rescue p :a p nil.method(:__id__).call 1 rescue p :b p nil.method(:__id__).call opts: 1 rescue p :c p nil.method(:__id__).to_proc.call 1 rescue p :d p nil.method(:__id__).to_proc.call opts: 1 rescue p :e p nil.method(:__id__).unbind.bind_call nil, 1 rescue p :f p nil.method(:__id__).unbind.bind_call nil, opts: 1 rescue p :g p nil.__send__ :__id__, 1 rescue p :h p nil.__send__ :__id__, opts: 1 rescue p :i ``` After applying this patch, all items will output symbols in the same way as CRuby. For this purpose, add `MRB_PROC_NOARG` to `struct RProc::flags`.
2021-11-19Fixed a discrepancy in `OP_ASET`dearblue
There was a discrepancy in the actual behavior, assertions, and documentation. Therefore, I modified it based on the actual behavior.
2021-11-13boxing_word.h: fix the error in the comment [ci skip]Yukihiro "Matz" Matsumoto
2021-11-12parse.y: should allow newline after `...`.Yukihiro "Matz" Matsumoto
2021-11-08boxing_nan.h: update `mrb_immediate_p` and related macros.Yukihiro "Matz" Matsumoto
2021-11-04boxing_nan.h (mrb_float_p): wrap macro argument by parenthesis.Yukihiro "Matz" Matsumoto
2021-10-31Fix failed build with `MRB_NAN_BOXING` and `enable_cxx_abi`dearblue
```console % c++ -xc++ -std=c++03 -S -Iinclude -DMRB_NAN_BOXING -DMRB_NO_PRESYM -o- src/array.c > /dev/null In file included from src/array.c:7: In file included from include/mruby.h:115: In file included from include/mruby/value.h:201: include/mruby/boxing_nan.h:95:12: error: cannot initialize return object of type 'enum mrb_vtype' with an rvalue of type 'int' return (enum mrb_vtype)(o.u >> 8) & 0x1f; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. ```
2021-10-31Merge pull request #5566 from dearblue/no_float_truncateYukihiro "Matz" Matsumoto
Avoid redefining `MRB_WORDBOX_NO_FLOAT_TRUNCATE`
2021-10-30Merge pull request #5567 from dearblue/mrb_static_assert.1Yukihiro "Matz" Matsumoto
Avoid violations of the `mrb_static_assert()` standard
2021-10-30boxing_nan.h: allow `MRB_INT64` with `MRB_NAN_BOXING`.Yukihiro "Matz" Matsumoto
Integers out of 32 bit range will be allocated in the heap.
2021-10-30boxing_nan.h: implement Favor pointer NaN Boxing.Yukihiro "Matz" Matsumoto
Favor pointer means encode NaN boxed values to keep pointer values unmodified, to reduce the cost of far frequent pointer value retrievals.
2021-10-30Avoid violations of the `mrb_static_assert()` standarddearblue
ref: #5564 ```console % cc -pedantic -S -Iinclude -DMRB_NO_PRESYM -o- src/array.c > /dev/null In file included from src/array.c:7: In file included from include/mruby.h:115: In file included from include/mruby/value.h:204: include/mruby/boxing_word.h:133:1: warning: must specify at least one argument for '...' parameter of variadic macro [-Wgnu-zero-variadic-macro-arguments] mrb_static_assert(sizeof(mrb_value) == sizeof(union mrb_value_)); ^ include/mruby.h:109:108: note: expanded from macro 'mrb_static_assert' mrb_static_assert_expand(mrb_static_assert_selector(__VA_ARGS__, mrb_static_assert2, mrb_static_assert1)(__VA_ARGS__)) ^ include/mruby.h:100:10: note: macro 'mrb_static_assert_selector' defined here # define mrb_static_assert_selector(a, b, name, ...) name ^ 1 warning generated. ```
2021-10-30Avoid redefining `MRB_WORDBOX_NO_FLOAT_TRUNCATE`dearblue
Adding `MRB_WORDBOX_NO_FLOAT_TRUNCATE` to the build configuration in 32-bit CPU mode had a double definition. ```console % cat myconf.rb MRuby::Build.new do toolchain "clang" defines << "MRB_WORDBOX_NO_FLOAT_TRUNCATE" cc.flags << "-m32" linker.flags << "-m32" enable_debug end % rake CONFIG=myconf.rb CPP src/array.c -> build/host/src/array.pi In file included from /var/tmp/mruby/src/array.c:7: In file included from /var/tmp/mruby/include/mruby.h:115: In file included from /var/tmp/mruby/include/mruby/value.h:203: /var/tmp/mruby/include/mruby/boxing_word.h:11:10: warning: 'MRB_WORDBOX_NO_FLOAT_TRUNCATE' macro redefined [-Wmacro-redefined] # define MRB_WORDBOX_NO_FLOAT_TRUNCATE ^ <command line>:3:9: note: previous definition is here #define MRB_WORDBOX_NO_FLOAT_TRUNCATE 1 ^ 1 warning generated. ...SNIP... ```
2021-10-28boxing_nan.h: refactor NaN Boxing.Yukihiro "Matz" Matsumoto
Preparation for: * 64 bit integer with NaN Boxing * Favor pointer NaN Boxing
2021-10-26boxing_nan.h: revert part of dccd66fYukihiro "Matz" Matsumoto
WIP code was mistakenly committed.
2021-10-24Make `mrb_static_assert()` a variable argumentdearblue
`mrb_static_assert()` extends the macro function to take one or two arguments. If the argument is other than that, an error will occur. References: - static_assert のメッセージ省略を許可 - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/lang/cpp17/extending_static_assert.html - c - Overloading Macro on Number of Arguments - Stack Overflow https://stackoverflow.com/a/11763277
2021-10-19dump.h: bump `RITE_BINARY_MAJOR_VER` to `03`.Yukihiro "Matz" Matsumoto
Since we have added several new instructions.
2021-10-19ops.h: add new instructions `OP_SSEND` and `OP_SSENDB`.Yukihiro "Matz" Matsumoto
These instructions call methods of the receiver.
2021-10-19ops.h: update descriptions for array-like accesses.Yukihiro "Matz" Matsumoto
* `R(a)` -> `R[a]` * `Pool(a)` -> `Pool[a]` * `Syms(a)` -> `Syms[a]` * `Irep(a)` -> `Irep[a]`
2021-10-19ops.h: update `OP_SEND` description.Yukihiro "Matz" Matsumoto
2021-10-12Merge branch 'exc_mesg' of https://github.com/take-cheeze/mruby into ↵Yukihiro "Matz" Matsumoto
take-cheeze-exc_mesg
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-10-03mruby/ops.h: add new instructions `OP_GETIDX` and `OP_SETIDX`.Yukihiro "Matz" Matsumoto
Which represent `obj[int]` and `obj[int]=val` respectively where `obj` is either `string`, `array` or `hash`, so that index access could be faster. When `obj` is not assumed type or `R(a+1)` is not integer, the instructions fallback to method calls.
2021-09-30value.h: introduce `MRB_TT_STRUCT` for `mruby-struct`.Yukihiro "Matz" Matsumoto
2021-09-25mrbconf.h: rename a configuration macro for no truncate floats.Yukihiro "Matz" Matsumoto
Rename `MRB_WORDBOX_USE_HEAP_FLOAT` to `MRB_WORDBOX_NO_FLOAT_TRUNCATE'.
2021-09-19codegen.c: unify `OP_ARYPUSH` and `OP_ARYPUSH_N`.Yukihiro "Matz" Matsumoto
- `OP_ARYPUSH` now takes operand for the number of pushing elements - the code generator consume the stack no more than `64` for `mruby/c`
2021-09-17ops.h: add `OP_ARYPUSH_N` instruction.Yukihiro "Matz" Matsumoto
Add n elements at once. Reduces instructions for huge array initialization. In addition, `gen_value` function in `codegen.c` was refactored and clarified.
2021-09-10ops.h: update `OP_HASHADD` description.Yukihiro "Matz" Matsumoto
2021-09-10mruby.h: remove `acc` from `callinfo`; add `cci` instead.Yukihiro "Matz" Matsumoto
`acc` was used as an index of the receiver (if positive), or a flag for methods implemented in C. We replace `regs[ci->acc]` by `ci[1].stack[0]`. And renamed `acc` (originally meant accumulator position) to `cci` (means callinfo for C implemented method).
2021-09-10ops.h: add `OP_SYMBOL` instruction.Yukihiro "Matz" Matsumoto
It generates a symbol by interning from the pool string.
2021-09-09value.h: add configuration macros around `mrb_ro_data_p()`; close #5547Yukihiro "Matz" Matsumoto
- `MRB_USE_ETEXT_RO_DATA_P`: use `etext` and `edata` - `MRB_NO_DEFAULT_RO_DATA_P`: not use the default `mrb_ro_data_p()`
2021-09-09value.h: use `etext` and `edata` which are more widely available; #5547Yukihiro "Matz" Matsumoto
2021-09-07value.h: fixed address comparison on macOS.Yukihiro "Matz" Matsumoto
2021-09-07object.c: rename `mrb_to_int` to `mrb_to_integer`.Yukihiro "Matz" Matsumoto
Consistent naming: `integer` to represent integer packed in `mrb_value` instead of `int`.
2021-09-07string.h: rename `mrb_str_to_inum` to `mrb_str_to_integer`.Yukihiro "Matz" Matsumoto
Consistent naming: `integer` to represent integer packed in `mrb_value` instead of `inum`.
2021-09-07parse.y: refactor `mrb_parser_parse()`.Yukihiro "Matz" Matsumoto
- remove `mrb_jmpbuf` from `truct mrb_parser_state` - unify exception handling of `mrb_state` and `mrb_parser_state`.
2021-09-05boxing_word.h: avoid `mrb_float_p()` when `MRB_NO_FLOAT` is on; fix #5546Yukihiro "Matz" Matsumoto