PageRenderTime 35ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/rpython/rbool.py

https://github.com/thepian/pypy
Python | 78 lines | 61 code | 14 blank | 3 comment | 12 complexity | 63b7ed6624c3afcc5edf831f3f98a7ab MD5 | raw file
  1. from pypy.tool.pairtype import pairtype
  2. from pypy.annotation import model as annmodel
  3. from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Bool, Float
  4. from pypy.rpython.error import TyperError
  5. from pypy.rpython.rmodel import IntegerRepr, BoolRepr
  6. from pypy.rpython.robject import PyObjRepr, pyobj_repr
  7. from pypy.rpython.rmodel import log
  8. class __extend__(annmodel.SomeBool):
  9. def rtyper_makerepr(self, rtyper):
  10. return bool_repr
  11. def rtyper_makekey(self):
  12. return self.__class__,
  13. bool_repr = BoolRepr()
  14. class __extend__(BoolRepr):
  15. def convert_const(self, value):
  16. if not isinstance(value, bool):
  17. raise TyperError("not a bool: %r" % (value,))
  18. return value
  19. def rtype_is_true(_, hop):
  20. vlist = hop.inputargs(Bool)
  21. return vlist[0]
  22. def rtype_int(_, hop):
  23. vlist = hop.inputargs(Signed)
  24. hop.exception_cannot_occur()
  25. return vlist[0]
  26. def rtype_float(_, hop):
  27. vlist = hop.inputargs(Float)
  28. return vlist[0]
  29. #
  30. # _________________________ Conversions _________________________
  31. class __extend__(pairtype(BoolRepr, IntegerRepr)):
  32. def convert_from_to((r_from, r_to), v, llops):
  33. if r_from.lowleveltype == Bool and r_to.lowleveltype == Unsigned:
  34. log.debug('explicit cast_bool_to_uint')
  35. return llops.genop('cast_bool_to_uint', [v], resulttype=Unsigned)
  36. if r_from.lowleveltype == Bool and r_to.lowleveltype == Signed:
  37. return llops.genop('cast_bool_to_int', [v], resulttype=Signed)
  38. if r_from.lowleveltype == Bool:
  39. from pypy.rpython.rint import signed_repr
  40. v_int = llops.genop('cast_bool_to_int', [v], resulttype=Signed)
  41. return llops.convertvar(v_int, signed_repr, r_to)
  42. return NotImplemented
  43. class __extend__(pairtype(IntegerRepr, BoolRepr)):
  44. def convert_from_to((r_from, r_to), v, llops):
  45. if r_from.lowleveltype == Unsigned and r_to.lowleveltype == Bool:
  46. log.debug('explicit cast_uint_to_bool')
  47. return llops.genop('uint_is_true', [v], resulttype=Bool)
  48. if r_from.lowleveltype == Signed and r_to.lowleveltype == Bool:
  49. log.debug('explicit cast_int_to_bool')
  50. return llops.genop('int_is_true', [v], resulttype=Bool)
  51. return NotImplemented
  52. class __extend__(pairtype(PyObjRepr, BoolRepr)):
  53. def convert_from_to((r_from, r_to), v, llops):
  54. if r_to.lowleveltype == Bool:
  55. # xxx put in table
  56. return llops.gencapicall('PyObject_IsTrue', [v], resulttype=Bool,
  57. _callable=lambda pyo: bool(pyo._obj.value))
  58. return NotImplemented
  59. class __extend__(pairtype(BoolRepr, PyObjRepr)):
  60. def convert_from_to((r_from, r_to), v, llops):
  61. if r_from.lowleveltype == Bool:
  62. return llops.gencapicall('PyBool_FromLong', [v],
  63. resulttype = pyobj_repr)
  64. return NotImplemented