From: Tadayoshi Funaba Date: 1999-06-23T21:32:39+09:00 Subject: [ruby-dev:7199] File object ふなばです。 ruby-list でのファイルオブジェクトでの件で、ちょっと確認していて疑問が でてきました。 ファイルオブジェクトを生成しつづけてみると、メモリが回収されていないよ うな気がします。で、どうもつぎのようにすると、治まりそうです。 --- gc.c.orig Fri Jun 11 15:29:53 1999 +++ gc.c Wed Jun 23 20:49:13 1999 @@ -593,6 +593,9 @@ break; case T_FILE: + rb_mark_tbl(obj->as.file.iv_tbl); + break; + case T_REGEXP: case T_FLOAT: case T_BIGNUM: @@ -790,6 +793,9 @@ } break; case T_FILE: + if (RANY(obj)->as.file.iv_tbl) { + st_free_table(RANY(obj)->as.file.iv_tbl); + } if (RANY(obj)->as.file.fptr) { rb_io_fptr_finalize(RANY(obj)->as.file.fptr); free(RANY(obj)->as.file.fptr); あるいは、ファイルオブジェクトには、もう iv_tbl は必要ないのかという気 もします。 --- ruby.h.orig Tue Jun 8 00:57:41 1999 +++ ruby.h Wed Jun 23 21:03:56 1999 @@ -265,7 +265,6 @@ struct RFile { struct RBasic basic; - struct st_table *iv_tbl; struct OpenFile *fptr; }; --- variable.c.orig Wed Jun 9 18:21:33 1999 +++ variable.c Wed Jun 23 21:01:42 1999 @@ -833,7 +833,6 @@ case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, &val)) return val; break; @@ -860,7 +859,6 @@ case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (!ROBJECT(obj)->iv_tbl) ROBJECT(obj)->iv_tbl = st_init_numtable(); st_insert(ROBJECT(obj)->iv_tbl, id, val); break; @@ -880,7 +878,6 @@ case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, 0)) return Qtrue; break; @@ -916,7 +913,6 @@ case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: ary = rb_ary_new(); if (ROBJECT(obj)->iv_tbl) { st_foreach(ROBJECT(obj)->iv_tbl, ivar_i, ary); @@ -955,7 +951,6 @@ case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl) { st_delete(ROBJECT(obj)->iv_tbl, &id, &val); } じつは、よくわかってないのですが、どうなんでしょう。 # なんか勘違いしてるかなあ (0..24).each{|i|$><<('Itwu%hliqk`z)U|a{(hggcmr*'[i]^Math::PI*10**i%10).chr} ふなば ただよし