PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/rpython/rtyper/rbool.py

https://bitbucket.org/pypy/pypy/
Python | 84 lines | 66 code | 15 blank | 3 comment | 14 complexity | 80b307aa4892804062f6f221ed93cccf 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.rtyper.error import TyperError
  3. from rpython.rtyper.lltypesystem.lltype import Signed, Unsigned, Bool, Float
  4. from rpython.rtyper.rmodel import log
  5. from rpython.rtyper.rint import IntegerRepr
  6. from rpython.rtyper.rfloat import FloatRepr
  7. from rpython.tool.pairtype import pairtype
  8. class BoolRepr(IntegerRepr):
  9. lowleveltype = Bool
  10. # NB. no 'opprefix' here. Use 'as_int' systematically.
  11. def __init__(self):
  12. from rpython.rtyper.rint import signed_repr
  13. self.as_int = signed_repr
  14. def convert_const(self, value):
  15. if not isinstance(value, bool):
  16. raise TyperError("not a bool: %r" % (value,))
  17. return value
  18. def rtype_bool(_, hop):
  19. vlist = hop.inputargs(bool_repr)
  20. return vlist[0]
  21. def rtype_int(_, hop):
  22. vlist = hop.inputargs(Signed)
  23. hop.exception_cannot_occur()
  24. return vlist[0]
  25. def rtype_float(_, hop):
  26. vlist = hop.inputargs(Float)
  27. hop.exception_cannot_occur()
  28. return vlist[0]
  29. bool_repr = BoolRepr()
  30. class __extend__(annmodel.SomeBool):
  31. def rtyper_makerepr(self, rtyper):
  32. return bool_repr
  33. def rtyper_makekey(self):
  34. return self.__class__,
  35. #
  36. # _________________________ Conversions _________________________
  37. class __extend__(pairtype(BoolRepr, FloatRepr)):
  38. def convert_from_to((r_from, r_to), v, llops):
  39. if r_from.lowleveltype == Bool and r_to.lowleveltype == Float:
  40. log.debug('explicit cast_bool_to_float')
  41. return llops.genop('cast_bool_to_float', [v], resulttype=Float)
  42. return NotImplemented
  43. class __extend__(pairtype(FloatRepr, BoolRepr)):
  44. def convert_from_to((r_from, r_to), v, llops):
  45. if r_from.lowleveltype == Float and r_to.lowleveltype == Bool:
  46. log.debug('explicit cast_float_to_bool')
  47. return llops.genop('float_is_true', [v], resulttype=Bool)
  48. return NotImplemented
  49. class __extend__(pairtype(BoolRepr, IntegerRepr)):
  50. def convert_from_to((r_from, r_to), v, llops):
  51. if r_from.lowleveltype == Bool and r_to.lowleveltype == Unsigned:
  52. log.debug('explicit cast_bool_to_uint')
  53. return llops.genop('cast_bool_to_uint', [v], resulttype=Unsigned)
  54. if r_from.lowleveltype == Bool and r_to.lowleveltype == Signed:
  55. return llops.genop('cast_bool_to_int', [v], resulttype=Signed)
  56. if r_from.lowleveltype == Bool:
  57. from rpython.rtyper.rint import signed_repr
  58. v_int = llops.genop('cast_bool_to_int', [v], resulttype=Signed)
  59. return llops.convertvar(v_int, signed_repr, r_to)
  60. return NotImplemented
  61. class __extend__(pairtype(IntegerRepr, BoolRepr)):
  62. def convert_from_to((r_from, r_to), v, llops):
  63. if r_from.lowleveltype == Unsigned and r_to.lowleveltype == Bool:
  64. log.debug('explicit cast_uint_to_bool')
  65. return llops.genop('uint_is_true', [v], resulttype=Bool)
  66. if r_from.lowleveltype == Signed and r_to.lowleveltype == Bool:
  67. log.debug('explicit cast_int_to_bool')
  68. return llops.genop('int_is_true', [v], resulttype=Bool)
  69. return NotImplemented