diff options
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 47 |
1 files changed, 28 insertions, 19 deletions
@@ -6,7 +6,7 @@ $Date$ created at: Tue Oct 5 09:44:46 JST 1993 - Copyright (C) 1993-1996 Yukihiro Matsumoto + Copyright (C) 1993-1998 Yukihiro Matsumoto ************************************************/ @@ -26,10 +26,6 @@ #endif #endif -#ifdef _AIX -#pragma alloca -#endif - #ifdef C_ALLOCA void *alloca(); #endif @@ -177,7 +173,7 @@ typedef struct RVALUE { } free; struct RBasic basic; struct RObject object; - struct RClass class; + struct RClass klass; struct RFloat flonum; struct RString string; struct RArray array; @@ -253,14 +249,14 @@ rb_newobj() } VALUE -data_object_alloc(class, datap, dmark, dfree) - VALUE class; +data_object_alloc(klass, datap, dmark, dfree) + VALUE klass; void *datap; void (*dfree)(); void (*dmark)(); { NEWOBJ(data, struct RData); - OBJSETUP(data, class, T_DATA); + OBJSETUP(data, klass, T_DATA); data->data = datap; data->dfree = dfree; data->dmark = dmark; @@ -389,6 +385,7 @@ gc_mark(ptr) case NODE_IF: /* 1,2,3 */ case NODE_FOR: case NODE_ITER: + case NODE_CREF: gc_mark(obj->as.node.u2.node); /* fall through */ case NODE_BLOCK: /* 1,3 */ @@ -400,6 +397,9 @@ gc_mark(ptr) case NODE_DREGX_ONCE: case NODE_FBODY: case NODE_CALL: +#ifdef C_ALLOCA + case NODE_ALLOCA: +#endif gc_mark(obj->as.node.u1.node); /* fall through */ case NODE_SUPER: /* 3 */ @@ -466,19 +466,19 @@ gc_mark(ptr) return; /* no need to mark class. */ } - gc_mark(obj->as.basic.class); + gc_mark(obj->as.basic.klass); switch (obj->as.basic.flags & T_MASK) { case T_ICLASS: - gc_mark(obj->as.class.super); - mark_tbl(obj->as.class.iv_tbl); - mark_tbl(obj->as.class.m_tbl); + gc_mark(obj->as.klass.super); + mark_tbl(obj->as.klass.iv_tbl); + mark_tbl(obj->as.klass.m_tbl); break; case T_CLASS: case T_MODULE: - gc_mark(obj->as.class.super); - mark_tbl(obj->as.class.m_tbl); - mark_tbl(obj->as.class.iv_tbl); + gc_mark(obj->as.klass.super); + mark_tbl(obj->as.klass.m_tbl); + mark_tbl(obj->as.klass.iv_tbl); break; case T_ARRAY: @@ -644,7 +644,7 @@ obj_free(obj) case T_MODULE: case T_CLASS: rb_clear_cache(); - st_free_table(RANY(obj)->as.class.m_tbl); + st_free_table(RANY(obj)->as.klass.m_tbl); if (RANY(obj)->as.object.iv_tbl) { st_free_table(RANY(obj)->as.object.iv_tbl); } @@ -663,8 +663,17 @@ obj_free(obj) free(RANY(obj)->as.regexp.str); break; case T_DATA: - if (RANY(obj)->as.data.dfree && DATA_PTR(obj)) - (*RANY(obj)->as.data.dfree)(DATA_PTR(obj)); + if (DATA_PTR(obj)) { + if (RANY(obj)->as.data.dfree == (void*)-1) { + free(DATA_PTR(obj)); + } + if (RANY(obj)->as.data.dfree) { + (*RANY(obj)->as.data.dfree)(DATA_PTR(obj)); + } + else { + free(DATA_PTR(obj)); + } + } break; case T_MATCH: re_free_registers(RANY(obj)->as.match.regs); |