allow objects in imemo envs to move
This commit is contained in:
parent
4eb1c2365c
commit
2de3d92844
23
gc.c
23
gc.c
@ -4439,20 +4439,24 @@ rb_gc_mark_locations(const VALUE *start, const VALUE *end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_mark_and_pin_values(rb_objspace_t *objspace, long n, const VALUE *values)
|
gc_mark_values(rb_objspace_t *objspace, long n, const VALUE *values)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
for (i=0; i<n; i++) {
|
for (i=0; i<n; i++) {
|
||||||
gc_mark_and_pin(objspace, values[i]);
|
gc_mark(objspace, values[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_gc_mark_values(long n, const VALUE *values)
|
rb_gc_mark_values(long n, const VALUE *values)
|
||||||
{
|
{
|
||||||
|
long i;
|
||||||
rb_objspace_t *objspace = &rb_objspace;
|
rb_objspace_t *objspace = &rb_objspace;
|
||||||
gc_mark_and_pin_values(objspace, n, values);
|
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
gc_mark_and_pin(objspace, values[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4962,7 +4966,7 @@ gc_mark_imemo(rb_objspace_t *objspace, VALUE obj)
|
|||||||
{
|
{
|
||||||
const rb_env_t *env = (const rb_env_t *)obj;
|
const rb_env_t *env = (const rb_env_t *)obj;
|
||||||
GC_ASSERT(VM_ENV_ESCAPED_P(env->ep));
|
GC_ASSERT(VM_ENV_ESCAPED_P(env->ep));
|
||||||
gc_mark_and_pin_values(objspace, (long)env->env_size, env->env);
|
gc_mark_values(objspace, (long)env->env_size, env->env);
|
||||||
VM_ENV_FLAGS_SET(env->ep, VM_ENV_FLAG_WB_REQUIRED);
|
VM_ENV_FLAGS_SET(env->ep, VM_ENV_FLAG_WB_REQUIRED);
|
||||||
gc_mark_and_pin(objspace, (VALUE)rb_vm_env_prev_env(env));
|
gc_mark_and_pin(objspace, (VALUE)rb_vm_env_prev_env(env));
|
||||||
gc_mark(objspace, (VALUE)env->iseq);
|
gc_mark(objspace, (VALUE)env->iseq);
|
||||||
@ -7793,6 +7797,16 @@ gc_ref_update_method_entry(rb_objspace_t *objspace, rb_method_entry_t *me)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gc_update_values(rb_objspace_t *objspace, long n, VALUE *values)
|
||||||
|
{
|
||||||
|
long i;
|
||||||
|
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
UPDATE_IF_MOVED(objspace, values[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_ref_update_imemo(rb_objspace_t *objspace, VALUE obj)
|
gc_ref_update_imemo(rb_objspace_t *objspace, VALUE obj)
|
||||||
{
|
{
|
||||||
@ -7801,6 +7815,7 @@ gc_ref_update_imemo(rb_objspace_t *objspace, VALUE obj)
|
|||||||
{
|
{
|
||||||
rb_env_t *env = (rb_env_t *)obj;
|
rb_env_t *env = (rb_env_t *)obj;
|
||||||
TYPED_UPDATE_IF_MOVED(objspace, rb_iseq_t *, env->iseq);
|
TYPED_UPDATE_IF_MOVED(objspace, rb_iseq_t *, env->iseq);
|
||||||
|
gc_update_values(objspace, (long)env->env_size, (VALUE *)env->env);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user