PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/rtyper/controllerentry.py

https://bitbucket.org/pypy/pypy/
Python | 266 lines | 194 code | 71 blank | 1 comment | 13 complexity | 526ece65db385a0222e84eeb42936fe3 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.annotator import model as annmodel
  2. from rpython.tool.pairtype import pairtype
  3. from rpython.annotator.bookkeeper import getbookkeeper
  4. from rpython.rtyper.extregistry import ExtRegistryEntry
  5. from rpython.rtyper.annlowlevel import cachedtype
  6. from rpython.rtyper.error import TyperError
  7. class ControllerEntry(ExtRegistryEntry):
  8. def compute_result_annotation(self, *args_s, **kwds_s):
  9. controller = self.getcontroller(*args_s, **kwds_s)
  10. return controller.ctrl_new_ex(self.bookkeeper, *args_s, **kwds_s)
  11. def getcontroller(self, *args_s, **kwds_s):
  12. return self._controller_()
  13. def specialize_call(self, hop, **kwds_i):
  14. if hop.s_result == annmodel.s_ImpossibleValue:
  15. raise TyperError("object creation always raises: %s" % (
  16. hop.spaceop,))
  17. controller = hop.s_result.controller
  18. return controller.rtype_new(hop, **kwds_i)
  19. def controlled_instance_box(controller, obj):
  20. XXX # only for special-casing by ExtRegistryEntry below
  21. def controlled_instance_unbox(controller, obj):
  22. XXX # only for special-casing by ExtRegistryEntry below
  23. def controlled_instance_is_box(controller, obj):
  24. XXX # only for special-casing by ExtRegistryEntry below
  25. class ControllerEntryForPrebuilt(ExtRegistryEntry):
  26. def compute_annotation(self):
  27. controller = self.getcontroller()
  28. real_obj = controller.convert(self.instance)
  29. s_real_obj = self.bookkeeper.immutablevalue(real_obj)
  30. return SomeControlledInstance(s_real_obj, controller)
  31. def getcontroller(self):
  32. return self._controller_()
  33. class Controller(object):
  34. __metaclass__ = cachedtype
  35. can_be_None = False
  36. def _freeze_(self):
  37. return True
  38. def box(self, obj):
  39. return controlled_instance_box(self, obj)
  40. box._annspecialcase_ = 'specialize:arg(0)'
  41. def unbox(self, obj):
  42. return controlled_instance_unbox(self, obj)
  43. unbox._annspecialcase_ = 'specialize:arg(0)'
  44. def is_box(self, obj):
  45. return controlled_instance_is_box(self, obj)
  46. is_box._annspecialcase_ = 'specialize:arg(0)'
  47. def ctrl_new(self, *args_s, **kwds_s):
  48. if kwds_s:
  49. raise TypeError("cannot handle keyword arguments in %s" % (
  50. self.new,))
  51. s_real_obj = delegate(self.new, *args_s)
  52. if s_real_obj == annmodel.s_ImpossibleValue:
  53. return annmodel.s_ImpossibleValue
  54. else:
  55. return SomeControlledInstance(s_real_obj, controller=self)
  56. def ctrl_new_ex(self, bookkeeper, *args_s, **kwds_s):
  57. return self.ctrl_new(*args_s, **kwds_s)
  58. def rtype_new(self, hop):
  59. from rpython.rtyper.rcontrollerentry import rtypedelegate
  60. return rtypedelegate(self.new, hop, revealargs=[], revealresult=True)
  61. def getattr(self, obj, attr):
  62. return getattr(self, 'get_' + attr)(obj)
  63. getattr._annspecialcase_ = 'specialize:arg(0, 2)'
  64. def ctrl_getattr(self, s_obj, s_attr):
  65. return delegate(self.getattr, s_obj, s_attr)
  66. def rtype_getattr(self, hop):
  67. from rpython.rtyper.rcontrollerentry import rtypedelegate
  68. return rtypedelegate(self.getattr, hop)
  69. def setattr(self, obj, attr, value):
  70. return getattr(self, 'set_' + attr)(obj, value)
  71. setattr._annspecialcase_ = 'specialize:arg(0, 2)'
  72. def ctrl_setattr(self, s_obj, s_attr, s_value):
  73. return delegate(self.setattr, s_obj, s_attr, s_value)
  74. def rtype_setattr(self, hop):
  75. from rpython.rtyper.rcontrollerentry import rtypedelegate
  76. return rtypedelegate(self.setattr, hop)
  77. def ctrl_getitem(self, s_obj, s_key):
  78. return delegate(self.getitem, s_obj, s_key)
  79. def rtype_getitem(self, hop):
  80. from rpython.rtyper.rcontrollerentry import rtypedelegate
  81. return rtypedelegate(self.getitem, hop)
  82. def ctrl_setitem(self, s_obj, s_key, s_value):
  83. return delegate(self.setitem, s_obj, s_key, s_value)
  84. def rtype_setitem(self, hop):
  85. from rpython.rtyper.rcontrollerentry import rtypedelegate
  86. return rtypedelegate(self.setitem, hop)
  87. def ctrl_delitem(self, s_obj, s_key):
  88. return delegate(self.delitem, s_obj, s_key)
  89. def rtype_delitem(self, hop):
  90. from rpython.rtyper.rcontrollerentry import rtypedelegate
  91. return rtypedelegate(self.delitem, hop)
  92. def ctrl_bool(self, s_obj):
  93. return delegate(self.bool, s_obj)
  94. def rtype_bool(self, hop):
  95. from rpython.rtyper.rcontrollerentry import rtypedelegate
  96. return rtypedelegate(self.bool, hop)
  97. def ctrl_call(self, s_obj, *args_s):
  98. return delegate(self.call, s_obj, *args_s)
  99. def rtype_call(self, hop):
  100. from rpython.rtyper.rcontrollerentry import rtypedelegate
  101. return rtypedelegate(self.call, hop)
  102. def delegate(boundmethod, *args_s):
  103. bk = getbookkeeper()
  104. s_meth = bk.immutablevalue(boundmethod)
  105. return bk.emulate_pbc_call(bk.position_key, s_meth, args_s,
  106. callback = bk.position_key)
  107. class BoxEntry(ExtRegistryEntry):
  108. _about_ = controlled_instance_box
  109. def compute_result_annotation(self, s_controller, s_real_obj):
  110. if s_real_obj == annmodel.s_ImpossibleValue:
  111. return annmodel.s_ImpossibleValue
  112. else:
  113. assert s_controller.is_constant()
  114. controller = s_controller.const
  115. return SomeControlledInstance(s_real_obj, controller=controller)
  116. def specialize_call(self, hop):
  117. from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
  118. if not isinstance(hop.r_result, ControlledInstanceRepr):
  119. raise TyperError("box() should return ControlledInstanceRepr,\n"
  120. "got %r" % (hop.r_result,))
  121. hop.exception_cannot_occur()
  122. return hop.inputarg(hop.r_result.r_real_obj, arg=1)
  123. class UnboxEntry(ExtRegistryEntry):
  124. _about_ = controlled_instance_unbox
  125. def compute_result_annotation(self, s_controller, s_obj):
  126. if s_obj == annmodel.s_ImpossibleValue:
  127. return annmodel.s_ImpossibleValue
  128. else:
  129. assert isinstance(s_obj, SomeControlledInstance)
  130. return s_obj.s_real_obj
  131. def specialize_call(self, hop):
  132. from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
  133. if not isinstance(hop.args_r[1], ControlledInstanceRepr):
  134. raise TyperError("unbox() should take a ControlledInstanceRepr,\n"
  135. "got %r" % (hop.args_r[1],))
  136. hop.exception_cannot_occur()
  137. v = hop.inputarg(hop.args_r[1], arg=1)
  138. return hop.llops.convertvar(v, hop.args_r[1].r_real_obj, hop.r_result)
  139. class IsBoxEntry(ExtRegistryEntry):
  140. _about_ = controlled_instance_is_box
  141. def compute_result_annotation(self, s_controller, s_obj):
  142. if s_obj == annmodel.s_ImpossibleValue:
  143. return annmodel.s_ImpossibleValue
  144. else:
  145. assert s_controller.is_constant()
  146. controller = s_controller.const
  147. result = (isinstance(s_obj, SomeControlledInstance) and
  148. s_obj.controller == controller)
  149. return self.bookkeeper.immutablevalue(result)
  150. def specialize_call(self, hop):
  151. from rpython.rtyper.lltypesystem import lltype
  152. assert hop.s_result.is_constant()
  153. hop.exception_cannot_occur()
  154. return hop.inputconst(lltype.Bool, hop.s_result.const)
  155. # ____________________________________________________________
  156. class SomeControlledInstance(annmodel.SomeObject):
  157. def __init__(self, s_real_obj, controller):
  158. self.s_real_obj = s_real_obj
  159. self.controller = controller
  160. self.knowntype = controller.knowntype
  161. def can_be_none(self):
  162. return self.controller.can_be_None
  163. def noneify(self):
  164. return SomeControlledInstance(self.s_real_obj, self.controller)
  165. def rtyper_makerepr(self, rtyper):
  166. from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
  167. return ControlledInstanceRepr(rtyper, self.s_real_obj, self.controller)
  168. def rtyper_makekey(self):
  169. real_key = self.s_real_obj.rtyper_makekey()
  170. return self.__class__, real_key, self.controller
  171. class __extend__(SomeControlledInstance):
  172. def getattr(s_cin, s_attr):
  173. assert s_attr.is_constant()
  174. return s_cin.controller.ctrl_getattr(s_cin.s_real_obj, s_attr)
  175. def setattr(s_cin, s_attr, s_value):
  176. assert s_attr.is_constant()
  177. s_cin.controller.ctrl_setattr(s_cin.s_real_obj, s_attr, s_value)
  178. def bool(s_cin):
  179. return s_cin.controller.ctrl_is_true(s_cin.s_real_obj)
  180. def simple_call(s_cin, *args_s):
  181. return s_cin.controller.ctrl_call(s_cin.s_real_obj, *args_s)
  182. class __extend__(pairtype(SomeControlledInstance, annmodel.SomeObject)):
  183. def getitem((s_cin, s_key)):
  184. return s_cin.controller.ctrl_getitem(s_cin.s_real_obj, s_key)
  185. def setitem((s_cin, s_key), s_value):
  186. s_cin.controller.ctrl_setitem(s_cin.s_real_obj, s_key, s_value)
  187. def delitem((s_cin, s_key)):
  188. s_cin.controller.ctrl_delitem(s_cin.s_real_obj, s_key)
  189. class __extend__(pairtype(SomeControlledInstance, SomeControlledInstance)):
  190. def union((s_cin1, s_cin2)):
  191. if s_cin1.controller is not s_cin2.controller:
  192. raise annmodel.UnionError("different controller!")
  193. return SomeControlledInstance(annmodel.unionof(s_cin1.s_real_obj,
  194. s_cin2.s_real_obj),
  195. s_cin1.controller)