Feature #10238 ยป 0001-gc.c-use-ruby_sized_xfree-in-more-places.patch
| gc.c | ||
|---|---|---|
|
static void free_stack_chunks(mark_stack_t *);
|
||
|
static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page);
|
||
|
#ifdef ruby_sized_xfree
|
||
|
#undef ruby_sized_xfree
|
||
|
#endif
|
||
|
void ruby_sized_xfree(void *, size_t);
|
||
|
#define SIZED_XFREE(p) ruby_sized_xfree(p,sizeof(*p))
|
||
|
void
|
||
|
rb_objspace_free(rb_objspace_t *objspace)
|
||
|
{
|
||
| ... | ... | |
|
struct gc_list *list, *next;
|
||
|
for (list = global_list; list; list = next) {
|
||
|
next = list->next;
|
||
|
xfree(list);
|
||
|
SIZED_XFREE(list);
|
||
|
}
|
||
|
}
|
||
|
if (heap_pages_sorted) {
|
||
| ... | ... | |
|
free_const_entry_i(VALUE value, void *data)
|
||
|
{
|
||
|
rb_const_entry_t *ce = (rb_const_entry_t *)value;
|
||
|
xfree(ce);
|
||
|
SIZED_XFREE(ce);
|
||
|
return ID_TABLE_CONTINUE;
|
||
|
}
|
||
| ... | ... | |
|
rb_class_remove_from_module_subclasses(obj);
|
||
|
rb_class_remove_from_super_subclasses(obj);
|
||
|
if (RANY(obj)->as.klass.ptr)
|
||
|
xfree(RANY(obj)->as.klass.ptr);
|
||
|
SIZED_XFREE(RANY(obj)->as.klass.ptr);
|
||
|
RANY(obj)->as.klass.ptr = NULL;
|
||
|
break;
|
||
|
case T_STRING:
|
||
| ... | ... | |
|
struct rmatch *rm = RANY(obj)->as.match.rmatch;
|
||
|
onig_region_free(&rm->regs, 0);
|
||
|
if (rm->char_offset)
|
||
|
xfree(rm->char_offset);
|
||
|
xfree(rm);
|
||
|
SIZED_XFREE(rm->char_offset);
|
||
|
SIZED_XFREE(rm);
|
||
|
}
|
||
|
break;
|
||
|
case T_FILE:
|
||
| ... | ... | |
|
}
|
||
|
rb_class_remove_from_module_subclasses(obj);
|
||
|
rb_class_remove_from_super_subclasses(obj);
|
||
|
xfree(RANY(obj)->as.klass.ptr);
|
||
|
SIZED_XFREE(RANY(obj)->as.klass.ptr);
|
||
|
RANY(obj)->as.klass.ptr = NULL;
|
||
|
break;
|
||
| ... | ... | |
|
run_finalizer(objspace, curr->obj, curr->table);
|
||
|
st_delete(finalizer_table, &obj, 0);
|
||
|
list = curr->next;
|
||
|
xfree(curr);
|
||
|
SIZED_XFREE(curr);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
reflist_destruct(struct reflist *refs)
|
||
|
{
|
||
|
xfree(refs->list);
|
||
|
xfree(refs);
|
||
|
SIZED_XFREE(refs);
|
||
|
}
|
||
|
static void
|
||
| ... | ... | |
|
if (tmp->varptr == addr) {
|
||
|
global_list = tmp->next;
|
||
|
xfree(tmp);
|
||
|
SIZED_XFREE(tmp);
|
||
|
return;
|
||
|
}
|
||
|
while (tmp->next) {
|
||
| ... | ... | |
|
struct gc_list *t = tmp->next;
|
||
|
tmp->next = tmp->next->next;
|
||
|
xfree(t);
|
||
|
SIZED_XFREE(t);
|
||
|
break;
|
||
|
}
|
||
|
tmp = tmp->next;
|
||
| ... | ... | |
|
return ruby_sized_xrealloc2(ptr, n, size, 0);
|
||
|
}
|
||
|
#ifdef ruby_sized_xfree
|
||
|
#undef ruby_sized_xfree
|
||
|
#endif
|
||
|
void
|
||
|
ruby_sized_xfree(void *x, size_t size)
|
||
|
{
|
||
|
-
|
||