* 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>
* 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.
* Symbol
* New methods
* Symbol.find(str) returns whether given string is defined as symbol or not.
* Improvements
* Most symbols which are returned by String#to_sym and
String#intern are GC-able.

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

@ -2,10 +2,17 @@
#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
Init_symbol(void)
{
VALUE mBug = rb_define_module("Bug");
VALUE klass = rb_define_class_under(mBug, "Symbol", rb_cSymbol);
rb_define_singleton_method(klass, "find", sym_find, 1);
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:
* sym == obj -> true or false
@ -8924,7 +8910,6 @@ Init_String(void)
rb_undef_alloc_func(rb_cSymbol);
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, "find", sym_find, 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('-', '_')}"
begin
name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
end while ::Symbol.find(name)
end while Bug::Symbol.find(name)
name
end
@ -16,7 +16,7 @@ module Test_Symbol
end
def assert_not_interned(name, msg = nil)
assert_not_send([::Symbol, :find, name], msg)
assert_not_send([Bug::Symbol, :find, name], msg)
end
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_not_interned(name)
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

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

@ -1,5 +1,4 @@
require 'test/unit'
require_relative 'envutil'
class TestSymbol < Test::Unit::TestCase
# [ruby-core:3573]
@ -208,20 +207,6 @@ class TestSymbol < Test::Unit::TestCase
assert_equal(true, :foo.to_sym.frozen?)
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
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')
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