From: nobu.nakada@... Date: 2001-12-31T03:50:27+09:00 Subject: [ruby-dev:15611] Re: filename within eval なかだです。 At Mon, 31 Dec 2001 01:33:18 +0900, Nobuyoshi-Nakada wrote: > > もうちょっとマシ…かどうかはともかく、新しい手を考えてみました。 > > たぶんGCもそれほど遅くはならないと思います。 > > 失敗。ruby_sourcefileに直接代入してるところがあるのを忘れてまし > た。 > > # やっぱり結構大きくなってしまった。 考えてみたら、VALUEにしておく必要もないような。 たびたびすいませんが、[ruby-dev:15610]からの差分です。 --- gc.c~ Mon Dec 31 01:00:44 2001 +++ gc.c Mon Dec 31 02:22:44 2001 @@ -436,25 +436,37 @@ rb_source_filename(f) const char *f; { - VALUE name; + char *name; if (!st_lookup(source_filenames, f, &name)) { - long len = strlen(f); - VALUE *ptr = (VALUE *)RSTRING(name = rb_str_new(0, sizeof(VALUE) + len))->ptr; - *ptr++ = name; + long len = strlen(f) + 1; + char *ptr = name = ALLOC_N(char, len + 1); + *ptr++ = 0; MEMCPY(ptr, f, char, len); - OBJ_FREEZE(name); st_add_direct(source_filenames, ptr, name); - return (char *)ptr; + return ptr; } - return RSTRING(name)->ptr + sizeof(VALUE); + return name + 1; } static void mark_source_filename(f) - const char *f; + char *f; { if (f) { - VALUE name = ((VALUE *)f)[-1]; - FL_SET(name, FL_MARK); + f[-1] = 1; + } +} + +static enum st_retval +sweep_source_filename(key, value) + char *key, *value; +{ + if (*value) { + *value = 0; + return ST_CONTINUE; + } + else { + free(value); + return ST_DELETE; } } @@ -861,11 +873,4 @@ rb_gc_mark_children(ptr) static void obj_free _((VALUE)); -static enum st_retval -sweep_tbl_value(key, value) - VALUE key, value; -{ - return FL_TEST(value, FL_MARK) ? ST_CONTINUE : ST_DELETE; -} - static void gc_sweep() @@ -887,5 +892,5 @@ gc_sweep() } - st_foreach(source_filenames, sweep_tbl_value, 0); + st_foreach(source_filenames, sweep_source_filename, 0); freelist = 0; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦