Skip to content

Commit

Permalink
DRAFT: try it on CI machines
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruby committed Jul 27, 2023
1 parent f0f2700 commit 1c21f79
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 26 deletions.
12 changes: 7 additions & 5 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -10127,12 +10127,14 @@ gc_ref_update_imemo(rb_objspace_t *objspace, VALUE obj)
if (!is_live_object(objspace, cc->klass)) {
*((VALUE *)(&cc->klass)) = (VALUE)0;
}
}

if (cc->cme_) {
TYPED_UPDATE_IF_MOVED(objspace, struct rb_callable_method_entry_struct *, cc->cme_);
if (!is_live_object(objspace, (VALUE)cc->cme_)) {
*((struct rb_callable_method_entry_struct **)(&cc->cme_)) = (struct rb_callable_method_entry_struct *)0;
// cc->cme_ is available if cc->klass is given

if (cc->cme_) {
TYPED_UPDATE_IF_MOVED(objspace, struct rb_callable_method_entry_struct *, cc->cme_);
if (!is_live_object(objspace, (VALUE)cc->cme_)) {
*((struct rb_callable_method_entry_struct **)(&cc->cme_)) = (struct rb_callable_method_entry_struct *)0;
}
}
}
}
Expand Down
49 changes: 28 additions & 21 deletions iseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,29 @@ rb_iseq_mark_and_move_each_value(const rb_iseq_t *iseq, VALUE *original_iseq)
}
}

static bool
cc_is_active(const struct rb_callcache *cc, bool reference_updating)
{
if (cc) {
if (reference_updating) {
cc = (const struct rb_callcache *)rb_gc_location((VALUE)cc);
}

if (vm_cc_markable(cc)) {
if (cc->klass) { // cc is not invalidated
const struct rb_callable_method_entry_struct *cme = vm_cc_cme(cc);
if (reference_updating) {
cme = (const struct rb_callable_method_entry_struct *)rb_gc_location((VALUE)cme);
}
if (!METHOD_ENTRY_INVALIDATED(cme)) {
return true;
}
}
}
}
return false;
}

void
rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating)
{
Expand Down Expand Up @@ -310,27 +333,11 @@ rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating)

if (cds[i].ci) rb_gc_mark_and_move_ptr(&cds[i].ci);

const struct rb_callcache *cc = cds[i].cc;
if (cc) {
if (reference_updating) {
cc = (const struct rb_callcache *)rb_gc_location((VALUE)cc);
}

if (vm_cc_markable(cc)) {
VM_ASSERT((cc->flags & VM_CALLCACHE_ON_STACK) == 0);

const struct rb_callable_method_entry_struct *cme = vm_cc_cme(cc);
if (reference_updating) {
cme = (const struct rb_callable_method_entry_struct *)rb_gc_location((VALUE)cme);
}

if (cc->klass && !METHOD_ENTRY_INVALIDATED(cme)) {
rb_gc_mark_and_move_ptr(&cds[i].cc);
}
else {
cds[i].cc = rb_vm_empty_cc();
}
}
if (cc_is_active(cds[i].cc, reference_updating)) {
rb_gc_mark_and_move_ptr(&cds[i].cc);
}
else {
cds[i].cc = rb_vm_empty_cc();
}
}
}
Expand Down

0 comments on commit 1c21f79

Please sign in to comment.