[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]