PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/rlib/test/test_rerased.py

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