test_opcache.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. import unittest
  2. class TestLoadAttrCache(unittest.TestCase):
  3. def test_descriptor_added_after_optimization(self):
  4. class Descriptor:
  5. pass
  6. class C:
  7. def __init__(self):
  8. self.x = 1
  9. x = Descriptor()
  10. def f(o):
  11. return o.x
  12. o = C()
  13. for i in range(1025):
  14. assert f(o) == 1
  15. Descriptor.__get__ = lambda self, instance, value: 2
  16. Descriptor.__set__ = lambda *args: None
  17. self.assertEqual(f(o), 2)
  18. def test_metaclass_descriptor_added_after_optimization(self):
  19. class Descriptor:
  20. pass
  21. class Metaclass(type):
  22. attribute = Descriptor()
  23. class Class(metaclass=Metaclass):
  24. attribute = True
  25. def __get__(self, instance, owner):
  26. return False
  27. def __set__(self, instance, value):
  28. return None
  29. def f():
  30. return Class.attribute
  31. for _ in range(1025):
  32. self.assertTrue(f())
  33. Descriptor.__get__ = __get__
  34. Descriptor.__set__ = __set__
  35. for _ in range(1025):
  36. self.assertFalse(f())
  37. def test_metaclass_descriptor_shadows_class_attribute(self):
  38. class Metaclass(type):
  39. @property
  40. def attribute(self):
  41. return True
  42. class Class(metaclass=Metaclass):
  43. attribute = False
  44. def f():
  45. return Class.attribute
  46. for _ in range(1025):
  47. self.assertTrue(f())
  48. def test_metaclass_set_descriptor_after_optimization(self):
  49. class Metaclass(type):
  50. pass
  51. class Class(metaclass=Metaclass):
  52. attribute = True
  53. @property
  54. def attribute(self):
  55. return False
  56. def f():
  57. return Class.attribute
  58. for _ in range(1025):
  59. self.assertTrue(f())
  60. Metaclass.attribute = attribute
  61. for _ in range(1025):
  62. self.assertFalse(f())
  63. def test_metaclass_del_descriptor_after_optimization(self):
  64. class Metaclass(type):
  65. @property
  66. def attribute(self):
  67. return True
  68. class Class(metaclass=Metaclass):
  69. attribute = False
  70. def f():
  71. return Class.attribute
  72. for _ in range(1025):
  73. self.assertTrue(f())
  74. del Metaclass.attribute
  75. for _ in range(1025):
  76. self.assertFalse(f())
  77. def test_type_descriptor_shadows_attribute_method(self):
  78. class Class:
  79. mro = None
  80. def f():
  81. return Class.mro
  82. for _ in range(1025):
  83. self.assertIsNone(f())
  84. def test_type_descriptor_shadows_attribute_member(self):
  85. class Class:
  86. __base__ = None
  87. def f():
  88. return Class.__base__
  89. for _ in range(1025):
  90. self.assertIs(f(), object)
  91. def test_type_descriptor_shadows_attribute_getset(self):
  92. class Class:
  93. __name__ = "Spam"
  94. def f():
  95. return Class.__name__
  96. for _ in range(1025):
  97. self.assertEqual(f(), "Class")
  98. def test_metaclass_getattribute(self):
  99. class Metaclass(type):
  100. def __getattribute__(self, name):
  101. return True
  102. class Class(metaclass=Metaclass):
  103. attribute = False
  104. def f():
  105. return Class.attribute
  106. for _ in range(1025):
  107. self.assertTrue(f())
  108. def test_metaclass_swap(self):
  109. class OldMetaclass(type):
  110. @property
  111. def attribute(self):
  112. return True
  113. class NewMetaclass(type):
  114. @property
  115. def attribute(self):
  116. return False
  117. class Class(metaclass=OldMetaclass):
  118. pass
  119. def f():
  120. return Class.attribute
  121. for _ in range(1025):
  122. self.assertTrue(f())
  123. Class.__class__ = NewMetaclass
  124. for _ in range(1025):
  125. self.assertFalse(f())
  126. def test_load_shadowing_slot_should_raise_type_error(self):
  127. class Class:
  128. __slots__ = ("slot",)
  129. class Sneaky:
  130. __slots__ = ("shadowed",)
  131. shadowing = Class.slot
  132. def f(o):
  133. o.shadowing
  134. o = Sneaky()
  135. o.shadowed = 42
  136. for _ in range(1025):
  137. with self.assertRaises(TypeError):
  138. f(o)
  139. def test_store_shadowing_slot_should_raise_type_error(self):
  140. class Class:
  141. __slots__ = ("slot",)
  142. class Sneaky:
  143. __slots__ = ("shadowed",)
  144. shadowing = Class.slot
  145. def f(o):
  146. o.shadowing = 42
  147. o = Sneaky()
  148. for _ in range(1025):
  149. with self.assertRaises(TypeError):
  150. f(o)
  151. def test_load_borrowed_slot_should_not_crash(self):
  152. class Class:
  153. __slots__ = ("slot",)
  154. class Sneaky:
  155. borrowed = Class.slot
  156. def f(o):
  157. o.borrowed
  158. o = Sneaky()
  159. for _ in range(1025):
  160. with self.assertRaises(TypeError):
  161. f(o)
  162. def test_store_borrowed_slot_should_not_crash(self):
  163. class Class:
  164. __slots__ = ("slot",)
  165. class Sneaky:
  166. borrowed = Class.slot
  167. def f(o):
  168. o.borrowed = 42
  169. o = Sneaky()
  170. for _ in range(1025):
  171. with self.assertRaises(TypeError):
  172. f(o)
  173. class TestLoadMethodCache(unittest.TestCase):
  174. def test_descriptor_added_after_optimization(self):
  175. class Descriptor:
  176. pass
  177. class Class:
  178. attribute = Descriptor()
  179. def __get__(self, instance, owner):
  180. return lambda: False
  181. def __set__(self, instance, value):
  182. return None
  183. def attribute():
  184. return True
  185. instance = Class()
  186. instance.attribute = attribute
  187. def f():
  188. return instance.attribute()
  189. for _ in range(1025):
  190. self.assertTrue(f())
  191. Descriptor.__get__ = __get__
  192. Descriptor.__set__ = __set__
  193. for _ in range(1025):
  194. self.assertFalse(f())
  195. def test_metaclass_descriptor_added_after_optimization(self):
  196. class Descriptor:
  197. pass
  198. class Metaclass(type):
  199. attribute = Descriptor()
  200. class Class(metaclass=Metaclass):
  201. def attribute():
  202. return True
  203. def __get__(self, instance, owner):
  204. return lambda: False
  205. def __set__(self, instance, value):
  206. return None
  207. def f():
  208. return Class.attribute()
  209. for _ in range(1025):
  210. self.assertTrue(f())
  211. Descriptor.__get__ = __get__
  212. Descriptor.__set__ = __set__
  213. for _ in range(1025):
  214. self.assertFalse(f())
  215. def test_metaclass_descriptor_shadows_class_attribute(self):
  216. class Metaclass(type):
  217. @property
  218. def attribute(self):
  219. return lambda: True
  220. class Class(metaclass=Metaclass):
  221. def attribute():
  222. return False
  223. def f():
  224. return Class.attribute()
  225. for _ in range(1025):
  226. self.assertTrue(f())
  227. def test_metaclass_set_descriptor_after_optimization(self):
  228. class Metaclass(type):
  229. pass
  230. class Class(metaclass=Metaclass):
  231. def attribute():
  232. return True
  233. @property
  234. def attribute(self):
  235. return lambda: False
  236. def f():
  237. return Class.attribute()
  238. for _ in range(1025):
  239. self.assertTrue(f())
  240. Metaclass.attribute = attribute
  241. for _ in range(1025):
  242. self.assertFalse(f())
  243. def test_metaclass_del_descriptor_after_optimization(self):
  244. class Metaclass(type):
  245. @property
  246. def attribute(self):
  247. return lambda: True
  248. class Class(metaclass=Metaclass):
  249. def attribute():
  250. return False
  251. def f():
  252. return Class.attribute()
  253. for _ in range(1025):
  254. self.assertTrue(f())
  255. del Metaclass.attribute
  256. for _ in range(1025):
  257. self.assertFalse(f())
  258. def test_type_descriptor_shadows_attribute_method(self):
  259. class Class:
  260. def mro():
  261. return ["Spam", "eggs"]
  262. def f():
  263. return Class.mro()
  264. for _ in range(1025):
  265. self.assertEqual(f(), ["Spam", "eggs"])
  266. def test_type_descriptor_shadows_attribute_member(self):
  267. class Class:
  268. def __base__():
  269. return "Spam"
  270. def f():
  271. return Class.__base__()
  272. for _ in range(1025):
  273. self.assertNotEqual(f(), "Spam")
  274. def test_metaclass_getattribute(self):
  275. class Metaclass(type):
  276. def __getattribute__(self, name):
  277. return lambda: True
  278. class Class(metaclass=Metaclass):
  279. def attribute():
  280. return False
  281. def f():
  282. return Class.attribute()
  283. for _ in range(1025):
  284. self.assertTrue(f())
  285. def test_metaclass_swap(self):
  286. class OldMetaclass(type):
  287. @property
  288. def attribute(self):
  289. return lambda: True
  290. class NewMetaclass(type):
  291. @property
  292. def attribute(self):
  293. return lambda: False
  294. class Class(metaclass=OldMetaclass):
  295. pass
  296. def f():
  297. return Class.attribute()
  298. for _ in range(1025):
  299. self.assertTrue(f())
  300. Class.__class__ = NewMetaclass
  301. for _ in range(1025):
  302. self.assertFalse(f())
  303. if __name__ == "__main__":
  304. import unittest
  305. unittest.main()