From 98a74d4dd5fa9cd45121e8ebfc2f787d316e924f Mon Sep 17 00:00:00 2001 From: tmm1 Date: Sun, 8 Dec 2013 01:39:27 +0000 Subject: parse.y: use rb_fstring() for strings stored in the symbol table * parse.y (register_symid_str): use fstrings in symbol table [Bug #9171] [ruby-core:58656] * parse.y (rb_id2str): ditto * string.c (rb_fstring): create frozen_strings on first usage. this allows rb_fstring() calls from the parser (before cString is created) * string.c (fstring_set_class_i): set klass on fstrings generated before cString was defined * string.c (Init_String): convert frozen_strings table to String objects after boot * ext/-test-/symbol/type.c (bug_sym_id2str): expose rb_id2str() * test/-ext-/symbol/test_type.rb (module Test_Symbol): verify symbol table entries are fstrings git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44057 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index 151170cee1..f8dd03d46e 100644 --- a/string.c +++ b/string.c @@ -165,6 +165,9 @@ rb_fstring(VALUE str) VALUE fstr = Qnil; Check_Type(str, T_STRING); + if (!frozen_strings) + frozen_strings = st_init_table(&fstring_hash_type); + if (FL_TEST(str, RSTRING_FSTR)) return str; @@ -172,6 +175,13 @@ rb_fstring(VALUE str) return fstr; } +static int +fstring_set_class_i(st_data_t key, st_data_t val, st_data_t arg) +{ + RBASIC_SET_CLASS((VALUE)key, (VALUE)arg); + return ST_CONTINUE; +} + static int fstring_cmp(VALUE a, VALUE b) { @@ -8718,8 +8728,6 @@ Init_String(void) #undef rb_intern #define rb_intern(str) rb_intern_const(str) - frozen_strings = st_init_table(&fstring_hash_type); - rb_cString = rb_define_class("String", rb_cObject); rb_include_module(rb_cString, rb_mComparable); rb_define_alloc_func(rb_cString, empty_str_alloc); @@ -8891,4 +8899,7 @@ Init_String(void) rb_define_method(rb_cSymbol, "swapcase", sym_swapcase, 0); rb_define_method(rb_cSymbol, "encoding", sym_encoding, 0); + + if (frozen_strings) + st_foreach(frozen_strings, fstring_set_class_i, rb_cString); } -- cgit v1.2.3