[pypy-svn] r13558 - in pypy/dist/pypy/rpython: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Jun 17 23:01:59 CEST 2005
Author: arigo
Date: Fri Jun 17 23:01:57 2005
New Revision: 13558
Modified:
pypy/dist/pypy/rpython/llinterp.py
pypy/dist/pypy/rpython/rbool.py
pypy/dist/pypy/rpython/test/test_rbool.py
Log:
Boolean conversions from/to PyObjects. LLInterp support and tests for
cast_bool_to_int.
Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py (original)
+++ pypy/dist/pypy/rpython/llinterp.py Fri Jun 17 23:01:57 2005
@@ -210,8 +210,16 @@
return cast_pointer(tp, obj)
def op_cast_int_to_float(self, i):
- assert isinstance(i, int)
+ assert type(i) is int
return float(i)
+
+ def op_cast_bool_to_int(self, b):
+ assert type(b) is bool
+ return int(b)
+
+ def op_cast_bool_to_float(self, b):
+ assert type(b) is bool
+ return float(b)
# __________________________________________________________
# primitive operations
from pypy.objspace.flow.operation import FunctionByName
Modified: pypy/dist/pypy/rpython/rbool.py
==============================================================================
--- pypy/dist/pypy/rpython/rbool.py (original)
+++ pypy/dist/pypy/rpython/rbool.py Fri Jun 17 23:01:57 2005
@@ -1,7 +1,8 @@
from pypy.annotation.pairtype import pairtype
from pypy.annotation import model as annmodel
-from pypy.rpython.lltype import Signed, Unsigned, Bool, Float
+from pypy.rpython.lltype import Signed, Unsigned, Bool, Float, pyobjectptr
from pypy.rpython.rmodel import Repr, TyperError, IntegerRepr, BoolRepr
+from pypy.rpython.robject import PyObjRepr
debug = False
@@ -46,3 +47,32 @@
if debug: print 'explicit cast_bool_to_int'
return llops.genop('cast_bool_to_int', [v], resulttype=Signed)
return NotImplemented
+
+pyobj_true = pyobjectptr(True)
+pyobj_false = pyobjectptr(False)
+
+def ll_pyobj2bool(pyobjptr):
+ if pyobjptr == pyobj_true:
+ return True
+ elif pyobjptr == pyobj_false:
+ return False
+ else:
+ raise TypeError
+
+def ll_bool2pyobj(boolval):
+ if boolval:
+ return pyobj_true
+ else:
+ return pyobj_false
+
+class __extend__(pairtype(PyObjRepr, BoolRepr)):
+ def convert_from_to((r_from, r_to), v, llops):
+ if r_to.lowleveltype == Bool:
+ return llops.gendirectcall(ll_pyobj2bool, v)
+ return NotImplemented
+
+class __extend__(pairtype(BoolRepr, PyObjRepr)):
+ def convert_from_to((r_from, r_to), v, llops):
+ if r_from.lowleveltype == Bool:
+ return llops.gendirectcall(ll_bool2pyobj, v)
+ return NotImplemented
Modified: pypy/dist/pypy/rpython/test/test_rbool.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rbool.py (original)
+++ pypy/dist/pypy/rpython/test/test_rbool.py Fri Jun 17 23:01:57 2005
@@ -1,7 +1,9 @@
from pypy.translator.translator import Translator
+from pypy.rpython.lltype import pyobjectptr
from pypy.rpython.rtyper import RPythonTyper
from pypy.annotation import model as annmodel
from pypy.rpython.test import snippet
+from pypy.rpython.test.test_llinterp import interpret
class TestSnippet(object):
@@ -36,3 +38,13 @@
# XXX TODO test if all binary operations are implemented
for opname in annmodel.BINARY_OPERATIONS:
print 'BINARY_OPERATIONS:', opname
+
+ def test_bool2int(self):
+ def f(n):
+ if n:
+ n = 2
+ return n
+ res = interpret(f, [False])
+ assert res == 0 and res is not False # forced to int by static typing
+ res = interpret(f, [True])
+ assert res == 2
More information about the Pypy-commit
mailing list