Skip to content

Commit a505cd3

Browse files
committed
RUBY_DEBUG: Verify PC correctness every alloc
1 parent 660b995 commit a505cd3

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

gc.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,11 +969,25 @@ rb_gc_obj_slot_size(VALUE obj)
969969
return rb_gc_impl_obj_slot_size(obj);
970970
}
971971

972+
static inline void
973+
gc_validate_pc(void) {
974+
#if RUBY_DEBUG
975+
rb_execution_context_t *ec = GET_EC();
976+
const rb_control_frame_t *cfp = ec->cfp;
977+
if (cfp && VM_FRAME_RUBYFRAME_P(cfp) && cfp->pc) {
978+
RUBY_ASSERT(cfp->pc >= ISEQ_BODY(cfp->iseq)->iseq_encoded);
979+
RUBY_ASSERT(cfp->pc <= ISEQ_BODY(cfp->iseq)->iseq_encoded + ISEQ_BODY(cfp->iseq)->iseq_size);
980+
}
981+
#endif
982+
}
983+
972984
static inline VALUE
973985
newobj_of(rb_ractor_t *cr, VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3, bool wb_protected, size_t size)
974986
{
975987
VALUE obj = rb_gc_impl_new_obj(rb_gc_get_objspace(), cr->newobj_cache, klass, flags, v1, v2, v3, wb_protected, size);
976988

989+
gc_validate_pc();
990+
977991
if (UNLIKELY(rb_gc_event_hook_required_p(RUBY_INTERNAL_EVENT_NEWOBJ))) {
978992
unsigned int lev;
979993
RB_VM_LOCK_ENTER_CR_LEV(cr, &lev);

0 commit comments

Comments
 (0)