From 516dec250da5185d30fcff62f9b94de3e38b1ea5 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 1 Feb 2007 14:25:44 +0000 Subject: * parse.y (rb_id2str): store Strings for operator symbols. [ruby-dev:30235] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/matzruby@11608 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ parse.y | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c73de36d9a..0f5498d6f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Feb 1 23:25:21 2007 Nobuyoshi Nakada + + * parse.y (rb_id2str): store Strings for operator symbols. + [ruby-dev:30235] + Mon Jan 29 17:52:44 2007 Yukihiro Matsumoto * instruby.rb: use ":=" assignment to avoid potential local diff --git a/parse.y b/parse.y index a75b063b2e..7e994a5206 100644 --- a/parse.y +++ b/parse.y @@ -8285,6 +8285,7 @@ static struct symbols { st_table *id_str; st_table *ivar2_id; st_table *id_ivar2; + VALUE op_sym[tLAST_TOKEN]; } global_symbols = {tLAST_TOKEN}; static struct st_hash_type sym_hash_type = { @@ -8330,6 +8331,8 @@ void rb_gc_mark_symbols(void) { rb_mark_tbl(global_symbols.id_str); + rb_gc_mark_locations(global_symbols.op_sym, + global_symbols.op_sym + tLAST_TOKEN); } static ID @@ -8544,7 +8547,6 @@ ID rb_decompose_ivar2(ID id, VALUE *klassp) { struct ivar2_key *kp; - ID oid; if (!st_lookup(global_symbols.id_ivar2, (st_data_t)id, (st_data_t *)&kp)) { return id; @@ -8563,8 +8565,15 @@ rb_id2str(ID id) int i = 0; for (i=0; op_tbl[i].token; i++) { - if (op_tbl[i].token == id) - return rb_str_new2(op_tbl[i].name); + if (op_tbl[i].token == id) { + VALUE str = global_symbols.op_sym[i]; + if (!str) { + str = rb_str_new2(op_tbl[i].name); + OBJ_FREEZE(str); + global_symbols.op_sym[i] = str; + } + return str; + } } } -- cgit v1.2.1