From e84b91a292f3cd94fdf5f2ef548bf2377b1cf537 Mon Sep 17 00:00:00 2001 From: Satoshi Tagomori Date: Wed, 26 Nov 2025 00:36:55 +0900 Subject: [PATCH] Box: mark/move Box object referred via ENV/rb_env_t --- imemo.c | 7 +++++++ vm.c | 7 +++++++ 2 files changed, 14 insertions(+) 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)) {