[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