From c94a89a739f32e9fcf64e2170b973717242090e3 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 24 Dec 2007 19:25:45 +0000 Subject: [PATCH] * parse.y (rb_id2str): fill klass of returned string as rb_cString. some strings are allocated before rb_cString is created. This prevents a "called on terminated object" error by ObjectSpace.each_object(Module) {|m| p m.name }. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ parse.y | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e1c2d0af0..b654e20cb9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Dec 25 04:23:32 2007 Tanaka Akira + + * parse.y (rb_id2str): fill klass of returned string as rb_cString. + some strings are allocated before rb_cString is created. + This prevents a "called on terminated object" error by + ObjectSpace.each_object(Module) {|m| p m.name }. + Tue Dec 25 03:51:55 2007 Koichi Sasada * compile.c (iseq_compile_each): fix stack consistency bug. diff --git a/parse.y b/parse.y index 3427a3c1ec..0a1f1acaaa 100644 --- a/parse.y +++ b/parse.y @@ -9039,8 +9039,12 @@ rb_id2str(ID id) } } - if (st_lookup(global_symbols.id_str, id, &data)) - return (VALUE)data; + if (st_lookup(global_symbols.id_str, id, &data)) { + VALUE str = (VALUE)data; + if (RBASIC(str)->klass == 0) + RBASIC(str)->klass = rb_cString; + return str; + } if (is_attrset_id(id)) { ID id2 = (id & ~ID_SCOPE_MASK) | ID_LOCAL; @@ -9053,8 +9057,12 @@ rb_id2str(ID id) str = rb_str_dup(str); rb_str_cat(str, "=", 1); rb_intern_str(str); - if (st_lookup(global_symbols.id_str, id, &data)) - return (VALUE)data; + if (st_lookup(global_symbols.id_str, id, &data)) { + VALUE str = (VALUE)data; + if (RBASIC(str)->klass == 0) + RBASIC(str)->klass = rb_cString; + return str; + } } return 0; }