diff options
| author | Ryan Scott <[email protected]> | 2013-07-19 22:40:54 +1000 |
|---|---|---|
| committer | Ryan Scott <[email protected]> | 2013-07-19 22:40:54 +1000 |
| commit | eb0ee358157d063b3bfc87b94ecfc2e20f6ec764 (patch) | |
| tree | ae7e30ed6b2cfc23a1e22b48c6e67245d75345a3 | |
| parent | 75f8aab247abf58b61b3700c078d61ccf7e168bf (diff) | |
| parent | fe5324bd17d1716592b244762173e7478ebf7853 (diff) | |
| download | mruby-eb0ee358157d063b3bfc87b94ecfc2e20f6ec764.tar.gz mruby-eb0ee358157d063b3bfc87b94ecfc2e20f6ec764.zip | |
Merge branch 'master' into attr-perf-fix
Conflicts:
mrblib/class.rb
| -rw-r--r-- | mrblib/class.rb | 20 | ||||
| -rw-r--r-- | test/t/module.rb | 180 |
2 files changed, 193 insertions, 7 deletions
diff --git a/mrblib/class.rb b/mrblib/class.rb index d6ef34f17..0678d943d 100644 --- a/mrblib/class.rb +++ b/mrblib/class.rb @@ -1,18 +1,24 @@ class Module # 15.2.2.4.13 def attr_reader(*names) - names.each{|name| - name2 = ('@'+name.to_s) + names.each do |name| + name = name.to_s + raise(NameError, "#{name.inspect} is not allowed as an instance variable name") if name.include?('@') || name.include?('?') || name.include?('$') + + name2 = ('@'+name).intern define_method(name){self.instance_variable_get(name2)} - } + end end # 15.2.2.4.14 def attr_writer(*names) - names.each{|name| - name2 = ('@'+name.to_s) - name = (name.to_s+"=") + names.each do |name| + name = name.to_s + raise(NameError, "#{name.inspect} is not allowed as an instance variable name") if name.include?('@') || name.include?('?') || name.include?('$') + + name2 = ('@'+name).intern + name = (name+"=").intern define_method(name){|v|self.instance_variable_set(name2,v)} - } + end end # 15.2.2.4.12 def attr_accessor(*names) diff --git a/test/t/module.rb b/test/t/module.rb index 9d735f5da..a03511b09 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -37,6 +37,186 @@ assert('Module#append_features', '15.2.2.4.10') do assert_equal Test4AppendFeatures2.const_get(:Const4AppendFeatures2), Test4AppendFeatures2 end +assert('Module#attr', '15.2.2.4.11') do + %w[ + foo? + @foo + @@foo + $foo + ].each do |name| + assert_raise(NameError) do + module NameTest; end + NameTest.module_eval { attr_reader name.to_sym } + end + end + + class AttrTest + class << self + attr :cattr + def cattr_val + @cattr + end + def cattr_val=(val) + @cattr = val + end + end + attr :iattr + + def iattr_val + @iattr + end + def iattr_val=(val) + @iattr = val + end + end + + test = AttrTest.new + assert_true AttrTest.respond_to?(:cattr) + assert_true test.respond_to?(:iattr) + + assert_false AttrTest.respond_to?(:vattr=) + assert_false test.respond_to?(:iattr=) + + test.iattr_val = 'test' + assert_equal 'test', test.iattr + + AttrTest.cattr_val = 'test' + assert_equal 'test', AttrTest.cattr +end + +assert('Module#attr_accessor', '15.2.2.4.12') do + %w[ + foo? + @foo + @@foo + $foo + ].each do |name| + assert_raise(NameError) do + module NameTest; end + NameTest.module_eval { attr_reader name.to_sym } + end + end + + class AttrTestAccessor + class << self + attr_accessor :cattr + end + attr_accessor :iattr, 'iattr2' + end + + attr_instance = AttrTestAccessor.new + assert_true AttrTestAccessor.respond_to?(:cattr=) + assert_true attr_instance.respond_to?(:iattr=) + assert_true attr_instance.respond_to?(:iattr2=) + assert_true AttrTestAccessor.respond_to?(:cattr) + assert_true attr_instance.respond_to?(:iattr) + assert_true attr_instance.respond_to?(:iattr2) + + attr_instance.iattr = 'test' + assert_equal 'test', attr_instance.iattr + + AttrTestAccessor.cattr = 'test' + assert_equal 'test', AttrTestAccessor.cattr +end + +assert('Module#attr_reader', '15.2.2.4.13') do + %w[ + foo? + @foo + @@foo + $foo + ].each do |name| + assert_raise(NameError) do + module NameTest; end + NameTest.module_eval { attr_reader name.to_sym } + end + end + + class AttrTestReader + class << self + attr_reader :cattr + def cattr_val + @cattr + end + def cattr_val=(val) + @cattr = val + end + end + attr_reader :iattr, 'iattr2' + + def iattr_val + @iattr + end + def iattr_val=(val) + @iattr = val + end + end + + attr_instance = AttrTestReader.new + assert_true AttrTestReader.respond_to?(:cattr) + assert_true attr_instance.respond_to?(:iattr) + assert_true attr_instance.respond_to?(:iattr2) + + assert_false AttrTestReader.respond_to?(:cattr=) + assert_false attr_instance.respond_to?(:iattr=) + assert_false attr_instance.respond_to?(:iattr2=) + + attr_instance.iattr_val = 'test' + assert_equal 'test', attr_instance.iattr + + AttrTestReader.cattr_val = 'test' + assert_equal 'test', AttrTestReader.cattr +end + +assert('Module#attr_writer', '15.2.2.4.14') do + %w[ + foo? + @foo + @@foo + $foo + ].each do |name| + assert_raise(NameError) do + module NameTest; end + NameTest.module_eval { attr_reader name.to_sym } + end + end + + class AttrTestWriter + class << self + attr_writer :cattr + def cattr_val + @cattr + end + def cattr_val=(val) + @cattr = val + end + end + attr_writer :iattr, 'iattr2' + + def iattr_val + @iattr + end + def iattr_val=(val) + @iattr = val + end + end + + attr_instance = AttrTestWriter.new + assert_true AttrTestWriter.respond_to?(:cattr=) + assert_true attr_instance.respond_to?(:iattr=) + assert_true attr_instance.respond_to?(:iattr2=) + + assert_false AttrTestWriter.respond_to?(:cattr) + assert_false attr_instance.respond_to?(:iattr) + assert_false attr_instance.respond_to?(:iattr2) + + attr_instance.iattr = 'test' + assert_equal 'test', attr_instance.iattr_val + + AttrTestWriter.cattr = 'test' + assert_equal 'test', AttrTestWriter.cattr_val +end + assert('Module#class_eval', '15.2.2.4.15') do class Test4ClassEval @a = 11 |
