зеркало из https://github.com/github/ruby.git
* 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:
Родитель
f0c968a778
Коммит
a8ec4b2cf2
|
@ -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
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);
|
||||||
}
|
}
|
||||||
|
|
15
string.c
15
string.c
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче