vm_insnhelper.c: no warnings for non-object

* vm_insnhelper.c (vm_getivar): no uninitialized instance variables
  warnings for non-object if attr method.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38337 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2012-12-12 04:40:55 +00:00
parent dcb6e73306
commit f92db3dd73
3 changed files with 70 additions and 0 deletions

View File

@ -1,3 +1,8 @@
Wed Dec 12 13:40:52 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_insnhelper.c (vm_getivar): no uninitialized instance variables
warnings for non-object if attr method.
Wed Dec 12 06:43:37 2012 Benoit Daloze <eregontp@gmail.com>
* iseq.c (rb_iseq_parameters): fix limit for optional arguments.

View File

@ -1513,4 +1513,67 @@ class TestModule < Test::Unit::TestCase
end
end
end
class AttrTest
class << self
attr_accessor :cattr
end
attr_accessor :iattr
def ivar
@ivar
end
end
def test_uninitialized_instance_variable
a = AttrTest.new
stderr = EnvUtil.verbose_warning do
assert_nil(a.ivar)
end
assert_match(/instance variable @ivar not initialized/, stderr)
a.instance_variable_set(:@ivar, 42)
stderr = EnvUtil.verbose_warning do
assert_equal(42, a.ivar)
end
assert_equal("", stderr)
end
def test_uninitialized_attr
a = AttrTest.new
stderr = EnvUtil.verbose_warning do
assert_nil(a.iattr)
end
assert_equal("", stderr)
a.iattr = 42
stderr = EnvUtil.verbose_warning do
assert_equal(42, a.iattr)
end
assert_equal("", stderr)
end
def test_uninitialized_attr_class
stderr = EnvUtil.verbose_warning do
assert_nil(AttrTest.cattr)
end
assert_equal("", stderr)
AttrTest.cattr = 42
stderr = EnvUtil.verbose_warning do
assert_equal(42, AttrTest.cattr)
end
assert_equal("", stderr)
end
def test_uninitialized_attr_non_object
a = Class.new(Array) do
attr_accessor :iattr
end.new
stderr = EnvUtil.verbose_warning do
assert_nil(a.iattr)
end
assert_equal("", stderr)
a.iattr = 42
stderr = EnvUtil.verbose_warning do
assert_equal(42, a.iattr)
end
assert_equal("", stderr)
end
end

View File

@ -538,6 +538,8 @@ vm_getivar(VALUE obj, ID id, IC ic, rb_call_info_t *ci, int is_attr)
return val;
}
#endif /* USE_IC_FOR_IVAR */
if (is_attr)
return rb_attr_get(obj, id);
return rb_ivar_get(obj, id);
}