[pypy-commit] pypy gc_no_cleanup_nursery: implement size descr storing offsets of gc pointers

fijal noreply at buildbot.pypy.org
Wed Sep 10 05:28:04 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73415:6dfd216b0e8d
Date: 2014-09-09 21:27 -0600
http://bitbucket.org/pypy/pypy/changeset/6dfd216b0e8d/

Log:	implement size descr storing offsets of gc pointers

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -630,17 +630,17 @@
 
     def bh_new(self, sizedescr):
         return lltype.cast_opaque_ptr(llmemory.GCREF,
-                                      lltype.malloc(sizedescr.S))
+                                      lltype.malloc(sizedescr.S, zero=True))
 
     def bh_new_with_vtable(self, vtable, descr):
-        result = lltype.malloc(descr.S)
+        result = lltype.malloc(descr.S, zero=True)
         result_as_objptr = lltype.cast_pointer(rclass.OBJECTPTR, result)
         result_as_objptr.typeptr = support.cast_from_int(rclass.CLASSTYPE,
                                                          vtable)
         return lltype.cast_opaque_ptr(llmemory.GCREF, result)
 
     def bh_new_array(self, length, arraydescr):
-        array = lltype.malloc(arraydescr.A, length)
+        array = lltype.malloc(arraydescr.A, length, zero=True)
         return lltype.cast_opaque_ptr(llmemory.GCREF, array)
 
     def bh_classof(self, struct):
diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -35,9 +35,11 @@
     size = 0      # help translation
     tid = llop.combine_ushort(lltype.Signed, 0, 0)
 
-    def __init__(self, size, count_fields_if_immut=-1):
+    def __init__(self, size, count_fields_if_immut=-1,
+                 offsets_of_gcptrs=None):
         self.size = size
         self.count_fields_if_immut = count_fields_if_immut
+        self.offsets_of_gcptrs = offsets_of_gcptrs
 
     def count_fields_if_immutable(self):
         return self.count_fields_if_immut
@@ -58,10 +60,13 @@
     except KeyError:
         size = symbolic.get_size(STRUCT, gccache.translate_support_code)
         count_fields_if_immut = heaptracker.count_fields_if_immutable(STRUCT)
+        offsets_of_gcptrs = heaptracker.offsets_of_gcptrs(gccache, STRUCT)
         if heaptracker.has_gcstruct_a_vtable(STRUCT):
-            sizedescr = SizeDescrWithVTable(size, count_fields_if_immut)
+            sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
+                                            offsets_of_gcptrs)
         else:
-            sizedescr = SizeDescr(size, count_fields_if_immut)
+            sizedescr = SizeDescr(size, count_fields_if_immut,
+                                  offsets_of_gcptrs)
         gccache.init_size_descr(STRUCT, sizedescr)
         cache[STRUCT] = sizedescr
         return sizedescr
diff --git a/rpython/jit/backend/llsupport/test/test_descr.py b/rpython/jit/backend/llsupport/test/test_descr.py
--- a/rpython/jit/backend/llsupport/test/test_descr.py
+++ b/rpython/jit/backend/llsupport/test/test_descr.py
@@ -15,6 +15,9 @@
                              ('y', lltype.Ptr(T)))
     descr_s = get_size_descr(c0, S)
     descr_t = get_size_descr(c0, T)
+    assert descr_t.offsets_of_gcptrs == []
+    assert descr_s.offsets_of_gcptrs == [
+        symbolic.get_field_token(S, "y", False)[0]]
     assert descr_s.size == symbolic.get_size(S, False)
     assert descr_t.size == symbolic.get_size(T, False)
     assert descr_s.count_fields_if_immutable() == -1
diff --git a/rpython/jit/codewriter/heaptracker.py b/rpython/jit/codewriter/heaptracker.py
--- a/rpython/jit/codewriter/heaptracker.py
+++ b/rpython/jit/codewriter/heaptracker.py
@@ -1,5 +1,6 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory, rclass
 from rpython.rlib.objectmodel import we_are_translated
+from rpython.jit.backend.llsupport import symbolic
 
 
 def adr2int(addr):
@@ -125,3 +126,16 @@
     vtable = descr.as_vtable_size_descr()._corresponding_vtable
     vtable = llmemory.cast_ptr_to_adr(vtable)
     return adr2int(vtable)
+
+def offsets_of_gcptrs(gccache, STRUCT, res=None):
+    if res is None:
+        res = []
+    for name, FIELD in STRUCT._flds.iteritems():
+        if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
+            
+            offset, _ = symbolic.get_field_token(STRUCT, name,
+                                        gccache.translate_support_code)
+            res.append(offset)
+        elif isinstance(FIELD, lltype.Struct):
+            offsets_of_gcptrs(gccache, FIELD, res)
+    return res


More information about the pypy-commit mailing list