Author: Maciej Fijalkowski <[email protected]>
Branch: gc_no_cleanup_nursery
Changeset: r73538:5ba9f2d2ffbe
Date: 2014-09-14 16:36 -0600
http://bitbucket.org/pypy/pypy/changeset/5ba9f2d2ffbe/

Log:    implement offsets_of_gcfields in sizedescr

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_gcfields=None):
         self.size = size
         self.count_fields_if_immut = count_fields_if_immut
+        self.offsets_of_gcfields = offsets_of_gcfields
 
     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_gcfields = heaptracker.offsets_of_gcfields(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_gcfields)
         else:
-            sizedescr = SizeDescr(size, count_fields_if_immut)
+            sizedescr = SizeDescr(size, count_fields_if_immut,
+                                  offsets_of_gcfields)
         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
@@ -19,6 +19,9 @@
     assert descr_t.size == symbolic.get_size(T, False)
     assert descr_s.count_fields_if_immutable() == -1
     assert descr_t.count_fields_if_immutable() == -1
+    assert descr_t.offsets_of_gcfields == []
+    assert descr_s.offsets_of_gcfields == [
+        symbolic.get_field_token(S, 'y', False)[0]]
     assert descr_s == get_size_descr(c0, S)
     assert descr_s != get_size_descr(c1, S)
     #
@@ -26,6 +29,14 @@
     assert isinstance(descr_s.size, Symbolic)
     assert descr_s.count_fields_if_immutable() == -1
 
+    PARENT = lltype.Struct('P', ('x', lltype.Ptr(T)))
+    STRUCT = lltype.GcStruct('S', ('parent', PARENT), ('y', lltype.Ptr(T)))
+    descr_struct = get_size_descr(c0, STRUCT)
+    assert descr_struct.offsets_of_gcfields == [
+        symbolic.get_field_token(PARENT, 'x', False)[0],
+        symbolic.get_field_token(STRUCT, 'y', False)[0],
+    ]
+
 def test_get_size_descr_immut():
     S = lltype.GcStruct('S', hints={'immutable': True})
     T = lltype.GcStruct('T', ('parent', S),
diff --git a/rpython/jit/backend/llsupport/test/test_gc.py 
b/rpython/jit/backend/llsupport/test/test_gc.py
--- a/rpython/jit/backend/llsupport/test/test_gc.py
+++ b/rpython/jit/backend/llsupport/test/test_gc.py
@@ -70,6 +70,8 @@
         self.record.append(("fixedsize", repr(size), tid, p))
         return p
 
+    do_malloc_fixedsize_clear = do_malloc_fixedsize
+
     def do_malloc_varsize(self, RESTYPE, type_id, length, size,
                                 itemsize, offset_to_length):
         p, tid = self._malloc(type_id, size + itemsize * length)
@@ -80,6 +82,8 @@
                             repr(offset_to_length), p))
         return p
 
+    do_malloc_varsize_clear = do_malloc_varsize
+
     def _write_barrier_failing_case(self, adr_struct):
         self.record.append(('barrier', adr_struct))
 
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
@@ -126,3 +126,19 @@
     vtable = llmemory.cast_ptr_to_adr(vtable)
     return adr2int(vtable)
     
+def offsets_of_gcfields(gccache, STRUCT, res=None):
+    from rpython.jit.backend.llsupport import symbolic
+
+    if res is None:
+        res = []
+    # order is not relevant, except for tests
+    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_gcfields(gccache, FIELD, res)
+    if not we_are_translated():
+        res.sort()
+    return res
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -161,7 +161,6 @@
                 subbox = value.force_box(optforce)
                 op = ResOperation(rop.SETFIELD_GC, [box, subbox], None,
                                   descr=ofs)
-
                 optforce.emit_operation(op)
 
     def _get_field_descr_list(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to