[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