From 6efb9fe04229c9e96205025bfd8b6cfec1b9a30f Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 12 May 2020 12:00:35 -0700 Subject: [PATCH] Allow references stored in the VM stack to move We can update these references too, so lets allow them to move. --- gc.c | 9 ++++----- vm.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/gc.c b/gc.c index 76d112ca53..6353a7b50a 100644 --- a/gc.c +++ b/gc.c @@ -4800,14 +4800,13 @@ rb_gc_mark_values(long n, const VALUE *values) } 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; for (i=0; ivm_stack) { + long i; 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 *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) { const VALUE *ep = cfp->ep; cfp->self = rb_gc_location(cfp->self);