Skip to content

Commit a5f53d5

Browse files
tenderloveKaanOzkan
authored andcommitted
Fix some GC bugs
1 parent aafbe09 commit a5f53d5

3 files changed

Lines changed: 24 additions & 14 deletions

File tree

iseq.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,13 @@ rb_iseq_free(const rb_iseq_t *iseq)
185185

186186
if (body->block_ccs) {
187187
for (int i = 0; i < body->block_ccs->len; i++) {
188-
vm_cc_invalidate(body->block_ccs->entries[i].cc);
188+
const struct rb_callcache *cc = body->block_ccs->entries[i].cc;
189+
190+
if (!rb_objspace_garbage_object_p((VALUE)cc) &&
191+
IMEMO_TYPE_P(cc, imemo_callcache) &&
192+
cc->klass == (VALUE)iseq) {
193+
vm_cc_invalidate(cc);
194+
}
189195
}
190196
ruby_xfree(body->block_ccs->entries);
191197
ruby_xfree(body->block_ccs);
@@ -387,7 +393,8 @@ rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating)
387393

388394
if (body->block_ccs) {
389395
for (int i = 0; i < body->block_ccs->len; i++) {
390-
rb_gc_mark_and_move_ptr(&body->block_ccs->entries[i].cc);
396+
VM_ASSERT(IMEMO_TYPE_P((VALUE)body->block_ccs->entries[i].cc, imemo_callcache));
397+
rb_gc_mark((VALUE)body->block_ccs->entries[i].cc);
391398
}
392399
}
393400

vm_callinfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ static inline const struct rb_callable_method_entry_struct *
406406
vm_cc_cme(const struct rb_callcache *cc)
407407
{
408408
VM_ASSERT(IMEMO_TYPE_P(cc, imemo_callcache));
409+
VM_ASSERT(FL_TEST_RAW((VALUE)cc, VM_CALLCACHE_BLOCK) == 0);
409410
VM_ASSERT(cc->call_ == NULL || // not initialized yet
410411
!vm_cc_markable(cc) ||
411412
cc->cme_ != NULL);
@@ -491,6 +492,7 @@ vm_cc_call_set(const struct rb_callcache *cc, vm_call_handler call)
491492
static inline void
492493
set_vm_cc_ivar(const struct rb_callcache *cc)
493494
{
495+
VM_ASSERT(FL_TEST_RAW((VALUE)cc, VM_CALLCACHE_BLOCK) == 0);
494496
*(VALUE *)&cc->flags |= VM_CALLCACHE_IVAR;
495497
}
496498

vm_insnhelper.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4950,6 +4950,7 @@ rb_vm_cc_general(const struct rb_callcache *cc)
49504950
{
49514951
VM_ASSERT(IMEMO_TYPE_P(cc, imemo_callcache));
49524952
VM_ASSERT(cc != vm_cc_empty());
4953+
VM_ASSERT(FL_TEST_RAW((VALUE)cc, VM_CALLCACHE_BLOCK) == 0);
49534954

49544955
*(vm_call_handler *)&cc->call_ = vm_call_general;
49554956
}
@@ -5989,22 +5990,22 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
59895990
if (vm_block_handler_type(block_handler) == block_handler_type_iseq) {
59905991
// what to do
59915992
const struct rb_captured_block *captured = VM_BH_TO_ISEQ_BLOCK(block_handler);
5992-
const rb_iseq_t *iseq = rb_iseq_check(captured->code.iseq);
5993+
const rb_iseq_t *callee_iseq = rb_iseq_check(captured->code.iseq);
59935994

59945995
// check cache
5995-
if (LIKELY(cd->cc->klass == (VALUE)iseq)) {
5996+
if (LIKELY(cd->cc->klass == (VALUE)callee_iseq)) {
59965997
ret = cd->cc;
59975998
}
59985999
else {
5999-
if (rb_simple_iseq_p(iseq) &&
6000+
if (rb_simple_iseq_p(callee_iseq) &&
60006001
(vm_ci_flag(ci) & VM_CALL_ARGS_SIMPLE) &&
6001-
vm_ci_argc(ci) == (unsigned int)ISEQ_BODY(iseq)->param.lead_num &&
6002-
ISEQ_BODY(iseq)->param.flags.ambiguous_param0) {
6003-
if (!ISEQ_BODY(iseq)->block_ccs) {
6004-
ISEQ_BODY(iseq)->block_ccs = ZALLOC(struct rb_class_cc_entries);
6002+
vm_ci_argc(ci) == (unsigned int)ISEQ_BODY(callee_iseq)->param.lead_num &&
6003+
ISEQ_BODY(callee_iseq)->param.flags.ambiguous_param0) {
6004+
if (!ISEQ_BODY(callee_iseq)->block_ccs) {
6005+
ISEQ_BODY(callee_iseq)->block_ccs = ZALLOC(struct rb_class_cc_entries);
60056006
}
60066007

6007-
struct rb_class_cc_entries * ccs = ISEQ_BODY(iseq)->block_ccs;
6008+
struct rb_class_cc_entries * ccs = ISEQ_BODY(callee_iseq)->block_ccs;
60086009
unsigned int argc = vm_ci_argc(ci);
60096010
unsigned int flag = vm_ci_flag(ci);
60106011

@@ -6013,11 +6014,11 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
60136014
return ccs->entries[i].cc;
60146015
}
60156016
}
6016-
ret = vm_cc_new((VALUE)iseq, NULL, vm_invoke_iseq_block_cc, cc_type_block);
6017-
vm_ccs_push((VALUE)iseq, ISEQ_BODY(iseq)->block_ccs, ci, ret);
6017+
ret = vm_cc_new((VALUE)callee_iseq, NULL, vm_invoke_iseq_block_cc, cc_type_block);
60186018
cd->cc = ret;
6019-
RB_OBJ_WRITTEN((VALUE)iseq, Qundef, ret);
6020-
RUBY_ASSERT(ret->klass == (VALUE)iseq);
6019+
RB_OBJ_WRITTEN(reg_cfp->iseq, Qundef, ret);
6020+
vm_ccs_push((VALUE)callee_iseq, ISEQ_BODY(callee_iseq)->block_ccs, ci, ret);
6021+
RUBY_ASSERT(ret->klass == (VALUE)callee_iseq);
60216022
}
60226023
}
60236024
}

0 commit comments

Comments
 (0)