Commit eb0ee358 authored by Ryan Scott's avatar Ryan Scott

Merge branch 'master' into attr-perf-fix

Conflicts:
	mrblib/class.rb
parents 75f8aab2 fe5324bd
class Module class Module
# 15.2.2.4.13 # 15.2.2.4.13
def attr_reader(*names) def attr_reader(*names)
names.each{|name| names.each do |name|
name2 = ('@'+name.to_s) 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)} define_method(name){self.instance_variable_get(name2)}
} end
end end
# 15.2.2.4.14 # 15.2.2.4.14
def attr_writer(*names) def attr_writer(*names)
names.each{|name| names.each do |name|
name2 = ('@'+name.to_s) name = name.to_s
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)} define_method(name){|v|self.instance_variable_set(name2,v)}
} end
end end
# 15.2.2.4.12 # 15.2.2.4.12
def attr_accessor(*names) def attr_accessor(*names)
......
...@@ -37,6 +37,186 @@ assert('Module#append_features', '15.2.2.4.10') do ...@@ -37,6 +37,186 @@ assert('Module#append_features', '15.2.2.4.10') do
assert_equal Test4AppendFeatures2.const_get(:Const4AppendFeatures2), Test4AppendFeatures2 assert_equal Test4AppendFeatures2.const_get(:Const4AppendFeatures2), Test4AppendFeatures2
end 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 assert('Module#class_eval', '15.2.2.4.15') do
class Test4ClassEval class Test4ClassEval
@a = 11 @a = 11
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment