/pypy/rpython/rbool.py
Python | 78 lines | 61 code | 14 blank | 3 comment | 12 complexity | 63b7ed6624c3afcc5edf831f3f98a7ab MD5 | raw file
- from pypy.tool.pairtype import pairtype
- from pypy.annotation import model as annmodel
- from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Bool, Float
- from pypy.rpython.error import TyperError
- from pypy.rpython.rmodel import IntegerRepr, BoolRepr
- from pypy.rpython.robject import PyObjRepr, pyobj_repr
- from pypy.rpython.rmodel import log
- class __extend__(annmodel.SomeBool):
- def rtyper_makerepr(self, rtyper):
- return bool_repr
- def rtyper_makekey(self):
- return self.__class__,
- bool_repr = BoolRepr()
- class __extend__(BoolRepr):
- def convert_const(self, value):
- if not isinstance(value, bool):
- raise TyperError("not a bool: %r" % (value,))
- return value
- def rtype_is_true(_, hop):
- vlist = hop.inputargs(Bool)
- return vlist[0]
- def rtype_int(_, hop):
- vlist = hop.inputargs(Signed)
- hop.exception_cannot_occur()
- return vlist[0]
- def rtype_float(_, hop):
- vlist = hop.inputargs(Float)
- return vlist[0]
- #
- # _________________________ Conversions _________________________
- class __extend__(pairtype(BoolRepr, IntegerRepr)):
- def convert_from_to((r_from, r_to), v, llops):
- if r_from.lowleveltype == Bool and r_to.lowleveltype == Unsigned:
- log.debug('explicit cast_bool_to_uint')
- return llops.genop('cast_bool_to_uint', [v], resulttype=Unsigned)
- if r_from.lowleveltype == Bool and r_to.lowleveltype == Signed:
- return llops.genop('cast_bool_to_int', [v], resulttype=Signed)
- if r_from.lowleveltype == Bool:
- from pypy.rpython.rint import signed_repr
- v_int = llops.genop('cast_bool_to_int', [v], resulttype=Signed)
- return llops.convertvar(v_int, signed_repr, r_to)
- return NotImplemented
- class __extend__(pairtype(IntegerRepr, BoolRepr)):
- def convert_from_to((r_from, r_to), v, llops):
- if r_from.lowleveltype == Unsigned and r_to.lowleveltype == Bool:
- log.debug('explicit cast_uint_to_bool')
- return llops.genop('uint_is_true', [v], resulttype=Bool)
- if r_from.lowleveltype == Signed and r_to.lowleveltype == Bool:
- log.debug('explicit cast_int_to_bool')
- return llops.genop('int_is_true', [v], resulttype=Bool)
- return NotImplemented
- class __extend__(pairtype(PyObjRepr, BoolRepr)):
- def convert_from_to((r_from, r_to), v, llops):
- if r_to.lowleveltype == Bool:
- # xxx put in table
- return llops.gencapicall('PyObject_IsTrue', [v], resulttype=Bool,
- _callable=lambda pyo: bool(pyo._obj.value))
- return NotImplemented
- class __extend__(pairtype(BoolRepr, PyObjRepr)):
- def convert_from_to((r_from, r_to), v, llops):
- if r_from.lowleveltype == Bool:
- return llops.gencapicall('PyBool_FromLong', [v],
- resulttype = pyobj_repr)
- return NotImplemented