[pypy-svn] r16157 - in pypy/dist/pypy/rpython: . memory/test

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Aug 19 12:05:38 CEST 2005


Author: cfbolz
Date: Fri Aug 19 12:05:37 2005
New Revision: 16157

Modified:
   pypy/dist/pypy/rpython/llinterp.py
   pypy/dist/pypy/rpython/memory/test/test_address.py
Log:
add operations neccessary for using addresses in the llinterpreter


Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py	(original)
+++ pypy/dist/pypy/rpython/llinterp.py	Fri Aug 19 12:05:37 2005
@@ -4,6 +4,7 @@
 from pypy.rpython.rarithmetic import intmask, r_uint, ovfcheck
 from pypy.rpython import lltype
 from pypy.rpython.rmodel import getfunctionptr
+from pypy.rpython.memory import lladdress
 
 import math
 import py
@@ -432,7 +433,46 @@
             assert self.llt.typeOf(pyo) == self.llt.Ptr(self.llt.PyObject)
         res = f._obj.value(*[pyo._obj.value for pyo in args])
         return self.llt.pyobjectptr(res)
-        
+
+    # __________________________________________________________
+    # operations on addresses
+
+    def op_raw_malloc(self, size):
+        assert self.llt.typeOf(size) == self.llt.Signed
+        return lladdress.raw_malloc(size)
+
+    def op_raw_load(self, addr, typ, offset):
+        assert isinstance(addr, lladdress.address)
+        value = getattr(addr, str(typ).lower())[offset]
+        assert self.llt.typeOf(value) == typ
+        return value
+
+    def op_raw_store(self, addr, typ, offset, value):
+        assert isinstance(addr, lladdress.address)
+        assert self.llt.typeOf(value) == typ
+        getattr(addr, str(typ).lower())[offset] = value
+
+    def op_adr_ne(self, addr1, addr2):
+        assert isinstance(addr1, lladdress.address)
+        assert isinstance(addr2, lladdress.address)
+        return addr1 != addr2
+
+    def op_adr_add(self, addr, offset):
+        assert isinstance(addr, lladdress.address)
+        assert self.llt.typeOf(offset) is self.llt.Signed
+        return addr + offset
+
+    def op_adr_sub(self, addr, offset):
+        assert isinstance(addr, lladdress.address)
+        assert self.llt.typeOf(offset) is self.llt.Signed
+        return addr - offset
+
+    def op_adr_delta(self, addr1, addr2):
+        assert isinstance(addr1, lladdress.address)
+        assert isinstance(addr2, lladdress.address)
+        return addr1 - addr2
+
+    
     # __________________________________________________________
     # primitive operations
 

Modified: pypy/dist/pypy/rpython/memory/test/test_address.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_address.py	(original)
+++ pypy/dist/pypy/rpython/memory/test/test_address.py	Fri Aug 19 12:05:37 2005
@@ -10,6 +10,7 @@
 from pypy.rpython.memory.lladdress import get_py_object, get_address_of_object
 from pypy.rpython.memory.lladdress import Address
 from pypy.rpython.memory.simulator import MemorySimulatorError
+from pypy.rpython.memory.test.test_llinterpsim import interpret
 
 class TestAddressAnnotation(object):
     def test_null(self):
@@ -122,6 +123,13 @@
         rtyp = a.translator.flowgraphs[f].returnblock.inputargs[0].concretetype
         assert rtyp == Address
 
+    def test_convert_to_bool(self):
+        def f(addr):
+            return bool(addr)
+        a = RPythonAnnotator()
+        s = a.build_types(f, [annmodel.SomeAddress()])
+        assert isinstance(s, annmodel.SomeBool)
+
     def test_raw_malloc(self):
         def f():
             return raw_malloc(100)
@@ -193,6 +201,41 @@
         graph = a.translator.flowgraphs[f] 
         assert graph.startblock.operations[0].result.concretetype == Address
 
+class TestAddressInLLInterp(object):
+    def test_null(self):
+        def f():
+            return NULL
+        assert interpret(f, []) is NULL
+
+    def test_convert_to_bool(self):
+        def f(addr):
+            return bool(addr)
+        res = interpret(f, [NULL])
+        assert isinstance(res, bool) and not res
+        res = interpret(f, [address(1)])
+        assert isinstance(res, bool) and res
+
+    def test_memory_access(self):
+        def f(value):
+            addr = raw_malloc(16)
+            addr.signed[0] = value
+            return addr.signed[0]
+        res = interpret(f, [42])
+        assert res == 42
+        res = interpret(f, [1])
+        assert res == 1
+        
+
+    def test_pointer_arithmetic(self):
+        def f(offset, char):
+            addr = raw_malloc(10000)
+            same_offset = (addr + 2 * offset - offset) - addr 
+            addr.char[offset] = char
+            return (addr + same_offset).char[0]
+        res = interpret(f, [10, "c"])
+        assert res == "c"
+        res = interpret(f, [12, "x"])
+        assert res == "x"
 
 class TestAddressSimulation(object):
     def test_null_is_singleton(self):



More information about the Pypy-commit mailing list