17db96d56Sopenharmony_ciimport unittest 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciclass TestLoadAttrCache(unittest.TestCase): 57db96d56Sopenharmony_ci def test_descriptor_added_after_optimization(self): 67db96d56Sopenharmony_ci class Descriptor: 77db96d56Sopenharmony_ci pass 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci class C: 107db96d56Sopenharmony_ci def __init__(self): 117db96d56Sopenharmony_ci self.x = 1 127db96d56Sopenharmony_ci x = Descriptor() 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci def f(o): 157db96d56Sopenharmony_ci return o.x 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci o = C() 187db96d56Sopenharmony_ci for i in range(1025): 197db96d56Sopenharmony_ci assert f(o) == 1 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci Descriptor.__get__ = lambda self, instance, value: 2 227db96d56Sopenharmony_ci Descriptor.__set__ = lambda *args: None 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci self.assertEqual(f(o), 2) 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci def test_metaclass_descriptor_added_after_optimization(self): 277db96d56Sopenharmony_ci class Descriptor: 287db96d56Sopenharmony_ci pass 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci class Metaclass(type): 317db96d56Sopenharmony_ci attribute = Descriptor() 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 347db96d56Sopenharmony_ci attribute = True 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci def __get__(self, instance, owner): 377db96d56Sopenharmony_ci return False 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci def __set__(self, instance, value): 407db96d56Sopenharmony_ci return None 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci def f(): 437db96d56Sopenharmony_ci return Class.attribute 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci for _ in range(1025): 467db96d56Sopenharmony_ci self.assertTrue(f()) 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci Descriptor.__get__ = __get__ 497db96d56Sopenharmony_ci Descriptor.__set__ = __set__ 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci for _ in range(1025): 527db96d56Sopenharmony_ci self.assertFalse(f()) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def test_metaclass_descriptor_shadows_class_attribute(self): 557db96d56Sopenharmony_ci class Metaclass(type): 567db96d56Sopenharmony_ci @property 577db96d56Sopenharmony_ci def attribute(self): 587db96d56Sopenharmony_ci return True 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 617db96d56Sopenharmony_ci attribute = False 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci def f(): 647db96d56Sopenharmony_ci return Class.attribute 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci for _ in range(1025): 677db96d56Sopenharmony_ci self.assertTrue(f()) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci def test_metaclass_set_descriptor_after_optimization(self): 707db96d56Sopenharmony_ci class Metaclass(type): 717db96d56Sopenharmony_ci pass 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 747db96d56Sopenharmony_ci attribute = True 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci @property 777db96d56Sopenharmony_ci def attribute(self): 787db96d56Sopenharmony_ci return False 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def f(): 817db96d56Sopenharmony_ci return Class.attribute 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci for _ in range(1025): 847db96d56Sopenharmony_ci self.assertTrue(f()) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci Metaclass.attribute = attribute 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci for _ in range(1025): 897db96d56Sopenharmony_ci self.assertFalse(f()) 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci def test_metaclass_del_descriptor_after_optimization(self): 927db96d56Sopenharmony_ci class Metaclass(type): 937db96d56Sopenharmony_ci @property 947db96d56Sopenharmony_ci def attribute(self): 957db96d56Sopenharmony_ci return True 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 987db96d56Sopenharmony_ci attribute = False 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci def f(): 1017db96d56Sopenharmony_ci return Class.attribute 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci for _ in range(1025): 1047db96d56Sopenharmony_ci self.assertTrue(f()) 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci del Metaclass.attribute 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci for _ in range(1025): 1097db96d56Sopenharmony_ci self.assertFalse(f()) 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci def test_type_descriptor_shadows_attribute_method(self): 1127db96d56Sopenharmony_ci class Class: 1137db96d56Sopenharmony_ci mro = None 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci def f(): 1167db96d56Sopenharmony_ci return Class.mro 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci for _ in range(1025): 1197db96d56Sopenharmony_ci self.assertIsNone(f()) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci def test_type_descriptor_shadows_attribute_member(self): 1227db96d56Sopenharmony_ci class Class: 1237db96d56Sopenharmony_ci __base__ = None 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci def f(): 1267db96d56Sopenharmony_ci return Class.__base__ 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci for _ in range(1025): 1297db96d56Sopenharmony_ci self.assertIs(f(), object) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def test_type_descriptor_shadows_attribute_getset(self): 1327db96d56Sopenharmony_ci class Class: 1337db96d56Sopenharmony_ci __name__ = "Spam" 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci def f(): 1367db96d56Sopenharmony_ci return Class.__name__ 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci for _ in range(1025): 1397db96d56Sopenharmony_ci self.assertEqual(f(), "Class") 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci def test_metaclass_getattribute(self): 1427db96d56Sopenharmony_ci class Metaclass(type): 1437db96d56Sopenharmony_ci def __getattribute__(self, name): 1447db96d56Sopenharmony_ci return True 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 1477db96d56Sopenharmony_ci attribute = False 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci def f(): 1507db96d56Sopenharmony_ci return Class.attribute 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci for _ in range(1025): 1537db96d56Sopenharmony_ci self.assertTrue(f()) 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci def test_metaclass_swap(self): 1567db96d56Sopenharmony_ci class OldMetaclass(type): 1577db96d56Sopenharmony_ci @property 1587db96d56Sopenharmony_ci def attribute(self): 1597db96d56Sopenharmony_ci return True 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci class NewMetaclass(type): 1627db96d56Sopenharmony_ci @property 1637db96d56Sopenharmony_ci def attribute(self): 1647db96d56Sopenharmony_ci return False 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci class Class(metaclass=OldMetaclass): 1677db96d56Sopenharmony_ci pass 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci def f(): 1707db96d56Sopenharmony_ci return Class.attribute 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci for _ in range(1025): 1737db96d56Sopenharmony_ci self.assertTrue(f()) 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci Class.__class__ = NewMetaclass 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci for _ in range(1025): 1787db96d56Sopenharmony_ci self.assertFalse(f()) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci def test_load_shadowing_slot_should_raise_type_error(self): 1817db96d56Sopenharmony_ci class Class: 1827db96d56Sopenharmony_ci __slots__ = ("slot",) 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci class Sneaky: 1857db96d56Sopenharmony_ci __slots__ = ("shadowed",) 1867db96d56Sopenharmony_ci shadowing = Class.slot 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci def f(o): 1897db96d56Sopenharmony_ci o.shadowing 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci o = Sneaky() 1927db96d56Sopenharmony_ci o.shadowed = 42 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci for _ in range(1025): 1957db96d56Sopenharmony_ci with self.assertRaises(TypeError): 1967db96d56Sopenharmony_ci f(o) 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci def test_store_shadowing_slot_should_raise_type_error(self): 1997db96d56Sopenharmony_ci class Class: 2007db96d56Sopenharmony_ci __slots__ = ("slot",) 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci class Sneaky: 2037db96d56Sopenharmony_ci __slots__ = ("shadowed",) 2047db96d56Sopenharmony_ci shadowing = Class.slot 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci def f(o): 2077db96d56Sopenharmony_ci o.shadowing = 42 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci o = Sneaky() 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci for _ in range(1025): 2127db96d56Sopenharmony_ci with self.assertRaises(TypeError): 2137db96d56Sopenharmony_ci f(o) 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci def test_load_borrowed_slot_should_not_crash(self): 2167db96d56Sopenharmony_ci class Class: 2177db96d56Sopenharmony_ci __slots__ = ("slot",) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci class Sneaky: 2207db96d56Sopenharmony_ci borrowed = Class.slot 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci def f(o): 2237db96d56Sopenharmony_ci o.borrowed 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci o = Sneaky() 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci for _ in range(1025): 2287db96d56Sopenharmony_ci with self.assertRaises(TypeError): 2297db96d56Sopenharmony_ci f(o) 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci def test_store_borrowed_slot_should_not_crash(self): 2327db96d56Sopenharmony_ci class Class: 2337db96d56Sopenharmony_ci __slots__ = ("slot",) 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci class Sneaky: 2367db96d56Sopenharmony_ci borrowed = Class.slot 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci def f(o): 2397db96d56Sopenharmony_ci o.borrowed = 42 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci o = Sneaky() 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci for _ in range(1025): 2447db96d56Sopenharmony_ci with self.assertRaises(TypeError): 2457db96d56Sopenharmony_ci f(o) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ciclass TestLoadMethodCache(unittest.TestCase): 2497db96d56Sopenharmony_ci def test_descriptor_added_after_optimization(self): 2507db96d56Sopenharmony_ci class Descriptor: 2517db96d56Sopenharmony_ci pass 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci class Class: 2547db96d56Sopenharmony_ci attribute = Descriptor() 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def __get__(self, instance, owner): 2577db96d56Sopenharmony_ci return lambda: False 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci def __set__(self, instance, value): 2607db96d56Sopenharmony_ci return None 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci def attribute(): 2637db96d56Sopenharmony_ci return True 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci instance = Class() 2667db96d56Sopenharmony_ci instance.attribute = attribute 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci def f(): 2697db96d56Sopenharmony_ci return instance.attribute() 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci for _ in range(1025): 2727db96d56Sopenharmony_ci self.assertTrue(f()) 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci Descriptor.__get__ = __get__ 2757db96d56Sopenharmony_ci Descriptor.__set__ = __set__ 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci for _ in range(1025): 2787db96d56Sopenharmony_ci self.assertFalse(f()) 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci def test_metaclass_descriptor_added_after_optimization(self): 2817db96d56Sopenharmony_ci class Descriptor: 2827db96d56Sopenharmony_ci pass 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci class Metaclass(type): 2857db96d56Sopenharmony_ci attribute = Descriptor() 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 2887db96d56Sopenharmony_ci def attribute(): 2897db96d56Sopenharmony_ci return True 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci def __get__(self, instance, owner): 2927db96d56Sopenharmony_ci return lambda: False 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci def __set__(self, instance, value): 2957db96d56Sopenharmony_ci return None 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci def f(): 2987db96d56Sopenharmony_ci return Class.attribute() 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci for _ in range(1025): 3017db96d56Sopenharmony_ci self.assertTrue(f()) 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci Descriptor.__get__ = __get__ 3047db96d56Sopenharmony_ci Descriptor.__set__ = __set__ 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci for _ in range(1025): 3077db96d56Sopenharmony_ci self.assertFalse(f()) 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci def test_metaclass_descriptor_shadows_class_attribute(self): 3107db96d56Sopenharmony_ci class Metaclass(type): 3117db96d56Sopenharmony_ci @property 3127db96d56Sopenharmony_ci def attribute(self): 3137db96d56Sopenharmony_ci return lambda: True 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 3167db96d56Sopenharmony_ci def attribute(): 3177db96d56Sopenharmony_ci return False 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci def f(): 3207db96d56Sopenharmony_ci return Class.attribute() 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci for _ in range(1025): 3237db96d56Sopenharmony_ci self.assertTrue(f()) 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci def test_metaclass_set_descriptor_after_optimization(self): 3267db96d56Sopenharmony_ci class Metaclass(type): 3277db96d56Sopenharmony_ci pass 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 3307db96d56Sopenharmony_ci def attribute(): 3317db96d56Sopenharmony_ci return True 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci @property 3347db96d56Sopenharmony_ci def attribute(self): 3357db96d56Sopenharmony_ci return lambda: False 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci def f(): 3387db96d56Sopenharmony_ci return Class.attribute() 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci for _ in range(1025): 3417db96d56Sopenharmony_ci self.assertTrue(f()) 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci Metaclass.attribute = attribute 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci for _ in range(1025): 3467db96d56Sopenharmony_ci self.assertFalse(f()) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def test_metaclass_del_descriptor_after_optimization(self): 3497db96d56Sopenharmony_ci class Metaclass(type): 3507db96d56Sopenharmony_ci @property 3517db96d56Sopenharmony_ci def attribute(self): 3527db96d56Sopenharmony_ci return lambda: True 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 3557db96d56Sopenharmony_ci def attribute(): 3567db96d56Sopenharmony_ci return False 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci def f(): 3597db96d56Sopenharmony_ci return Class.attribute() 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci for _ in range(1025): 3627db96d56Sopenharmony_ci self.assertTrue(f()) 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci del Metaclass.attribute 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci for _ in range(1025): 3677db96d56Sopenharmony_ci self.assertFalse(f()) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci def test_type_descriptor_shadows_attribute_method(self): 3707db96d56Sopenharmony_ci class Class: 3717db96d56Sopenharmony_ci def mro(): 3727db96d56Sopenharmony_ci return ["Spam", "eggs"] 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci def f(): 3757db96d56Sopenharmony_ci return Class.mro() 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci for _ in range(1025): 3787db96d56Sopenharmony_ci self.assertEqual(f(), ["Spam", "eggs"]) 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci def test_type_descriptor_shadows_attribute_member(self): 3817db96d56Sopenharmony_ci class Class: 3827db96d56Sopenharmony_ci def __base__(): 3837db96d56Sopenharmony_ci return "Spam" 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci def f(): 3867db96d56Sopenharmony_ci return Class.__base__() 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci for _ in range(1025): 3897db96d56Sopenharmony_ci self.assertNotEqual(f(), "Spam") 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci def test_metaclass_getattribute(self): 3927db96d56Sopenharmony_ci class Metaclass(type): 3937db96d56Sopenharmony_ci def __getattribute__(self, name): 3947db96d56Sopenharmony_ci return lambda: True 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci class Class(metaclass=Metaclass): 3977db96d56Sopenharmony_ci def attribute(): 3987db96d56Sopenharmony_ci return False 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci def f(): 4017db96d56Sopenharmony_ci return Class.attribute() 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci for _ in range(1025): 4047db96d56Sopenharmony_ci self.assertTrue(f()) 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ci def test_metaclass_swap(self): 4077db96d56Sopenharmony_ci class OldMetaclass(type): 4087db96d56Sopenharmony_ci @property 4097db96d56Sopenharmony_ci def attribute(self): 4107db96d56Sopenharmony_ci return lambda: True 4117db96d56Sopenharmony_ci 4127db96d56Sopenharmony_ci class NewMetaclass(type): 4137db96d56Sopenharmony_ci @property 4147db96d56Sopenharmony_ci def attribute(self): 4157db96d56Sopenharmony_ci return lambda: False 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci class Class(metaclass=OldMetaclass): 4187db96d56Sopenharmony_ci pass 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci def f(): 4217db96d56Sopenharmony_ci return Class.attribute() 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ci for _ in range(1025): 4247db96d56Sopenharmony_ci self.assertTrue(f()) 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci Class.__class__ = NewMetaclass 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci for _ in range(1025): 4297db96d56Sopenharmony_ci self.assertFalse(f()) 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ciif __name__ == "__main__": 4337db96d56Sopenharmony_ci import unittest 4347db96d56Sopenharmony_ci unittest.main() 435