[pypy-svn] r27207 - in pypy/dist/pypy/rpython: . lltypesystem lltypesystem/test
arigo at codespeak.net
arigo at codespeak.net
Sun May 14 18:59:21 CEST 2006
Author: arigo
Date: Sun May 14 18:59:19 2006
New Revision: 27207
Added:
pypy/dist/pypy/rpython/lltypesystem/llheap.py (contents, props changed)
Modified:
pypy/dist/pypy/rpython/llinterp.py
pypy/dist/pypy/rpython/lltypesystem/llmemory.py
pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
Log:
(pedronis, arigo)
Started work on llmemory.raw_malloc(), which returns
a fakeaddress instead of using the memory simulator.
The ultimate goal is to get rid of the latter. Ah ah!
Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py (original)
+++ pypy/dist/pypy/rpython/llinterp.py Sun May 14 18:59:19 2006
@@ -1,6 +1,6 @@
from pypy.objspace.flow.model import FunctionGraph, Constant, Variable, c_last_exception
from pypy.rpython.rarithmetic import intmask, r_uint, ovfcheck, r_longlong, r_ulonglong
-from pypy.rpython.lltypesystem import lltype, llmemory, lloperation
+from pypy.rpython.lltypesystem import lltype, llmemory, lloperation, llheap
from pypy.rpython.ootypesystem import ootype
from pypy.rpython.objectmodel import ComputedIntSymbolic
@@ -36,7 +36,7 @@
class LLInterpreter(object):
""" low level interpreter working with concrete values. """
- def __init__(self, typer, heap=lltype, tracing=True):
+ def __init__(self, typer, heap=llheap, tracing=True):
self.bindings = {}
self.typer = typer
self.heap = heap #module that provides malloc, etc for lltypes
@@ -480,7 +480,7 @@
return self.op_direct_call(f, *args)
def op_unsafe_call(self, TGT, f):
- assert isinstance(f, llmemory.fakeaddress)
+ checkadr(f)
assert f.offset is None
obj = self.llinterpreter.typer.type_system.deref(f.ob)
assert hasattr(obj, 'graph') # don't want to think about that
Added: pypy/dist/pypy/rpython/lltypesystem/llheap.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/lltypesystem/llheap.py Sun May 14 18:59:19 2006
@@ -0,0 +1,4 @@
+# only for the LLInterpreter. Don't use directly.
+
+from pypy.rpython.lltypesystem.lltype import pyobjectptr, malloc, free
+from pypy.rpython.lltypesystem.llmemory import raw_malloc, raw_free
Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py Sun May 14 18:59:19 2006
@@ -78,7 +78,7 @@
self.TYPE = TYPE
def __repr__(self):
- return '< ArrayItemsOffset >'
+ return '< ArrayItemsOffset %r >' % (self.TYPE,)
def ref(self, arrayref):
array = arrayref.get()
@@ -91,7 +91,7 @@
self.TYPE = TYPE
def __repr__(self):
- return '< ArrayLengthOffset >'
+ return '< ArrayLengthOffset %r >' % (self.TYPE,)
def ref(self, arrayref):
array = arrayref.get()
@@ -116,7 +116,8 @@
def get(self):
return len(self.array)
def set(self, value):
- raise Exception("can't assign to an array's length")
+ if value != len(self.array):
+ raise Exception("can't change the length of an array")
def type(self):
return lltype.Signed
@@ -235,12 +236,14 @@
# special case that requires direct_fieldptr
return lltype.direct_fieldptr(ref.struct,
ref.fieldname)
- elif (isinstance(EXPECTED_TYPE.TO, lltype.OpaqueType) or
- isinstance(ref.type().TO, lltype.OpaqueType)):
- return lltype.cast_opaque_ptr(EXPECTED_TYPE, ref.get())
else:
- # regular case
- return lltype.cast_pointer(EXPECTED_TYPE, ref.get())
+ result = ref.get()
+ if (isinstance(EXPECTED_TYPE.TO, lltype.OpaqueType) or
+ isinstance(lltype.typeOf(result).TO, lltype.OpaqueType)):
+ return lltype.cast_opaque_ptr(EXPECTED_TYPE, result)
+ else:
+ # regular case
+ return lltype.cast_pointer(EXPECTED_TYPE, result)
def _cast_to_int(self):
if self:
@@ -320,3 +323,22 @@
def cast_adr_to_int(adr):
return adr._cast_to_int()
+# ____________________________________________________________
+
+def raw_malloc(size):
+ if isinstance(size, ItemOffset):
+ T = lltype.FixedSizeArray(size.TYPE, size.repeat)
+ p = lltype.malloc(T, immortal=True)
+ array_adr = cast_ptr_to_adr(p)
+ return array_adr + ArrayItemsOffset(T)
+ elif isinstance(size, CompositeOffset):
+ if (isinstance(size.first, ArrayItemsOffset) and
+ isinstance(size.second, ItemOffset)):
+ assert size.first.TYPE.OF == size.second.TYPE
+ T = size.first.TYPE
+ p = lltype.malloc(T, size.second.repeat, immortal=True)
+ return cast_ptr_to_adr(p)
+ raise NotImplementedError(size)
+
+def raw_free(adr):
+ pass # for now
Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py Sun May 14 18:59:19 2006
@@ -193,3 +193,53 @@
adr2 = cast_ptr_to_adr(o)
s2 = cast_adr_to_ptr(adr2, lltype.Ptr(S))
assert s2 == s
+
+def test_raw_malloc_struct():
+ T = lltype.GcStruct('T', ('z', lltype.Signed))
+ S = lltype.Struct('S', ('x', lltype.Signed), ('y', lltype.Ptr(T)))
+ adr = raw_malloc(sizeof(S))
+ s = cast_adr_to_ptr(adr, lltype.Ptr(S))
+ assert lltype.typeOf(s) == lltype.Ptr(S)
+ s.x = 123
+ x_adr = adr + offsetof(S, 'x')
+ assert x_adr.signed[0] == 123
+ x_adr.signed[0] = 124
+ assert s.x == 124
+
+def test_raw_malloc_signed():
+ adr = raw_malloc(sizeof(lltype.Signed))
+ p = cast_adr_to_ptr(adr,
+ lltype.Ptr(lltype.FixedSizeArray(lltype.Signed, 1)))
+ p[0] = 123
+ assert adr.signed[0] == 123
+ adr.signed[0] = 124
+ assert p[0] == 124
+ py.test.raises(IndexError, "adr.signed[-1]")
+ py.test.raises(IndexError, "adr.signed[1]")
+
+def test_raw_malloc_signed_bunch():
+ adr = raw_malloc(sizeof(lltype.Signed) * 50)
+ p = cast_adr_to_ptr(adr,
+ lltype.Ptr(lltype.FixedSizeArray(lltype.Signed, 1)))
+ for i in range(50):
+ p[i] = 123 + i
+ assert adr.signed[i] == 123 + i
+ adr.signed[i] = 124 - i
+ assert p[i] == 124 - i
+ py.test.raises(IndexError, "adr.signed[50]")
+
+def test_raw_malloc_array():
+ A = lltype.Array(lltype.Signed)
+ adr = raw_malloc(sizeof(A, 50))
+ length_adr = adr + ArrayLengthOffset(A)
+ length_adr.signed[0] = 50
+ p = cast_adr_to_ptr(adr, lltype.Ptr(A))
+ assert len(p) == 50
+ for i in range(50):
+ item_adr = adr + itemoffsetof(A, i)
+ p[i] = 123 + i
+ assert item_adr.signed[0] == 123 + i
+ item_adr.signed[0] = 124 - i
+ assert p[i] == 124 - i
+ item_adr = adr + itemoffsetof(A, 50)
+ py.test.raises(IndexError, "item_adr.signed[0]")
More information about the Pypy-commit
mailing list