Immediately frees the call stack and data stack at the end of a non-root fiber.
If the env object needs to be detached, the data stack is reused through `mrb_realloc()`.
Previously, it was not necessary to take into account that `c->cibase` could be `NULL`.
Note that this is no longer the case due to this patch.
In fact, changes to "mruby-fiber" are now required.
The state of a fiber switched due to an exception occurrence was incorrectly set to "Suspended".
```ruby
Fiber.new {
begin
Fiber.new { 0 / 0 }.resume
rescue
p Fiber.current
# before => #<Fiber:0x159f61e43ce0 fiber.rb:1 (suspended by resuming)>
# after => #<Fiber:0x159f61e43ce0 fiber.rb:1 (resumed)>
end
}.resume
```
This reverts commit 26e436e247.
After investigation, it is possible to revert by commit e89cc9b9fa.
The build configuration file used in the investigation is shown below.
```ruby
MRuby::Build.new do |conf|
toolchain :clang
enable_debug
enable_bintest
enable_test
cc.command = "clang18"
linker.command = "clang18"
[cc, cxx].each { |c| c.defines << "MRB_GC_STRESS" }
[cc, cxx, linker].each { |cmd| cmd.flags << %w(-fsanitize=address) }
gem github: "iij/mruby-dir" # rev: "89dceefa1250fb1ae868d4cb52498e9e24293cd1"
gem github: "iij/mruby-env" # rev: "056ae324451ef16a50c7887e117f0ea30921b71b"
gem github: "iij/mruby-errno" # rev: "b4415207ff6ea62360619c89a1cff83259dc4db0"
gem github: "iij/mruby-require" # rev: "f0634d785e5cbb73cd7d118ee36deff499e4181e"
gem github: "iij/mruby-tempfile" # rev: "9b883438547020dae328e34c8a2fe736171cd0ab"
end
```
Since the `rake` command needs to be from the past, we used the Ruby 2.6 version.
Currently `e->cxt` is used exclusively to check for `break` / `return` availability.
In other words, there is no need to maintain a reference to a fiber that has reached its end.
Highlights are:
- `Integrate the blocks `if (!ci->proc || MRB_PROC_CFUNC_P(ci->proc))` and `if (loc.irep == NULL)`.
- Folding some other conditionals.
- Assertions ensure that procs are not aliases.
The purpose is to remove the `mid` field from the `mrb_cache_entry` structure.
The resulting RAM requirement for the method cache is reduced from 5 words per entry to 4 words per entry for 32-bit CPUs.
The relevant changes are as follows:
- Removed `MRB_USE_METHOD_T_STRUCT`.
The `mrb_method_t` type is now always defined as a structure.
- Include method IDs in `mrb_method_t`
Change the `flags` member to `uint32_t`.
The bitstring structure should be the same as the keys of the `mt` table in `class.c`.
I believe the impact on API compatibility with previous versions is minimal.
This will be a partial merge of #5317 with the following changes.
- Remove `iclass->iv_c` since `iclass->iv_c` is equivalent to `iclass->c`.
- `class_iv_ptr()` returns a single pointer instead of a double pointer.
It used to check ci to be non NULL in line 37, but we silently assumed
ci was not NULL in the `else` clause too. So instead of checking NULL,
we add assertion. This incomplete check was found by clang-tidy.
mruby used to use float numbers for overflown integers before we
implemented big integers. Now we don't need bit operations for float
numbers anymore. Also removed tests for shift operations for float
numbers.