mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 13:04:13 +02:00
unpoison / poison objects while walking the heap
This fixes some ASAN errors git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67405 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
990df87302
commit
1286674bb9
2 changed files with 24 additions and 0 deletions
14
iseq.c
14
iseq.c
|
@ -1011,10 +1011,17 @@ remove_coverage_i(void *vstart, void *vend, size_t stride, void *data)
|
|||
{
|
||||
VALUE v = (VALUE)vstart;
|
||||
for (; v != (VALUE)vend; v += stride) {
|
||||
void *ptr = poisoned_object_p(v);
|
||||
unpoison_object(v, false);
|
||||
|
||||
if (rb_obj_is_iseq(v)) {
|
||||
rb_iseq_t *iseq = (rb_iseq_t *)v;
|
||||
ISEQ_COVERAGE_SET(iseq, Qnil);
|
||||
}
|
||||
|
||||
if (ptr) {
|
||||
poison_object(v);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -3156,9 +3163,16 @@ trace_set_i(void *vstart, void *vend, size_t stride, void *data)
|
|||
|
||||
VALUE v = (VALUE)vstart;
|
||||
for (; v != (VALUE)vend; v += stride) {
|
||||
void *ptr = poisoned_object_p(v);
|
||||
unpoison_object(v, false);
|
||||
|
||||
if (rb_obj_is_iseq(v)) {
|
||||
rb_iseq_trace_set(rb_iseq_check((rb_iseq_t *)v), turnon_events);
|
||||
}
|
||||
|
||||
if (ptr) {
|
||||
poison_object(v);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue