* string.c (sym_find): remove Symbol.find because we have Symbol GC now.

https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140904Japan
  If you still want this, request again on Redmine. [Feature #7854]
  https://bugs.ruby-lang.org/issues/7854

* ext/-test-/symbol/init.c (sym_find): moved from string.c for tests.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2014-09-11 21:22:52 +00:00
Родитель f0c968a778
Коммит a8ec4b2cf2
6 изменённых файлов: 38 добавлений и 54 удалений

Просмотреть файл

@ -1,3 +1,12 @@
Fri Sep 12 06:15:37 2014 NARUSE, Yui <naruse@ruby-lang.org>
* string.c (sym_find): remove Symbol.find because we have Symbol GC now.
https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140904Japan
If you still want this, request again on Redmine. [Feature #7854]
https://bugs.ruby-lang.org/issues/7854
* ext/-test-/symbol/init.c (sym_find): moved from string.c for tests.
Fri Sep 12 04:24:03 2014 Eric Wong <e@80x24.org> Fri Sep 12 04:24:03 2014 Eric Wong <e@80x24.org>
* insns.def (once): define and use fake RUNNING_THREAD_ONCE_DONE * insns.def (once): define and use fake RUNNING_THREAD_ONCE_DONE

2
NEWS
Просмотреть файл

@ -64,8 +64,6 @@ with all sufficient information, see the ChangeLog file.
vfork() is faster than fork() when the parent process uses huge memory. vfork() is faster than fork() when the parent process uses huge memory.
* Symbol * Symbol
* New methods
* Symbol.find(str) returns whether given string is defined as symbol or not.
* Improvements * Improvements
* Most symbols which are returned by String#to_sym and * Most symbols which are returned by String#to_sym and
String#intern are GC-able. String#intern are GC-able.

Просмотреть файл

@ -2,10 +2,17 @@
#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);} #define init(n) {void Init_##n(VALUE klass); Init_##n(klass);}
static VALUE
sym_find(VALUE dummy, VALUE sym)
{
return rb_check_symbol(&sym);
}
void void
Init_symbol(void) Init_symbol(void)
{ {
VALUE mBug = rb_define_module("Bug"); VALUE mBug = rb_define_module("Bug");
VALUE klass = rb_define_class_under(mBug, "Symbol", rb_cSymbol); VALUE klass = rb_define_class_under(mBug, "Symbol", rb_cSymbol);
rb_define_singleton_method(klass, "find", sym_find, 1);
TEST_INIT_FUNCS(init); TEST_INIT_FUNCS(init);
} }

Просмотреть файл

@ -8339,20 +8339,6 @@ str_scrub_bang(int argc, VALUE *argv, VALUE str)
*/ */
/*
* call-seq:
* Symbol.find(str) -> symbol or nil
*
* Return the related symbol if the symbol already exists.
* Return nil if not.
*/
static VALUE
sym_find(VALUE dummy, VALUE sym)
{
return rb_check_symbol(&sym);
}
/* /*
* call-seq: * call-seq:
* sym == obj -> true or false * sym == obj -> true or false
@ -8924,7 +8910,6 @@ Init_String(void)
rb_undef_alloc_func(rb_cSymbol); rb_undef_alloc_func(rb_cSymbol);
rb_undef_method(CLASS_OF(rb_cSymbol), "new"); rb_undef_method(CLASS_OF(rb_cSymbol), "new");
rb_define_singleton_method(rb_cSymbol, "all_symbols", rb_sym_all_symbols, 0); /* in symbol.c */ rb_define_singleton_method(rb_cSymbol, "all_symbols", rb_sym_all_symbols, 0); /* in symbol.c */
rb_define_singleton_method(rb_cSymbol, "find", sym_find, 1);
rb_define_method(rb_cSymbol, "==", sym_equal, 1); rb_define_method(rb_cSymbol, "==", sym_equal, 1);
rb_define_method(rb_cSymbol, "===", sym_equal, 1); rb_define_method(rb_cSymbol, "===", sym_equal, 1);

Просмотреть файл

@ -7,7 +7,7 @@ module Test_Symbol
prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}" prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
begin begin
name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}" name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
end while ::Symbol.find(name) end while Bug::Symbol.find(name)
name name
end end
@ -16,7 +16,7 @@ module Test_Symbol
end end
def assert_not_interned(name, msg = nil) def assert_not_interned(name, msg = nil)
assert_not_send([::Symbol, :find, name], msg) assert_not_send([Bug::Symbol, :find, name], msg)
end end
def assert_not_interned_error(obj, meth, name, msg = nil) def assert_not_interned_error(obj, meth, name, msg = nil)
@ -262,5 +262,25 @@ module Test_Symbol
assert_raise(NameError) {mod.module_eval {attr_accessor(name)}} assert_raise(NameError) {mod.module_eval {attr_accessor(name)}}
assert_not_interned(name) assert_not_interned(name)
end end
def test_gc_attrset
assert_separately(['-r-test-/symbol', '-', '[ruby-core:62226] [Bug #9787]'], <<-'end;') # begin
bug = ARGV.shift
def noninterned_name(prefix = "")
prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
begin
name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
end while Bug::Symbol.find(name) or Bug::Symbol.find(name + "=")
name
end
names = Array.new(1000) {noninterned_name("gc")}
names.each {|n| n.to_sym}
GC.start(immediate_sweep: false)
names.each do |n|
eval(":#{n}=")
assert_nothing_raised(TypeError, bug) {eval("proc{self.#{n} = nil}")}
end
end;
end
end end
end end

Просмотреть файл

@ -1,5 +1,4 @@
require 'test/unit' require 'test/unit'
require_relative 'envutil'
class TestSymbol < Test::Unit::TestCase class TestSymbol < Test::Unit::TestCase
# [ruby-core:3573] # [ruby-core:3573]
@ -208,20 +207,6 @@ class TestSymbol < Test::Unit::TestCase
assert_equal(true, :foo.to_sym.frozen?) assert_equal(true, :foo.to_sym.frozen?)
end end
def test_sym_find
assert_separately(%w[--disable=gems], <<-"end;")
assert_equal :intern, Symbol.find("intern")
assert_raise(TypeError){ Symbol.find(true) }
str = "__noexistent__"
assert_equal nil, Symbol.find(str)
assert_equal nil, Symbol.find(str)
sym = str.intern
assert_equal str, sym.to_s
assert_equal sym, Symbol.find(str)
end;
end
def test_symbol_gc_1 def test_symbol_gc_1
assert_normal_exit('".".intern;GC.start(immediate_sweep:false);eval %[GC.start;".".intern]', assert_normal_exit('".".intern;GC.start(immediate_sweep:false);eval %[GC.start;".".intern]',
'', '',
@ -237,24 +222,4 @@ class TestSymbol < Test::Unit::TestCase
'', '',
child_env: '--disable-gems') child_env: '--disable-gems')
end end
def test_gc_attrset
assert_separately(['-', '[ruby-core:62226] [Bug #9787]'], <<-'end;') # begin
bug = ARGV.shift
def noninterned_name(prefix = "")
prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
begin
name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
end while Symbol.find(name) or Symbol.find(name + "=")
name
end
names = Array.new(1000) {noninterned_name("gc")}
names.each {|n| n.to_sym}
GC.start(immediate_sweep: false)
names.each do |n|
eval(":#{n}=")
assert_nothing_raised(TypeError, bug) {eval("proc{self.#{n} = nil}")}
end
end;
end
end end