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

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Aug 5 13:41:15 CEST 2005


Author: cfbolz
Date: Fri Aug  5 13:41:14 2005
New Revision: 15677

Added:
   pypy/dist/pypy/rpython/memory/convertlltype.py
   pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
Log:
first attempt converter that converts lltype _ instances into data in
memory that the lltypesimulator can use.


Added: pypy/dist/pypy/rpython/memory/convertlltype.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/memory/convertlltype.py	Fri Aug  5 13:41:14 2005
@@ -0,0 +1,71 @@
+from pypy.rpython.memory import lladdress
+from pypy.rpython.memory.lltypesimulation import simulatorptr, get_total_size
+from pypy.rpython.memory.lltypesimulation import get_fixed_size
+from pypy.rpython.memory.lltypesimulation import get_variable_size
+from pypy.rpython.memory.lltypesimulation import primitive_to_fmt
+from pypy.rpython.memory.lltypesimulation import get_layout
+from pypy.objspace.flow.model import Constant
+from pypy.rpython import lltype
+
+class LLTypeConverter(object):
+    def __init__(self, address):
+        self.curraddress = address
+
+    def convert(self, val_or_ptr, inline_to_addr=None):
+        print "convert", val_or_ptr, inline_to_addr
+        TYPE = lltype.typeOf(val_or_ptr)
+        if isinstance(TYPE, lltype.Primitive):
+            if inline_to_addr is not None:
+                inline_to_addr._store(primitive_to_fmt[TYPE], val_or_ptr)
+            return val_or_ptr
+        elif isinstance(TYPE, lltype.Array):
+            return self.convert_array(val_or_ptr, inline_to_addr)
+        elif isinstance(TYPE, lltype.Struct):
+            return self.convert_struct(val_or_ptr, inline_to_addr)
+        elif isinstance(TYPE, lltype.Ptr):
+            return self.convert_pointer(val_or_ptr, inline_to_addr)
+        else:
+            assert 0, "not yet implemented"
+
+    def convert_array(self, _array, inline_to_addr):
+        print "convert_array", _array, inline_to_addr
+        TYPE = lltype.typeOf(_array)
+        arraylength = len(_array.items)
+        size = get_total_size(TYPE, arraylength)
+        if inline_to_addr is not None:
+            startaddr = inline_to_addr
+        else:
+            startaddr = self.curraddress
+        startaddr.signed[0] = arraylength
+        curraddr = startaddr + get_fixed_size(TYPE)
+        varsize = get_variable_size(TYPE)
+        self.curraddress += size
+        for item in _array.items:
+            self.convert(item, curraddr)
+            curraddr += varsize
+        return startaddr
+
+    def convert_struct(self, _struct, inline_to_addr):
+        print "convert_struct", _struct, inline_to_addr,
+        TYPE = lltype.typeOf(_struct)
+        layout = get_layout(TYPE)
+        print layout
+        size = get_total_size(TYPE)
+        if inline_to_addr is not None:
+            startaddr = inline_to_addr
+        else:
+            startaddr = self.curraddress
+        self.curraddress += size
+        for name in TYPE._flds:
+            addr = startaddr + layout[name]
+            self.convert(getattr(_struct, name), addr)
+        return startaddr
+
+    def convert_pointer(self, _ptr, inline_to_addr):
+        print "convert_pointer", _ptr, inline_to_addr
+        TYPE = lltype.typeOf(_ptr)
+        addr = self.convert(_ptr._obj)
+        assert isinstance(addr, lladdress.Address)
+        if inline_to_addr is not None:
+            inline_to_addr.address[0] = addr
+        return simulatorptr(TYPE, addr)

Added: pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/memory/test/test_convertlltype.py	Fri Aug  5 13:41:14 2005
@@ -0,0 +1,51 @@
+from pypy.rpython.memory.lltypesimulation import *
+from pypy.rpython.memory.convertlltype import LLTypeConverter
+
+def test_convert_primitives():
+    cvter = LLTypeConverter(lladdress.NULL)
+    addr = lladdress.raw_malloc(10)
+    c1 = cvter.convert(1)
+    c = cvter.convert("c")
+    assert c1 == 1
+    assert c == "c"
+    cvter.convert(10, addr)
+    assert addr.signed[0] == 10
+    cvter.convert("c", addr)
+    assert addr.char[0] == "c"
+
+def test_convert_array_of_primitives():
+    cvter = LLTypeConverter(lladdress.raw_malloc(1000))
+    A = lltype.GcArray(lltype.Signed)
+    lls = lltype.malloc(A, 3)
+    lls[0] = 1
+    lls[1] = 2
+    a = cvter.convert(lls)
+    assert a[0] == 1
+    assert a[1] == 2
+
+def test_convert_array_of_structs():
+    cvter = LLTypeConverter(lladdress.raw_malloc(1000))
+    S = lltype.Struct("test", ("v1", lltype.Signed), ("v2", lltype.Signed))
+    Ar =  lltype.GcArray(S)
+    llx = lltype.malloc(Ar, 3)
+    llx[0].v1 = 1
+    llx[1].v1 = 2
+    llx[2].v1 = 3    
+    x = cvter.convert(llx)
+    assert [x[z].v1 for z in range(3)] == [1, 2, 3]
+    assert [x[z].v2 for z in range(3)] == [0, 0, 0]
+
+def test_convert_array_of_ptrs():
+    cvter = LLTypeConverter(lladdress.raw_malloc(1000))
+    S = lltype.GcStruct("name", ("v", lltype.Signed))
+    A = lltype.GcArray(lltype.Ptr(S))
+    lla = lltype.malloc(A, 3)
+    lla[0] = lltype.malloc(S)
+    lla[0].v = 1
+    lla[1] = lltype.malloc(S)
+    lla[1].v = 2
+    lla[2] = lltype.malloc(S)
+    lla[2].v = 2
+    x = cvter.convert(lla)
+    assert [x[z].v for z in range(3)] == [1, 2, 3]
+



More information about the Pypy-commit mailing list