diff options
author | cpopa <devnull@localhost> | 2014-08-20 17:12:32 +0300 |
---|---|---|
committer | cpopa <devnull@localhost> | 2014-08-20 17:12:32 +0300 |
commit | 2cf28a85a6a98789ef234639784663ed69a8436b (patch) | |
tree | 75ad0dff41cdb6d805fa8afb393c76848dbfd46b /test | |
parent | 9e32666ed753db8307fdbd0ed39d395b213a34ef (diff) | |
download | astroid-2cf28a85a6a98789ef234639784663ed69a8436b.tar.gz |
Fix an infinite loop in the inference, by returning a copy of instance attributes, when calling 'instance_attr'. Closes issue #34 (patch by Emile Anclin).
Diffstat (limited to 'test')
-rw-r--r-- | test/unittest_inference.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/unittest_inference.py b/test/unittest_inference.py index ea49e50..e525a9c 100644 --- a/test/unittest_inference.py +++ b/test/unittest_inference.py @@ -930,6 +930,35 @@ def f(x): self.assertEqual(len(infered), 1) self.assertEqual(infered[0], YES) + def test_nonregr_instance_attrs(self): + """non regression for instance_attrs infinite loop : pylint / #4""" + + code = """ +class Foo(object): + + def set_42(self): + self.attr = 42 + +class Bar(Foo): + + def __init__(self): + self.attr = 41 + """ + astroid = builder.string_build(code, __name__, __file__) + foo_class = astroid['Foo'] + bar_class = astroid['Bar'] + bar_self = astroid['Bar']['__init__']['self'] + assattr = bar_class.instance_attrs['attr'][0] + self.assertEqual(len(foo_class.instance_attrs['attr']), 1) + self.assertEqual(len(bar_class.instance_attrs['attr']), 1) + self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]}) + # call 'instance_attr' via 'Instance.getattr' to trigger the bug: + instance = bar_self.infered()[0] + _attr = instance.getattr('attr') + self.assertEqual(len(bar_class.instance_attrs['attr']), 1) + self.assertEqual(len(foo_class.instance_attrs['attr']), 1) + self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]}) + def test_python25_generator_exit(self): sys.stderr = StringIO() data = "b = {}[str(0)+''].a" |