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

/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py

https://bitbucket.org/pypy/pypy/
Python | 206 lines | 197 code | 9 blank | 0 comment | 0 complexity | 35ad15c3fcd3b0dfcd22df0d7cf94f0e MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.jit.backend.detect_cpu import getcpuclass
  2. from rpython.jit.tool.oparser import parse
  3. from rpython.jit.metainterp.history import JitCellToken, NoStats
  4. from rpython.jit.metainterp.history import BasicFinalDescr, BasicFailDescr
  5. from rpython.jit.metainterp.gc import get_description
  6. from rpython.jit.metainterp.optimize import SpeculativeError
  7. from rpython.annotator.listdef import s_list_of_strings
  8. from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
  9. from rpython.rtyper.rclass import getclassrepr, getinstancerepr
  10. from rpython.translator.unsimplify import call_initial_function
  11. from rpython.translator.translator import TranslationContext
  12. from rpython.translator.c import genc
  13. def run_guards_translated(gcremovetypeptr):
  14. class A(object):
  15. pass
  16. class B(A):
  17. pass
  18. class C(B):
  19. pass
  20. def main(argv):
  21. A(); B().foo = len(argv); C()
  22. return 0
  23. t = TranslationContext()
  24. t.config.translation.gc = "minimark"
  25. t.config.translation.gcremovetypeptr = gcremovetypeptr
  26. ann = t.buildannotator()
  27. ann.build_types(main, [s_list_of_strings], main_entry_point=True)
  28. rtyper = t.buildrtyper()
  29. rtyper.specialize()
  30. classdef = ann.bookkeeper.getuniqueclassdef(B)
  31. rclass = getclassrepr(rtyper, classdef)
  32. rinstance = getinstancerepr(rtyper, classdef)
  33. LLB = rinstance.lowleveltype.TO
  34. ptr_vtable_B = rclass.getvtable()
  35. adr_vtable_B = llmemory.cast_ptr_to_adr(ptr_vtable_B)
  36. vtable_B = llmemory.cast_adr_to_int(adr_vtable_B, mode="symbolic")
  37. CPU = getcpuclass()
  38. cpu = CPU(rtyper, NoStats(),
  39. translate_support_code=True,
  40. gcdescr=get_description(t.config))
  41. execute_token = cpu.make_execute_token(llmemory.GCREF)
  42. finaldescr = BasicFinalDescr()
  43. faildescr = BasicFailDescr()
  44. descr_B = cpu.sizeof(LLB, ptr_vtable_B)
  45. typeid_B = descr_B.get_type_id()
  46. fielddescr_B = cpu.fielddescrof(LLB, 'inst_foo')
  47. LLD = lltype.GcStruct('D', ('dd', lltype.Signed))
  48. descr_D = cpu.sizeof(LLD)
  49. fielddescr_D = cpu.fielddescrof(LLD, 'dd')
  50. ARRAY = lltype.GcArray(lltype.Signed)
  51. arraydescr = cpu.arraydescrof(ARRAY)
  52. loop1 = parse("""
  53. [p0]
  54. guard_class(p0, ConstInt(vtable_B), descr=faildescr) []
  55. finish(descr=finaldescr)
  56. """, namespace={'finaldescr': finaldescr,
  57. 'faildescr': faildescr,
  58. 'vtable_B': vtable_B})
  59. loop2 = parse("""
  60. [p0]
  61. guard_gc_type(p0, ConstInt(typeid_B), descr=faildescr) []
  62. finish(descr=finaldescr)
  63. """, namespace={'finaldescr': finaldescr,
  64. 'faildescr': faildescr,
  65. 'typeid_B': typeid_B})
  66. loop3 = parse("""
  67. [p0]
  68. guard_is_object(p0, descr=faildescr) []
  69. finish(descr=finaldescr)
  70. """, namespace={'finaldescr': finaldescr,
  71. 'faildescr': faildescr})
  72. loop4 = parse("""
  73. [p0]
  74. guard_subclass(p0, ConstInt(vtable_B), descr=faildescr) []
  75. finish(descr=finaldescr)
  76. """, namespace={'finaldescr': finaldescr,
  77. 'faildescr': faildescr,
  78. 'vtable_B': vtable_B})
  79. def g():
  80. cpu.setup_once()
  81. token1 = JitCellToken()
  82. token2 = JitCellToken()
  83. token3 = JitCellToken()
  84. token4 = JitCellToken()
  85. cpu.compile_loop(loop1.inputargs, loop1.operations, token1)
  86. cpu.compile_loop(loop2.inputargs, loop2.operations, token2)
  87. cpu.compile_loop(loop3.inputargs, loop3.operations, token3)
  88. cpu.compile_loop(loop4.inputargs, loop4.operations, token4)
  89. for token, p0 in [
  90. (token1, rffi.cast(llmemory.GCREF, A())),
  91. (token1, rffi.cast(llmemory.GCREF, B())),
  92. (token1, rffi.cast(llmemory.GCREF, C())),
  93. (token2, rffi.cast(llmemory.GCREF, A())),
  94. (token2, rffi.cast(llmemory.GCREF, B())),
  95. (token2, rffi.cast(llmemory.GCREF, C())),
  96. (token2, rffi.cast(llmemory.GCREF, [42, 43])),
  97. (token3, rffi.cast(llmemory.GCREF, A())),
  98. (token3, rffi.cast(llmemory.GCREF, B())),
  99. (token3, rffi.cast(llmemory.GCREF, [44, 45])),
  100. (token4, rffi.cast(llmemory.GCREF, A())),
  101. (token4, rffi.cast(llmemory.GCREF, B())),
  102. (token4, rffi.cast(llmemory.GCREF, C())),
  103. ]:
  104. frame = execute_token(token, p0)
  105. descr = cpu.get_latest_descr(frame)
  106. if descr is finaldescr:
  107. print 'match'
  108. elif descr is faildescr:
  109. print 'fail'
  110. else:
  111. print '???'
  112. #
  113. if token is token2: # guard_gc_type
  114. print int(cpu.get_actual_typeid(p0) == typeid_B)
  115. if token is token3: # guard_is_object
  116. print int(cpu.check_is_object(p0))
  117. for p0 in [lltype.nullptr(llmemory.GCREF.TO),
  118. rffi.cast(llmemory.GCREF, A()),
  119. rffi.cast(llmemory.GCREF, B()),
  120. rffi.cast(llmemory.GCREF, C()),
  121. rffi.cast(llmemory.GCREF, lltype.malloc(LLD)),
  122. rffi.cast(llmemory.GCREF, lltype.malloc(ARRAY, 5)),
  123. rffi.cast(llmemory.GCREF, "foobar"),
  124. rffi.cast(llmemory.GCREF, u"foobaz")]:
  125. results = ['B', 'D', 'A', 'S', 'U']
  126. try:
  127. cpu.protect_speculative_field(p0, fielddescr_B)
  128. except SpeculativeError:
  129. results[0] = '-'
  130. try:
  131. cpu.protect_speculative_field(p0, fielddescr_D)
  132. except SpeculativeError:
  133. results[1] = '-'
  134. try:
  135. cpu.protect_speculative_array(p0, arraydescr)
  136. except SpeculativeError:
  137. results[2] = '-'
  138. try:
  139. cpu.protect_speculative_string(p0)
  140. except SpeculativeError:
  141. results[3] = '-'
  142. try:
  143. cpu.protect_speculative_unicode(p0)
  144. except SpeculativeError:
  145. results[4] = '-'
  146. print ''.join(results)
  147. call_initial_function(t, g)
  148. cbuilder = genc.CStandaloneBuilder(t, main, t.config)
  149. cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES)
  150. cbuilder.compile()
  151. data = cbuilder.cmdexec('')
  152. assert data == ('fail\n'
  153. 'match\n'
  154. 'fail\n'
  155. 'fail\n' '0\n'
  156. 'match\n' '1\n'
  157. 'fail\n' '0\n'
  158. 'fail\n' '0\n'
  159. 'match\n' '1\n'
  160. 'match\n' '1\n'
  161. 'fail\n' '0\n'
  162. 'fail\n'
  163. 'match\n'
  164. 'match\n'
  165. '-----\n' # null
  166. '-----\n' # instance of A
  167. 'B----\n' # instance of B
  168. 'B----\n' # instance of C
  169. '-D---\n'
  170. '--A--\n'
  171. '---S-\n'
  172. '----U\n'
  173. )
  174. def test_guards_translated_with_gctypeptr():
  175. run_guards_translated(gcremovetypeptr=False)
  176. def test_guards_translated_without_gctypeptr():
  177. run_guards_translated(gcremovetypeptr=True)