ruby-changes:31978
From: tmm1 <ko1@a...>
Date: Sun, 8 Dec 2013 10:39:39 +0900 (JST)
Subject: [ruby-changes:31978] tmm1:r44057 (trunk): parse.y: use rb_fstring() for strings stored in the symbol table
tmm1 2013-12-08 10:39:27 +0900 (Sun, 08 Dec 2013) New Revision: 44057 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=44057 Log: 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 Modified files: trunk/ChangeLog trunk/ext/-test-/symbol/type.c trunk/parse.y trunk/string.c trunk/test/-ext-/symbol/test_type.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 44056) +++ ChangeLog (revision 44057) @@ -1,3 +1,18 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun Dec 8 10:22:38 2013 Aman Gupta <ruby@t...> + + * 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 + Sun Dec 8 10:24:20 2013 Eric Hodel <drbrain@s...> * lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC. Index: string.c =================================================================== --- string.c (revision 44056) +++ string.c (revision 44057) @@ -165,6 +165,9 @@ rb_fstring(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L165 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; @@ -173,6 +176,13 @@ rb_fstring(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L176 } 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) { int cmp = rb_str_hash_cmp(a, b); @@ -8718,8 +8728,6 @@ Init_String(void) https://github.com/ruby/ruby/blob/trunk/string.c#L8728 #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) https://github.com/ruby/ruby/blob/trunk/string.c#L8899 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); } Index: parse.y =================================================================== --- parse.y (revision 44056) +++ parse.y (revision 44057) @@ -10334,6 +10334,7 @@ static ID https://github.com/ruby/ruby/blob/trunk/parse.y#L10334 register_symid_str(ID id, VALUE str) { OBJ_FREEZE(str); + str = rb_fstring(str); if (RUBY_DTRACE_SYMBOL_CREATE_ENABLED()) { RUBY_DTRACE_SYMBOL_CREATE(RSTRING_PTR(str), rb_sourcefile(), rb_sourceline()); @@ -10544,6 +10545,7 @@ rb_id2str(ID id) https://github.com/ruby/ruby/blob/trunk/parse.y#L10545 name[1] = 0; str = rb_usascii_str_new(name, 1); OBJ_FREEZE(str); + str = rb_fstring(str); global_symbols.op_sym[i] = str; global_symbols.minor_marked = 0; } @@ -10555,6 +10557,7 @@ rb_id2str(ID id) https://github.com/ruby/ruby/blob/trunk/parse.y#L10557 if (!str) { str = rb_usascii_str_new2(op_tbl[i].name); OBJ_FREEZE(str); + str = rb_fstring(str); global_symbols.op_sym[i] = str; global_symbols.minor_marked = 0; } Index: ext/-test-/symbol/type.c =================================================================== --- ext/-test-/symbol/type.c (revision 44056) +++ ext/-test-/symbol/type.c (revision 44057) @@ -35,9 +35,16 @@ bug_sym_attrset(VALUE self, VALUE name) https://github.com/ruby/ruby/blob/trunk/ext/-test-/symbol/type.c#L35 return ID2SYM(id); } +static VALUE +bug_id2str(VALUE self, VALUE sym) +{ + return rb_id2str(SYM2ID(sym)); +} + void Init_type(VALUE klass) { FOREACH_ID_TYPES(declare_symbol_type_p); rb_define_singleton_method(klass, "attrset", bug_sym_attrset, 1); + rb_define_singleton_method(klass, "id2str", bug_id2str, 1); } Index: test/-ext-/symbol/test_type.rb =================================================================== --- test/-ext-/symbol/test_type.rb (revision 44056) +++ test/-ext-/symbol/test_type.rb (revision 44057) @@ -3,6 +3,16 @@ require "-test-/symbol" https://github.com/ruby/ruby/blob/trunk/test/-ext-/symbol/test_type.rb#L3 module Test_Symbol class TestType < Test::Unit::TestCase + def test_id2str_fstring_bug9171 + fstr = eval("# encoding: us-ascii + 'foobar'.freeze") + assert_same fstr, Bug::Symbol.id2str(:foobar) + + fstr = eval("# encoding: us-ascii + '>'.freeze") + assert_same fstr, Bug::Symbol.id2str(:>) + end + def assert_symtype(sym, pred, msg = nil) assert_send([Bug::Symbol, pred, sym], msg) end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/