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
This commit is contained in:
parent
100fe2e659
commit
98a74d4dd5
15
ChangeLog
15
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>
|
Sun Dec 8 10:24:20 2013 Eric Hodel <drbrain@segment7.net>
|
||||||
|
|
||||||
* lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC.
|
* lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC.
|
||||||
|
@ -35,9 +35,16 @@ bug_sym_attrset(VALUE self, VALUE name)
|
|||||||
return ID2SYM(id);
|
return ID2SYM(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
bug_id2str(VALUE self, VALUE sym)
|
||||||
|
{
|
||||||
|
return rb_id2str(SYM2ID(sym));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Init_type(VALUE klass)
|
Init_type(VALUE klass)
|
||||||
{
|
{
|
||||||
FOREACH_ID_TYPES(declare_symbol_type_p);
|
FOREACH_ID_TYPES(declare_symbol_type_p);
|
||||||
rb_define_singleton_method(klass, "attrset", bug_sym_attrset, 1);
|
rb_define_singleton_method(klass, "attrset", bug_sym_attrset, 1);
|
||||||
|
rb_define_singleton_method(klass, "id2str", bug_id2str, 1);
|
||||||
}
|
}
|
||||||
|
3
parse.y
3
parse.y
@ -10334,6 +10334,7 @@ static ID
|
|||||||
register_symid_str(ID id, VALUE str)
|
register_symid_str(ID id, VALUE str)
|
||||||
{
|
{
|
||||||
OBJ_FREEZE(str);
|
OBJ_FREEZE(str);
|
||||||
|
str = rb_fstring(str);
|
||||||
|
|
||||||
if (RUBY_DTRACE_SYMBOL_CREATE_ENABLED()) {
|
if (RUBY_DTRACE_SYMBOL_CREATE_ENABLED()) {
|
||||||
RUBY_DTRACE_SYMBOL_CREATE(RSTRING_PTR(str), rb_sourcefile(), rb_sourceline());
|
RUBY_DTRACE_SYMBOL_CREATE(RSTRING_PTR(str), rb_sourcefile(), rb_sourceline());
|
||||||
@ -10544,6 +10545,7 @@ rb_id2str(ID id)
|
|||||||
name[1] = 0;
|
name[1] = 0;
|
||||||
str = rb_usascii_str_new(name, 1);
|
str = rb_usascii_str_new(name, 1);
|
||||||
OBJ_FREEZE(str);
|
OBJ_FREEZE(str);
|
||||||
|
str = rb_fstring(str);
|
||||||
global_symbols.op_sym[i] = str;
|
global_symbols.op_sym[i] = str;
|
||||||
global_symbols.minor_marked = 0;
|
global_symbols.minor_marked = 0;
|
||||||
}
|
}
|
||||||
@ -10555,6 +10557,7 @@ rb_id2str(ID id)
|
|||||||
if (!str) {
|
if (!str) {
|
||||||
str = rb_usascii_str_new2(op_tbl[i].name);
|
str = rb_usascii_str_new2(op_tbl[i].name);
|
||||||
OBJ_FREEZE(str);
|
OBJ_FREEZE(str);
|
||||||
|
str = rb_fstring(str);
|
||||||
global_symbols.op_sym[i] = str;
|
global_symbols.op_sym[i] = str;
|
||||||
global_symbols.minor_marked = 0;
|
global_symbols.minor_marked = 0;
|
||||||
}
|
}
|
||||||
|
15
string.c
15
string.c
@ -165,6 +165,9 @@ rb_fstring(VALUE str)
|
|||||||
VALUE fstr = Qnil;
|
VALUE fstr = Qnil;
|
||||||
Check_Type(str, T_STRING);
|
Check_Type(str, T_STRING);
|
||||||
|
|
||||||
|
if (!frozen_strings)
|
||||||
|
frozen_strings = st_init_table(&fstring_hash_type);
|
||||||
|
|
||||||
if (FL_TEST(str, RSTRING_FSTR))
|
if (FL_TEST(str, RSTRING_FSTR))
|
||||||
return str;
|
return str;
|
||||||
|
|
||||||
@ -172,6 +175,13 @@ rb_fstring(VALUE str)
|
|||||||
return fstr;
|
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
|
static int
|
||||||
fstring_cmp(VALUE a, VALUE b)
|
fstring_cmp(VALUE a, VALUE b)
|
||||||
{
|
{
|
||||||
@ -8718,8 +8728,6 @@ Init_String(void)
|
|||||||
#undef rb_intern
|
#undef rb_intern
|
||||||
#define rb_intern(str) rb_intern_const(str)
|
#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_cString = rb_define_class("String", rb_cObject);
|
||||||
rb_include_module(rb_cString, rb_mComparable);
|
rb_include_module(rb_cString, rb_mComparable);
|
||||||
rb_define_alloc_func(rb_cString, empty_str_alloc);
|
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, "swapcase", sym_swapcase, 0);
|
||||||
|
|
||||||
rb_define_method(rb_cSymbol, "encoding", sym_encoding, 0);
|
rb_define_method(rb_cSymbol, "encoding", sym_encoding, 0);
|
||||||
|
|
||||||
|
if (frozen_strings)
|
||||||
|
st_foreach(frozen_strings, fstring_set_class_i, rb_cString);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,16 @@ require "-test-/symbol"
|
|||||||
|
|
||||||
module Test_Symbol
|
module Test_Symbol
|
||||||
class TestType < Test::Unit::TestCase
|
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)
|
def assert_symtype(sym, pred, msg = nil)
|
||||||
assert_send([Bug::Symbol, pred, sym], msg)
|
assert_send([Bug::Symbol, pred, sym], msg)
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user