summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatoshi Tagomori <s-tagomori@sakura.ad.jp>2025-11-26 00:36:55 +0900
committerSatoshi Tagomori <tagomoris@gmail.com>2025-11-26 10:10:47 +0900
commite84b91a292f3cd94fdf5f2ef548bf2377b1cf537 (patch)
treee7b7d71d6403a8709bab91a269698cea53da3fb8
parent0654bcd4f809e97bca4a099fa78db9990fa5a4ae (diff)
Box: mark/move Box object referred via ENV/rb_env_t
-rw-r--r--imemo.c7
-rw-r--r--vm.c7
2 files changed, 14 insertions, 0 deletions
diff --git a/imemo.c b/imemo.c
index d83c690ba5..8ec58ae4a9 100644
--- a/imemo.c
+++ b/imemo.c
@@ -426,6 +426,13 @@ rb_imemo_mark_and_move(VALUE obj, bool reference_updating)
rb_gc_mark_and_move_ptr(&env->iseq);
+ if (VM_ENV_LOCAL_P(env->ep) && VM_ENV_BOXED_P(env->ep)) {
+ const rb_box_t *box = VM_ENV_BOX(env->ep);
+ if (BOX_USER_P(box)) {
+ rb_gc_mark_and_move((VALUE *)&box->box_object);
+ }
+ }
+
if (reference_updating) {
((VALUE *)env->ep)[VM_ENV_DATA_INDEX_ENV] = rb_gc_location(env->ep[VM_ENV_DATA_INDEX_ENV]);
}
diff --git a/vm.c b/vm.c
index fd8c923649..f9c615c3e2 100644
--- a/vm.c
+++ b/vm.c
@@ -3677,6 +3677,13 @@ rb_execution_context_mark(const rb_execution_context_t *ec)
rb_gc_mark_movable((VALUE)cfp->iseq);
rb_gc_mark_movable((VALUE)cfp->block_code);
+ if (VM_ENV_LOCAL_P(ep) && VM_ENV_BOXED_P(ep)) {
+ const rb_box_t *box = VM_ENV_BOX(ep);
+ if (BOX_USER_P(box)) {
+ rb_gc_mark_movable(box->box_object);
+ }
+ }
+
if (!VM_ENV_LOCAL_P(ep)) {
const VALUE *prev_ep = VM_ENV_PREV_EP(ep);
if (VM_ENV_FLAGS(prev_ep, VM_ENV_FLAG_ESCAPED)) {