Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow recycling fibers by GC if not referenced directly
The patch assumes that `struct REnv::cxt` only performs checks with the `OP_BREAK` and `OP_RETURN_BLK` instructions, and does not reference the entity. Therefore, by changing to a weak reference, it is possible to collect fibers that are no longer directly referenced while in the suspended state. However, we need to detach the living env objects that remain in the call stack of the fiber. So, in effect, it involves a revert of following commits. - commit a3365d8 - commit 57ffa1c Examples of the effects of change are shown below. Note that it was built with `rake MRUBY_CONFIG=host-debug`. ```ruby f = Fiber.new { (x, y, z) = "X", "Y", "Z"; Fiber.yield -> { [x, y, z] } } g = f.resume GC.start p ObjectSpace.memsize_of_all # => 59532 g.call # => ["X", "Y", "Z"] f = nil GC.start ObjectSpace.memsize_of_all # BEFORE => 59532 # AFTER => 58044 g.call # => ["X", "Y", "Z"] ```
- Loading branch information