[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