なかだです。

At Wed, 25 Jun 2003 12:31:57 +0900,
Minero Aoki wrote:
> > 難しい方は、どうしようかな、なんでrb_class_tblを分離したんだっ
> > け。あんまり昔のことで覚えていないなあ。
> 
> 以前「GC 対策」と聞きました。たぶん、クラスオブジェクトを
> rb_gc_register_address せずにグローバル変数に入れておける
> ようになる、ということだと思うんですけど。

rb_class_tblを残すか、rb_cObjectを直接マークすればいいのでは。
結局大本になるテーブルはどこかに必須なので、そこをマークするの
に違いはないのではないかと。

昨日作ってみたやつです。


Index: object.c =================================================================== RCS file: //sharui/cvs/ruby/src/ruby/object.c,v retrieving revision 1.121 diff -u -2 -p -r1.121 object.c --- object.c 21 Jun 2003 14:51:21 -0000 1.121 +++ object.c 24 Jun 2003 10:38:59 -0000 @@ -1350,7 +1350,9 @@ void Init_Object() { + extern st_table *rb_class_tbl; VALUE metaclass; rb_cObject = boot_defclass("Object", 0); + RCLASS(rb_cObject)->iv_tbl = rb_class_tbl; rb_cModule = boot_defclass("Module", rb_cObject); rb_cClass = boot_defclass("Class", rb_cModule); Index: variable.c =================================================================== RCS file: //sharui/cvs/ruby/src/ruby/variable.c,v retrieving revision 1.90 diff -u -2 -p -r1.90 variable.c --- variable.c 20 Jun 2003 07:11:41 -0000 1.90 +++ variable.c 24 Jun 2003 10:40:02 -0000 @@ -1254,14 +1254,4 @@ rb_autoload_p(mod, id) } -static int -top_const_get(id, klassp) - ID id; - VALUE *klassp; -{ - /* pre-defined class */ - if (st_lookup(rb_class_tbl, id, klassp)) return Qtrue; - return Qfalse; -} - VALUE rb_const_get_at(klass, id) @@ -1278,7 +1268,4 @@ rb_const_get_at(klass, id) return value; } - if (klass == rb_cObject && top_const_get(id, &value)) { - return value; - } uninitialized_constant(klass, id); return Qnil; /* not reached */ @@ -1308,5 +1295,4 @@ rb_const_get_0(klass, id, exclude) return value; } - if (tmp == rb_cObject && top_const_get(id, &value)) return value; tmp = RCLASS(tmp)->super; } @@ -1393,7 +1379,4 @@ rb_mod_const_at(mod, data) st_foreach(RCLASS(mod)->iv_tbl, sv_i, (st_data_t)tbl); } - if ((VALUE)mod == rb_cObject) { - st_foreach(rb_class_tbl, sv_i, (st_data_t)tbl); - } return tbl; } @@ -1500,6 +1483,4 @@ rb_const_defined(klass, id) return rb_const_defined(rb_cObject, id); } - if (st_lookup(rb_class_tbl, id, 0)) - return Qtrue; return Qfalse; } @@ -1523,6 +1504,5 @@ mod_av_set(klass, id, val, isconst) VALUE value = Qfalse; - if (st_lookup(RCLASS(klass)->iv_tbl, id, &value) || - (klass == rb_cObject && st_lookup(rb_class_tbl, id, 0))) { + if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) { if (value == Qundef) autoload_delete(klass, id); @@ -1558,10 +1538,4 @@ rb_const_assign(klass, id, val) } tmp = RCLASS(tmp)->super; - } - /* pre-defined class */ - if (st_lookup(rb_class_tbl, id, 0)) { - st_delete(rb_class_tbl, &id, 0); - st_insert(RCLASS(rb_cObject)->iv_tbl, id, val); - return; }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦