From: Tanaka Akira Date: 2007-06-27T02:22:30+09:00 Subject: [ruby-dev:31064] string allocation in rb_intern rb_intern が毎回、(すでにシンボルがあっても) String オブジェ クトを生成します。 そうしないようにするふざけたコードをつい書いてしまったのでと りあえず送っておきます。 Index: parse.y =================================================================== --- parse.y (リビジョン 12629) +++ parse.y (作業コピー) @@ -8390,11 +8390,17 @@ rb_intern2(const char *name, long len) { const char *m = name; - VALUE str = rb_str_new(name, len); + VALUE str; ID id; int last; + struct RString fake_str; + fake_str.basic.flags = T_STRING|RSTRING_NOEMBED|FL_FREEZE; + fake_str.basic.klass = rb_cString; + fake_str.as.heap.len = len; + fake_str.as.heap.ptr = name; + fake_str.as.heap.aux.capa = len; - if (st_lookup(global_symbols.sym_id, (st_data_t)str, (st_data_t *)&id)) + if (st_lookup(global_symbols.sym_id, (st_data_t)&fake_str, (st_data_t *)&id)) return id; last = len-1; @@ -8454,6 +8460,7 @@ new_id: id |= ++global_symbols.last_id << ID_SCOPE_SHIFT; id_register: + str = rb_str_new(name, len); OBJ_FREEZE(str); st_add_direct(global_symbols.sym_id, (st_data_t)str, id); st_add_direct(global_symbols.id_str, id, (st_data_t)str); -- [田中 哲][たなか あきら][Tanaka Akira]