[pypy-commit] pypy jit-constptr-2: (fijal, arigo)

arigo pypy.commits at gmail.com
Thu Mar 31 08:31:27 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-constptr-2
Changeset: r83455:17289fc949d4
Date: 2016-03-31 13:20 +0100
http://bitbucket.org/pypy/pypy/changeset/17289fc949d4/

Log:	(fijal, arigo)

	Start on this object

diff --git a/rpython/jit/backend/llsupport/gcreftracer.py b/rpython/jit/backend/llsupport/gcreftracer.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/llsupport/gcreftracer.py
@@ -0,0 +1,19 @@
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+from rpython.jit.backend.llsupport.symbolic import WORD
+
+
+GCREFTRACER = lltype.GcStruct(
+    'GCREFTRACER',
+    ('array_base_addr', lltype.Signed),
+    ('array_length', lltype.Signed),
+    rtti=True)
+
+def gcrefs_trace(gc, obj_addr, callback, arg):
+    obj = llmemory.cast_adr_to_ptr(obj_addr, lltype.Ptr(GCREFTRACER))
+    i = 0
+    length = obj.array_length
+    addr = obj.array_base_addr
+    while i < length:
+        gc._trace_callback(callback, arg, addr + i * WORD)
+        i += 1
+lambda_gcrefs_trace = lambda: gcrefs_trace
diff --git a/rpython/jit/backend/llsupport/test/test_gcreftracer.py b/rpython/jit/backend/llsupport/test/test_gcreftracer.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/llsupport/test/test_gcreftracer.py
@@ -0,0 +1,28 @@
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+from rpython.jit.backend.llsupport.gcreftracer import GCREFTRACER, gcrefs_trace
+
+
+class FakeGC:
+    def __init__(self):
+        self.called = []
+    def _trace_callback(self, callback, arg, addr):
+        assert callback == "callback"
+        assert arg == "arg"
+        self.called.append(addr)
+
+
+def test_gcreftracer():
+    a = lltype.malloc(rffi.CArray(lltype.Signed), 3, flavor='raw')
+    a[0] = 123
+    a[1] = 456
+    a[2] = 789
+    tr = lltype.malloc(GCREFTRACER)
+    tr.array_base_addr = base = rffi.cast(lltype.Signed, a)
+    tr.array_length = 3
+    gc = FakeGC()
+    gcrefs_trace(gc, llmemory.cast_ptr_to_adr(tr), "callback", "arg")
+    assert len(gc.called) == 3
+    WORD = rffi.sizeof(lltype.Signed)
+    for i in range(3):
+        assert gc.called[i] == rffi.cast(llmemory.Address, base + i * WORD)
+    lltype.free(a, flavor='raw')


More information about the pypy-commit mailing list