summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-24 19:25:45 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-24 19:25:45 +0000
commit1a060a2e99e835cc2c6b32f113f4c07bc9616364 (patch)
tree65d9f7e16e5ca9d4dcbcb9d983dfdfa047dd4299
parent0ffbe62c53487caea929999bdb83aab4606cf34b (diff)
downloadruby-1a060a2e99e835cc2c6b32f113f4c07bc9616364.tar.gz
ruby-1a060a2e99e835cc2c6b32f113f4c07bc9616364.tar.xz
ruby-1a060a2e99e835cc2c6b32f113f4c07bc9616364.zip
* 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
-rw-r--r--ChangeLog7
-rw-r--r--parse.y16
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 <akr@fsij.org>
+
+ * 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 <ko1@atdot.net>
* 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;
}