PageRenderTime 25ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/pypyjit/test_pypy_c/test_string.py

https://bitbucket.org/pypy/pypy/
Python | 220 lines | 215 code | 4 blank | 1 comment | 1 complexity | d4c3455528f92832a8ab965e7c02dd53 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import sys
  2. from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC
  3. # XXX review the <Call> descrs to replace some EF=5 with EF=4 (elidable)
  4. class TestString(BaseTestPyPyC):
  5. def test_lookup_default_encoding(self):
  6. def main(n):
  7. import string
  8. i = 0
  9. letters = string.letters
  10. uletters = unicode(string.letters)
  11. while i < n:
  12. i += letters[i % len(letters)] == uletters[i % len(letters)]
  13. return i
  14. log = self.run(main, [300], import_site=True)
  15. assert log.result == 300
  16. loop, = log.loops_by_filename(self.filepath)
  17. assert loop.match("""
  18. i14 = int_lt(i6, i9)
  19. guard_true(i14, descr=...)
  20. guard_not_invalidated(descr=...)
  21. i16 = int_eq(i6, %d)
  22. i19 = call_i(ConstClass(ll_int_py_mod__Signed_Signed), i6, i10, descr=<Calli . ii EF=0 OS=14>)
  23. i21 = int_lt(i19, 0)
  24. guard_false(i21, descr=...)
  25. i22 = int_ge(i19, i10)
  26. guard_false(i22, descr=...)
  27. i23 = strgetitem(p11, i19)
  28. i24 = int_ge(i19, i12)
  29. guard_false(i24, descr=...)
  30. i25 = unicodegetitem(p13, i19)
  31. p27 = newstr(1)
  32. strsetitem(p27, 0, i23)
  33. p30 = call_r(ConstClass(ll_str2unicode__rpy_stringPtr), p27, descr=...)
  34. guard_no_exception(descr=...)
  35. i32 = call_i(ConstClass(_ll_2_str_eq_checknull_char__rpy_unicodePtr_UniChar), p30, i25, descr=...)
  36. guard_true(i32, descr=...)
  37. i34 = int_add(i6, 1)
  38. --TICK--
  39. jump(..., descr=...)
  40. """ % (-sys.maxint-1,))
  41. def test_long(self):
  42. def main(n):
  43. import string
  44. i = 1
  45. while i < n:
  46. i += int(long(string.digits[i % len(string.digits)], 16))
  47. return i
  48. log = self.run(main, [1100], import_site=True)
  49. assert log.result == main(1100)
  50. loop, = log.loops_by_filename(self.filepath)
  51. if sys.maxint > 2**32:
  52. args = (63, -3689348814741910323, 3)
  53. else:
  54. args = (31, -858993459, 3)
  55. assert loop.match("""
  56. i11 = int_lt(i6, i7)
  57. guard_true(i11, descr=...)
  58. guard_not_invalidated(descr=...)
  59. i13 = int_eq(i6, %d) # value provided below
  60. # "mod 10" block:
  61. i79 = int_rshift(i6, %d)
  62. i80 = int_xor(i6, i79)
  63. i82 = uint_mul_high(i80, %d)
  64. i84 = uint_rshift(i82, %d)
  65. i85 = int_xor(i84, i79)
  66. i87 = int_mul(i85, 10)
  67. i19 = int_sub(i6, i87)
  68. i23 = strgetitem(p10, i19)
  69. p25 = newstr(1)
  70. strsetitem(p25, 0, i23)
  71. p93 = call_r(ConstClass(fromstr), p25, 16, descr=<Callr . ri EF=4>)
  72. guard_no_exception(descr=...)
  73. i95 = getfield_gc_i(p93, descr=<FieldS rpython.rlib.rbigint.rbigint.inst_size .*>)
  74. i96 = int_gt(i95, #)
  75. guard_false(i96, descr=...)
  76. i94 = call_i(ConstClass(rbigint._toint_helper), p93, descr=<Calli . r EF=4>)
  77. guard_no_exception(descr=...)
  78. i95 = int_add_ovf(i6, i94)
  79. guard_no_overflow(descr=...)
  80. --TICK--
  81. jump(..., descr=...)
  82. """ % ((-sys.maxint-1,)+args))
  83. def test_str_mod(self):
  84. def main(n):
  85. s = 0
  86. while n > 0:
  87. s += len('%d %d' % (n, n))
  88. n -= 1
  89. return s
  90. log = self.run(main, [1000])
  91. assert log.result == main(1000)
  92. loop, = log.loops_by_filename(self.filepath)
  93. assert loop.match("""
  94. i79 = int_gt(i74, 0)
  95. guard_true(i79, descr=...)
  96. guard_not_invalidated(descr=...)
  97. p80 = call_r(ConstClass(ll_int2dec__Signed), i74, descr=<Callr . i EF=3>)
  98. guard_no_exception(descr=...)
  99. i85 = strlen(p80)
  100. p86 = new(descr=<SizeDescr .+>)
  101. p88 = newstr(23)
  102. {{{
  103. setfield_gc(p86, 0, descr=<FieldS stringbuilder.current_pos .+>)
  104. setfield_gc(p86, p88, descr=<FieldP stringbuilder.current_buf .+>)
  105. setfield_gc(p86, 23, descr=<FieldS stringbuilder.current_end .+>)
  106. setfield_gc(p86, 23, descr=<FieldS stringbuilder.total_size .+>)
  107. }}}
  108. call_n(ConstClass(ll_append_res0__stringbuilderPtr_rpy_stringPtr), p86, p80, descr=<Callv 0 rr EF=5>)
  109. guard_no_exception(descr=...)
  110. i89 = getfield_gc_i(p86, descr=<FieldS stringbuilder.current_pos .+>)
  111. i90 = getfield_gc_i(p86, descr=<FieldS stringbuilder.current_end .+>)
  112. i91 = int_eq(i89, i90)
  113. cond_call(i91, ConstClass(ll_grow_by__stringbuilderPtr_Signed), p86, 1, descr=<Callv 0 ri EF=5>)
  114. guard_no_exception(descr=...)
  115. i92 = getfield_gc_i(p86, descr=<FieldS stringbuilder.current_pos .+>)
  116. i93 = int_add(i92, 1)
  117. p94 = getfield_gc_r(p86, descr=<FieldP stringbuilder.current_buf .+>)
  118. strsetitem(p94, i92, 32)
  119. setfield_gc(p86, i93, descr=<FieldS stringbuilder.current_pos .+>)
  120. call_n(ConstClass(ll_append_res0__stringbuilderPtr_rpy_stringPtr), p86, p80, descr=<Callv 0 rr EF=5>)
  121. guard_no_exception(descr=...)
  122. p95 = call_r(..., descr=<Callr . r EF=5>) # ll_build
  123. guard_no_exception(descr=...)
  124. guard_nonnull(p95, descr=...)
  125. i96 = strlen(p95)
  126. i97 = int_add_ovf(i71, i96)
  127. guard_no_overflow(descr=...)
  128. i98 = int_sub(i74, 1)
  129. --TICK--
  130. jump(..., descr=...)
  131. """)
  132. def test_remove_duplicate_method_calls(self):
  133. def main(n):
  134. lst = []
  135. for i in range(n):
  136. s = 'Hello %d' % i
  137. t = s.lower() # ID: callone
  138. u = s.lower() # ID: calltwo
  139. lst.append(t)
  140. lst.append(u)
  141. return len(','.join(lst))
  142. log = self.run(main, [1000])
  143. assert log.result == main(1000)
  144. loops = log.loops_by_filename(self.filepath)
  145. loop, = loops
  146. assert loop.match_by_id('callone', '''
  147. p114 = call_r(ConstClass(ll_lower__rpy_stringPtr), p113, descr=<Callr . r EF=3>)
  148. guard_no_exception(descr=...)
  149. ''')
  150. assert loop.match_by_id('calltwo', '') # nothing
  151. def test_move_method_call_out_of_loop(self):
  152. def main(n):
  153. lst = []
  154. s = 'Hello %d' % n
  155. for i in range(n):
  156. t = s.lower() # ID: callone
  157. lst.append(t)
  158. return len(','.join(lst))
  159. log = self.run(main, [1000])
  160. assert log.result == main(1000)
  161. loops = log.loops_by_filename(self.filepath)
  162. loop, = loops
  163. assert loop.match_by_id('callone', '') # nothing
  164. def test_lookup_codec(self):
  165. log = self.run("""
  166. import codecs
  167. def main(n):
  168. for i in xrange(n):
  169. codecs.lookup('utf8')
  170. return i
  171. """, [1000])
  172. loop, = log.loops_by_filename(self.filepath)
  173. assert loop.match("""
  174. i45 = int_lt(i43, i26)
  175. guard_true(i45, descr=...)
  176. i46 = int_add(i43, 1)
  177. setfield_gc(p15, i46, descr=<FieldS pypy.module.__builtin__.functional.W_XRangeIterator.inst_current 8>)
  178. guard_not_invalidated(descr=...)
  179. --TICK--
  180. jump(..., descr=...)
  181. """)
  182. def test_decode_ascii(self):
  183. log = self.run("""
  184. def main(n):
  185. for i in xrange(n):
  186. unicode(str(i))
  187. return i
  188. """, [1000])
  189. loop, = log.loops_by_filename(self.filepath)
  190. assert loop.match("""
  191. i49 = int_lt(i47, i24)
  192. guard_true(i49, descr=...)
  193. i50 = int_add(i47, 1)
  194. setfield_gc(p15, i50, descr=<FieldS pypy.module.__builtin__.functional.W_XRangeIterator.inst_current 8>)
  195. guard_not_invalidated(descr=...)
  196. p80 = call_r(ConstClass(ll_str__IntegerR_SignedConst_Signed), i47, descr=<Callr . i EF=3>)
  197. guard_no_exception(descr=...)
  198. guard_nonnull(p80, descr=...)
  199. p53 = call_r(ConstClass(fast_str_decode_ascii), p80, descr=<Callr . r EF=4>)
  200. guard_no_exception(descr=...)
  201. guard_nonnull(p53, descr=...)
  202. --TICK--
  203. jump(..., descr=...)
  204. """)
  205. # XXX remove the guard_nonnull above?