summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-08 01:39:27 +0000
committertmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-08 01:39:27 +0000
commit98a74d4dd5fa9cd45121e8ebfc2f787d316e924f (patch)
treee8cdc2094b7dd1cdc57ecd58916413439d5ba663
parent100fe2e659339318846168841fd76ed4e38a6210 (diff)
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
-rw-r--r--ChangeLog15
-rw-r--r--ext/-test-/symbol/type.c7
-rw-r--r--parse.y3
-rw-r--r--string.c15
-rw-r--r--test/-ext-/symbol/test_type.rb10
5 files changed, 48 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 81c8bc7..d1cf9a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Sun Dec 8 10:22:38 2013 Aman Gupta <ruby@tmm1.net>
+
+ * 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@segment7.net>
* lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC.
diff --git a/ext/-test-/symbol/type.c b/ext/-test-/symbol/type.c
index e0b2fff..17f2d68 100644
--- a/ext/-test-/symbol/type.c
+++ b/ext/-test-/symbol/type.c
@@ -35,9 +35,16 @@ bug_sym_attrset(VALUE self, VALUE name)
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);
}
diff --git a/parse.y b/parse.y
index 8207ad7..2a0c5c6 100644
--- a/parse.y
+++ b/parse.y
@@ -10334,6 +10334,7 @@ static ID
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)
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)
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;
}
diff --git a/string.c b/string.c
index 151170c..f8dd03d 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;
@@ -173,6 +176,13 @@ rb_fstring(VALUE str)
}
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)
#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);
}
diff --git a/test/-ext-/symbol/test_type.rb b/test/-ext-/symbol/test_type.rb
index d681675..9053d93 100644
--- a/test/-ext-/symbol/test_type.rb
+++ b/test/-ext-/symbol/test_type.rb
@@ -3,6 +3,16 @@ require "-test-/symbol"
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