Project

General

Profile

Feature #10302 ยป 0001-marshal.c-lazy-compat_tbl-allocation.patch

normalperson (Eric Wong), 09/28/2014 03:34 AM

View differences:

marshal.c
st_data_t real_obj;
VALUE klass;
if (st_lookup(arg->compat_tbl, (st_data_t)obj, &real_obj)) {
if (arg->compat_tbl &&
st_lookup(arg->compat_tbl, (st_data_t)obj, &real_obj)) {
obj = (VALUE)real_obj;
}
klass = CLASS_OF(obj);
......
marshal_compat_t *compat = (marshal_compat_t*)compat_data;
VALUE real_obj = obj;
obj = compat->dumper(real_obj);
if (!arg->compat_tbl) {
arg->compat_tbl = st_init_numtable();
}
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
if (obj != real_obj && !ivtbl) hasiv = 0;
}
......
arg->symbols = 0;
st_free_table(arg->data);
arg->data = 0;
st_free_table(arg->compat_tbl);
arg->compat_tbl = 0;
if (arg->compat_tbl) {
st_free_table(arg->compat_tbl);
arg->compat_tbl = 0;
}
if (arg->encodings) {
st_free_table(arg->encodings);
arg->encodings = 0;
......
arg->symbols = st_init_numtable();
arg->data = st_init_numtable();
arg->infection = 0;
arg->compat_tbl = st_init_numtable();
arg->compat_tbl = 0;
arg->encodings = 0;
arg->str = rb_str_buf_new(0);
if (!NIL_P(port)) {
......
r_entry0(VALUE v, st_index_t num, struct load_arg *arg)
{
st_data_t real_obj = (VALUE)Qundef;
if (st_lookup(arg->compat_tbl, v, &real_obj)) {
if (arg->compat_tbl && st_lookup(arg->compat_tbl, v, &real_obj)) {
st_insert(arg->data, num, (st_data_t)real_obj);
}
else {
......
r_fixup_compat(VALUE v, struct load_arg *arg)
{
st_data_t data;
if (st_lookup(arg->compat_tbl, v, &data)) {
if (arg->compat_tbl && st_lookup(arg->compat_tbl, v, &data)) {
VALUE real_obj = (VALUE)data;
rb_alloc_func_t allocator = rb_get_alloc_func(CLASS_OF(real_obj));
st_data_t key = v;
......
VALUE real_obj = rb_obj_alloc(klass);
VALUE obj = rb_obj_alloc(compat->oldclass);
if (oldclass) *oldclass = compat->oldclass;
if (!arg->compat_tbl) {
arg->compat_tbl = st_init_numtable();
}
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
return obj;
}
......
arg->symbols = 0;
st_free_table(arg->data);
arg->data = 0;
st_free_table(arg->compat_tbl);
arg->compat_tbl = 0;
if (arg->compat_tbl) {
st_free_table(arg->compat_tbl);
arg->compat_tbl = 0;
}
}
/*
......
arg->offset = 0;
arg->symbols = st_init_numtable();
arg->data = st_init_numtable();
arg->compat_tbl = st_init_numtable();
arg->compat_tbl = 0;
arg->proc = 0;
arg->readable = 0;
-
    (1-1/1)