Allow references stored in the VM stack to move

We can update these references too, so lets allow them to move.
This commit is contained in:
Aaron Patterson 2020-05-12 12:00:35 -07:00
parent 9ee66d2bef
commit 6efb9fe042
No known key found for this signature in database
GPG Key ID: 953170BCB4FFAFC6
2 changed files with 15 additions and 6 deletions

9
gc.c
View File

@ -4800,14 +4800,13 @@ rb_gc_mark_values(long n, const VALUE *values)
} }
static void static void
gc_mark_and_pin_stack_values(rb_objspace_t *objspace, long n, const VALUE *values) gc_mark_stack_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++) {
/* skip MOVED objects that are on the stack */ if (is_markable_object(objspace, values[i])) {
if (is_markable_object(objspace, values[i]) && T_MOVED != BUILTIN_TYPE(values[i])) { gc_mark(objspace, values[i]);
gc_mark_and_pin(objspace, values[i]);
} }
} }
} }
@ -4816,7 +4815,7 @@ void
rb_gc_mark_vm_stack_values(long n, const VALUE *values) rb_gc_mark_vm_stack_values(long n, const VALUE *values)
{ {
rb_objspace_t *objspace = &rb_objspace; rb_objspace_t *objspace = &rb_objspace;
gc_mark_and_pin_stack_values(objspace, n, values); gc_mark_stack_values(objspace, n, values);
} }
static int static int

12
vm.c
View File

@ -2488,11 +2488,21 @@ rb_execution_context_update(const rb_execution_context_t *ec)
{ {
/* update VM stack */ /* update VM stack */
if (ec->vm_stack) { if (ec->vm_stack) {
long i;
VM_ASSERT(ec->cfp); VM_ASSERT(ec->cfp);
VALUE *p = ec->vm_stack;
VALUE *sp = ec->cfp->sp;
rb_control_frame_t *cfp = ec->cfp; rb_control_frame_t *cfp = ec->cfp;
rb_control_frame_t *limit_cfp = (void *)(ec->vm_stack + ec->vm_stack_size); rb_control_frame_t *limit_cfp = (void *)(ec->vm_stack + ec->vm_stack_size);
for (i = 0; i < (long)(sp - p); i++) {
VALUE ref = p[i];
VALUE update = rb_gc_location(ref);
if (ref != update) {
p[i] = update;
}
}
while (cfp != limit_cfp) { while (cfp != limit_cfp) {
const VALUE *ep = cfp->ep; const VALUE *ep = cfp->ep;
cfp->self = rb_gc_location(cfp->self); cfp->self = rb_gc_location(cfp->self);