PageRenderTime 36ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/rlib/test/test_rerased.py

https://bitbucket.org/pypy/pypy/
Python | 325 lines | 263 code | 42 blank | 20 comment | 17 complexity | 02dbcaa61a9a2f9410ac33ca54462182 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import py
  2. import sys
  3. from pypy.rlib.rerased import *
  4. from pypy.annotation import model as annmodel
  5. from pypy.annotation.annrpython import RPythonAnnotator
  6. from pypy.rpython.test.test_llinterp import interpret
  7. from pypy.rpython.lltypesystem.rclass import OBJECTPTR
  8. from pypy.rpython.ootypesystem.rclass import OBJECT
  9. from pypy.rpython.lltypesystem import lltype, llmemory
  10. from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
  11. def make_annotator():
  12. a = RPythonAnnotator()
  13. a.translator.config.translation.taggedpointers = True
  14. return a
  15. class X(object):
  16. pass
  17. class Y(X):
  18. pass
  19. class Z(X):
  20. pass
  21. eraseX, uneraseX = new_erasing_pair("X")
  22. erase_list_X, unerase_list_X = new_erasing_pair("list of X")
  23. def test_simple():
  24. x1 = X()
  25. e = eraseX(x1)
  26. #assert is_integer(e) is False
  27. assert uneraseX(e) is x1
  28. def test_simple_none():
  29. e = eraseX(None)
  30. assert uneraseX(e) is None
  31. def test_simple_int():
  32. e = erase_int(15)
  33. #assert is_integer(e) is True
  34. assert unerase_int(e) == 15
  35. def test_simple_int_overflow():
  36. erase_int(sys.maxint//2)
  37. py.test.raises(OverflowError, erase_int, sys.maxint//2 + 1)
  38. py.test.raises(OverflowError, erase_int, sys.maxint)
  39. py.test.raises(OverflowError, erase_int, sys.maxint-1)
  40. py.test.raises(OverflowError, erase_int, -sys.maxint)
  41. py.test.raises(OverflowError, erase_int, -sys.maxint-1)
  42. def test_list():
  43. l = [X()]
  44. e = erase_list_X(l)
  45. #assert is_integer(e) is False
  46. assert unerase_list_X(e) is l
  47. def test_annotate_1():
  48. def f():
  49. return eraseX(X())
  50. a = make_annotator()
  51. s = a.build_types(f, [])
  52. assert isinstance(s, SomeErased)
  53. def test_annotate_2():
  54. def f():
  55. x1 = X()
  56. e = eraseX(x1)
  57. #assert not is_integer(e)
  58. x2 = uneraseX(e)
  59. return x2
  60. a = make_annotator()
  61. s = a.build_types(f, [])
  62. assert isinstance(s, annmodel.SomeInstance)
  63. assert s.classdef == a.bookkeeper.getuniqueclassdef(X)
  64. def test_annotate_3():
  65. def f():
  66. e = erase_int(16)
  67. #assert is_integer(e)
  68. x2 = unerase_int(e)
  69. return x2
  70. a = make_annotator()
  71. s = a.build_types(f, [])
  72. assert isinstance(s, annmodel.SomeInteger)
  73. def test_annotate_erasing_pair():
  74. erase, unerase = new_erasing_pair("test1")
  75. erase2, unerase2 = new_erasing_pair("test2")
  76. class Foo:
  77. pass
  78. #
  79. def make(n):
  80. if n > 5:
  81. return erase([5, 6, n-6])
  82. else:
  83. foo = Foo()
  84. foo.bar = n+1
  85. return erase2(foo)
  86. def check(x, n):
  87. if n > 5:
  88. return unerase(x)[2]
  89. else:
  90. return unerase2(x).bar
  91. def f(n):
  92. x = make(n)
  93. return check(x, n)
  94. #
  95. a = make_annotator()
  96. s = a.build_types(f, [int])
  97. assert isinstance(s, annmodel.SomeInteger)
  98. def test_annotate_reflowing():
  99. erase, unerase = new_erasing_pair("test1")
  100. class A: pass
  101. class B(A): pass
  102. class C(B): pass
  103. class D(C): pass
  104. def f():
  105. x = erase(None)
  106. while True:
  107. inst = unerase(x)
  108. if inst is None:
  109. inst = D()
  110. x = erase(inst)
  111. elif isinstance(inst, D):
  112. inst = C()
  113. x = erase(inst)
  114. elif isinstance(inst, C):
  115. inst = B()
  116. x = erase(inst)
  117. elif isinstance(inst, B):
  118. inst = A()
  119. x = erase(inst)
  120. else:
  121. return inst
  122. #
  123. a = make_annotator()
  124. s = a.build_types(f, [])
  125. assert isinstance(s, annmodel.SomeInstance)
  126. assert s.classdef == a.bookkeeper.getuniqueclassdef(A)
  127. def test_annotate_prebuilt():
  128. erase, unerase = new_erasing_pair("test1")
  129. class X(object):
  130. pass
  131. x1 = X()
  132. e1 = erase(x1)
  133. e2 = erase(None)
  134. def f(i):
  135. if i:
  136. e = e1
  137. else:
  138. e = e2
  139. return unerase(e)
  140. #
  141. a = make_annotator()
  142. s = a.build_types(f, [int])
  143. assert isinstance(s, annmodel.SomeInstance)
  144. assert s.classdef == a.bookkeeper.getuniqueclassdef(X)
  145. assert s.can_be_none()
  146. def test_annotate_prebuilt_int():
  147. e1 = erase_int(42)
  148. def f(i):
  149. return unerase_int(e1)
  150. a = make_annotator()
  151. s = a.build_types(f, [int])
  152. assert isinstance(s, annmodel.SomeInteger)
  153. class BaseTestRErased(BaseRtypingTest):
  154. def interpret(self, *args, **kwargs):
  155. kwargs["taggedpointers"] = True
  156. return BaseRtypingTest.interpret(self, *args, **kwargs)
  157. def test_rtype_1(self):
  158. def f():
  159. return eraseX(X())
  160. x = self.interpret(f, [])
  161. assert lltype.typeOf(x) == self.ERASED_TYPE
  162. def test_rtype_2(self):
  163. def f():
  164. x1 = X()
  165. e = eraseX(x1)
  166. #assert not is_integer(e)
  167. x2 = uneraseX(e)
  168. return x2
  169. x = self.interpret(f, [])
  170. assert self.castable(self.UNERASED_TYPE, x)
  171. def test_rtype_3(self):
  172. def f():
  173. e = erase_int(16)
  174. #assert is_integer(e)
  175. x2 = unerase_int(e)
  176. return x2
  177. x = self.interpret(f, [])
  178. assert x == 16
  179. def test_prebuilt_erased(self):
  180. e1 = erase_int(16)
  181. x1 = X()
  182. x1.foobar = 42
  183. e2 = eraseX(x1)
  184. def f():
  185. #assert is_integer(e1)
  186. #assert not is_integer(e2)
  187. x1.foobar += 1
  188. x2 = unerase_int(e1) + uneraseX(e2).foobar
  189. return x2
  190. x = self.interpret(f, [])
  191. assert x == 16 + 42 + 1
  192. def test_prebuilt_erased_in_instance(self):
  193. erase_empty, unerase_empty = new_erasing_pair("empty")
  194. class FakeList(object):
  195. pass
  196. x1 = X()
  197. x1.foobar = 42
  198. l1 = FakeList()
  199. l1.storage = eraseX(x1)
  200. l2 = FakeList()
  201. l2.storage = erase_empty(None)
  202. def f():
  203. #assert is_integer(e1)
  204. #assert not is_integer(e2)
  205. x1.foobar += 1
  206. x2 = uneraseX(l1.storage).foobar + (unerase_empty(l2.storage) is None)
  207. return x2
  208. x = self.interpret(f, [])
  209. assert x == 43 + True
  210. def test_overflow(self):
  211. def f(i):
  212. try:
  213. e = erase_int(i)
  214. except OverflowError:
  215. return -1
  216. #assert is_integer(e)
  217. return unerase_int(e)
  218. x = self.interpret(f, [16])
  219. assert x == 16
  220. x = self.interpret(f, [sys.maxint])
  221. assert x == -1
  222. def test_none(self):
  223. def foo():
  224. return uneraseX(eraseX(None))
  225. assert foo() is None
  226. res = self.interpret(foo, [])
  227. assert not res
  228. #
  229. def foo():
  230. eraseX(X())
  231. return uneraseX(eraseX(None))
  232. assert foo() is None
  233. res = self.interpret(foo, [])
  234. assert not res
  235. def test_rtype_list(self):
  236. prebuilt_l = [X()]
  237. prebuilt_e = erase_list_X(prebuilt_l)
  238. def l(flag):
  239. if flag == 1:
  240. l = [X()]
  241. e = erase_list_X(l)
  242. elif flag == 2:
  243. l = prebuilt_l
  244. e = erase_list_X(l)
  245. else:
  246. l = prebuilt_l
  247. e = prebuilt_e
  248. #assert is_integer(e) is False
  249. assert unerase_list_X(e) is l
  250. self.interpret(l, [0])
  251. self.interpret(l, [1])
  252. self.interpret(l, [2])
  253. class TestLLtype(BaseTestRErased, LLRtypeMixin):
  254. ERASED_TYPE = llmemory.GCREF
  255. UNERASED_TYPE = OBJECTPTR
  256. def castable(self, TO, var):
  257. return lltype.castable(TO, lltype.typeOf(var)) > 0
  258. from pypy.rpython.ootypesystem.ootype import Object
  259. class TestOOtype(BaseTestRErased, OORtypeMixin):
  260. ERASED_TYPE = Object
  261. UNERASED_TYPE = OBJECT
  262. def castable(self, TO, var):
  263. return ootype.isSubclass(lltype.typeOf(var), TO)
  264. @py.test.mark.xfail
  265. def test_prebuilt_erased(self):
  266. super(TestOOtype, self).test_prebuilt_erased()
  267. def test_union():
  268. s_e1 = SomeErased()
  269. s_e1.const = 1
  270. s_e2 = SomeErased()
  271. s_e2.const = 3
  272. assert not annmodel.pair(s_e1, s_e2).union().is_constant()
  273. # ____________________________________________________________
  274. def test_erasing_pair():
  275. erase, unerase = new_erasing_pair("test1")
  276. class X:
  277. pass
  278. x = X()
  279. erased = erase(x)
  280. assert unerase(erased) is x
  281. #
  282. erase2, unerase2 = new_erasing_pair("test2")
  283. py.test.raises(AssertionError, unerase2, erased)