[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