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.