From 1a060a2e99e835cc2c6b32f113f4c07bc9616364 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 24 Dec 2007 19:25:45 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/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 9e1c2d0af..b654e20cb 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 3427a3c1e..0a1f1acaa 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; } -- cgit