[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