[pypy-commit] pypy ffi-backend: (fijal, arigo) start on raw_storage

fijal noreply at buildbot.pypy.org
Sun Jun 24 15:00:17 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: ffi-backend
Changeset: r55795:3f14b7b04094
Date: 2012-06-24 15:00 +0200
http://bitbucket.org/pypy/pypy/changeset/3f14b7b04094/

Log:	(fijal, arigo) start on raw_storage

diff --git a/pypy/rlib/rawstorage.py b/pypy/rlib/rawstorage.py
new file mode 100644
--- /dev/null
+++ b/pypy/rlib/rawstorage.py
@@ -0,0 +1,37 @@
+
+from pypy.rpython.extregistry import ExtRegistryEntry
+from pypy.rpython.lltypesystem import lltype, rffi, llmemory
+from pypy.annotation import model as annmodel
+from pypy.rlib.rgc import lltype_is_gc
+
+RAW_STORAGE = rffi.CCHARP.TO
+RAW_STORAGE_PTR = rffi.CCHARP
+
+def alloc_raw_storage(size):
+    return lltype.malloc(RAW_STORAGE, size, flavor='raw')
+
+def raw_storage_setitem(storage, index, item):
+    # NOT_RPYTHON
+    TP = rffi.CArrayPtr(lltype.typeOf(item))
+    rffi.cast(TP, rffi.ptradd(storage, index))[0] = item
+
+def free_raw_storage(storage):
+    lltype.free(storage, flavor='raw')
+
+class RawStorageSetitemEntry(ExtRegistryEntry):
+    _about_ = raw_storage_setitem
+
+    def compute_result_annotation(self, s_storage, s_index, s_item):
+        assert annmodel.SomeInteger().contains(s_index)
+
+    def specialize_call(self, hop):
+        assert not lltype_is_gc(hop.args_r[2].lowleveltype)
+        assert hop.args_r[0].lowleveltype == RAW_STORAGE_PTR
+        v_storage, v_index, v_item = hop.inputargs(hop.args_r[0],
+                                                   lltype.Signed,
+                                                   hop.args_r[2])
+        c_typ = hop.inputconst(lltype.Void, hop.args_r[2].lowleveltype)
+        hop.exception_cannot_occur()
+        v_addr = hop.genop('cast_ptr_to_adr', [v_storage],
+                           resulttype=llmemory.Address)
+        return hop.genop('raw_store', [v_addr, c_typ, v_index, v_item])
diff --git a/pypy/rlib/test/test_rawstorage.py b/pypy/rlib/test/test_rawstorage.py
new file mode 100644
--- /dev/null
+++ b/pypy/rlib/test/test_rawstorage.py
@@ -0,0 +1,25 @@
+
+from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.rlib.rawstorage import alloc_raw_storage, free_raw_storage,\
+     raw_storage_setitem
+from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin
+
+def raw_storage_getitem(storage, index, TP):
+    return rffi.cast(rffi.CArrayPtr(TP), rffi.ptradd(storage, index))[0]
+
+def test_untranslated_storage():
+    r = alloc_raw_storage(15)
+    raw_storage_setitem(r, 3, 1<<30)
+    res = raw_storage_getitem(r, 3, lltype.Signed)
+    free_raw_storage(r)
+    assert res == 1<<30
+
+class TestRawStorage(BaseRtypingTest, LLRtypeMixin):
+    def test_storage_int(self):
+        def f(i):
+            r = alloc_raw_storage(24)
+            raw_storage_setitem(r, 3, i)
+            return r
+        ll_r = self.interpret(f, [1<<30], malloc_check=False)
+        assert raw_storage_getitem(ll_r, 3, lltype.Signed) == 1 << 30
+        free_raw_storage(ll_r)


More information about the pypy-commit mailing list