diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-28 06:21:46 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-28 06:21:46 +0000 |
commit | 5c0e68c39c3fc7717311826549a30d1615eb2007 (patch) | |
tree | ddf952542b46d0c180ed6200fcdb7b3e00036b32 /gc.c | |
parent | 041fbcbf50993925b2d61fbfca4d16b766d8ea5d (diff) | |
download | ruby-5c0e68c39c3fc7717311826549a30d1615eb2007.tar.gz |
* include/ruby/intern.h: export rb_ivar_foreach.
* include/ruby/ruby.h: modify struct RObject and RClass for optimizing
T_OBJECT space. [ruby-dev:31853]
(ROBJECT_LEN, ROBJECT_PTR)
(RCLASS_IV_TBL, RCLASS_M_TBL, RCLASS_SUPER, RCLASS_IV_INDEX_TBL)
(RMODULE_IV_TBL, RMODULE_M_TBL, RMODULE_SUPER): abstract accessor
defined.
* variable.c: support the modified RObject and RClass.
* object.c: ditto.
* class.c: ditto.
* gc.c: ditto.
* marshal.c: ditto.
* eval_method.ci: use the abstract accessor.
* insns.def: ditto.
* proc.c: ditto.
* struct.c: ditto.
* eval.c: ditto.
* error.c: ditto.
* vm.c: ditto.
* insnhelper.ci: ditto.
* ext/digest/digest.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 29 |
1 files changed, 20 insertions, 9 deletions
@@ -1033,9 +1033,9 @@ gc_mark_children(VALUE ptr, int lev) case T_ICLASS: case T_CLASS: case T_MODULE: - mark_tbl(obj->as.klass.m_tbl, lev); - mark_tbl(obj->as.klass.iv_tbl, lev); - ptr = obj->as.klass.super; + mark_tbl(RCLASS_M_TBL(obj), lev); + mark_tbl(RCLASS_IV_TBL(obj), lev); + ptr = RCLASS_SUPER(obj); goto again; case T_ARRAY: @@ -1070,7 +1070,13 @@ gc_mark_children(VALUE ptr, int lev) break; case T_OBJECT: - mark_tbl(obj->as.object.iv_tbl, lev); + { + long i, len = ROBJECT_LEN(obj); + VALUE *ptr = ROBJECT_PTR(obj); + for (i = 0; i < len; i++) { + gc_mark(*ptr++, lev); + } + } break; case T_FILE: @@ -1269,17 +1275,22 @@ obj_free(VALUE obj) switch (RANY(obj)->as.basic.flags & T_MASK) { case T_OBJECT: - if (RANY(obj)->as.object.iv_tbl) { - st_free_table(RANY(obj)->as.object.iv_tbl); + if (!(RANY(obj)->as.basic.flags & ROBJECT_EMBED) && + RANY(obj)->as.object.as.heap.ptr) { + RUBY_CRITICAL(free(RANY(obj)->as.object.as.heap.ptr)); } break; case T_MODULE: case T_CLASS: rb_clear_cache_by_class((VALUE)obj); - 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); + st_free_table(RCLASS_M_TBL(obj)); + if (RCLASS_IV_TBL(obj)) { + st_free_table(RCLASS_IV_TBL(obj)); + } + if (RCLASS_IV_INDEX_TBL(obj)) { + st_free_table(RCLASS_IV_INDEX_TBL(obj)); } + RUBY_CRITICAL(free(RANY(obj)->as.klass.ptr)); break; case T_STRING: rb_str_free(obj); |