[pypy-commit] pypy gc_no_cleanup_nursery: only store gc fielddescrs

fijal noreply at buildbot.pypy.org
Thu Sep 25 12:12:38 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73697:bd40306ca234
Date: 2014-09-25 12:11 +0200
http://bitbucket.org/pypy/pypy/changeset/bd40306ca234/

Log:	only store gc fielddescrs

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
@@ -36,10 +36,10 @@
     tid = llop.combine_ushort(lltype.Signed, 0, 0)
 
     def __init__(self, size, count_fields_if_immut=-1,
-                 fielddescrs=None):
+                 gc_fielddescrs=None):
         self.size = size
         self.count_fields_if_immut = count_fields_if_immut
-        self.fielddescrs = fielddescrs
+        self.gc_fielddescrs = gc_fielddescrs
 
     def count_fields_if_immutable(self):
         return self.count_fields_if_immut
@@ -60,13 +60,13 @@
     except KeyError:
         size = symbolic.get_size(STRUCT, gccache.translate_support_code)
         count_fields_if_immut = heaptracker.count_fields_if_immutable(STRUCT)
-        fielddescrs = heaptracker.fielddescrs(gccache, STRUCT)
+        gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT)
         if heaptracker.has_gcstruct_a_vtable(STRUCT):
             sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
-                                            fielddescrs)
+                                            gc_fielddescrs)
         else:
             sizedescr = SizeDescr(size, count_fields_if_immut,
-                                  fielddescrs)
+                                  gc_fielddescrs)
         gccache.init_size_descr(STRUCT, sizedescr)
         cache[STRUCT] = sizedescr
         return sizedescr
diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -135,10 +135,9 @@
         except KeyError:
             d = {}
             self.delayed_zero_setfields[result] = d
-        for fielddescr in descr.fielddescrs:
-            if fielddescr.is_pointer_field():
-                ofs = self.cpu.unpack_fielddescr(fielddescr)
-                d[ofs] = None
+        for fielddescr in descr.gc_fielddescrs:
+            ofs = self.cpu.unpack_fielddescr(fielddescr)
+            d[ofs] = None
 
     def consider_setfield_gc(self, op):
         offset = self.cpu.unpack_fielddescr(op.getdescr())
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,8 +19,8 @@
     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.fielddescrs == []
-    assert len(descr_s.fielddescrs) == 2
+    assert descr_t.gc_fielddescrs == []
+    assert len(descr_s.gc_fielddescrs) == 1
     assert descr_s == get_size_descr(c0, S)
     assert descr_s != get_size_descr(c1, S)
     #
@@ -31,7 +31,7 @@
     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 len(descr_struct.fielddescrs) == 2
+    assert len(descr_struct.gc_fielddescrs) == 2
 
 def test_get_size_descr_immut():
     S = lltype.GcStruct('S', hints={'immutable': True})
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -154,7 +154,7 @@
     def setup_method(self, meth):
         class FakeCPU(BaseFakeCPU):
             def sizeof(self, STRUCT):
-                return SizeDescrWithVTable(102, fielddescrs=[])
+                return SizeDescrWithVTable(102, gc_fielddescrs=[])
         self.cpu = FakeCPU()
         self.gc_ll_descr = GcLLDescr_boehm(None, None, None)
 
@@ -291,7 +291,7 @@
         #
         class FakeCPU(BaseFakeCPU):
             def sizeof(self, STRUCT):
-                descr = SizeDescrWithVTable(104, fielddescrs=[])
+                descr = SizeDescrWithVTable(104, gc_fielddescrs=[])
                 descr.tid = 9315
                 return descr
         self.cpu = FakeCPU()
@@ -324,7 +324,7 @@
             setfield_gc(p1, 5678, descr=tiddescr)
             p2 = int_add(p1, %(tdescr.size)d)
             setfield_gc(p2, 1234, descr=tiddescr)
-            zero_ptr_field(p1, %(tdescr.fielddescrs[1].offset)s)
+            zero_ptr_field(p1, %(tdescr.gc_fielddescrs[0].offset)s)
             jump()
         """)
 
@@ -771,7 +771,7 @@
             [i0]
             p0 = call_malloc_nursery(%(tdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
-            zero_ptr_field(p0, %(tdescr.fielddescrs[1].offset)s)
+            zero_ptr_field(p0, %(tdescr.gc_fielddescrs[0].offset)s)
             p1 = call_malloc_nursery_varsize(1, 1, i0, \
                                 descr=strdescr)
             setfield_gc(p1, i0, descr=strlendescr)
@@ -792,7 +792,7 @@
             [p1]
             p0 = call_malloc_nursery(%(tdescr.size)d)
             setfield_gc(p0, 5678, descr=tiddescr)
-            zero_ptr_field(p0, %(tdescr.fielddescrs[1].offset)s)
+            zero_ptr_field(p0, %(tdescr.gc_fielddescrs[0].offset)s)
             label(p0, p1)
             cond_call_gc_wb(p0, descr=wbdescr)
             setfield_gc(p0, p1, descr=tzdescr)
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,7 +126,7 @@
     vtable = llmemory.cast_ptr_to_adr(vtable)
     return adr2int(vtable)
     
-def fielddescrs(gccache, STRUCT, res=None):
+def gc_fielddescrs(gccache, STRUCT, res=None):
     from rpython.jit.backend.llsupport import descr
 
     if res is None:
@@ -137,7 +137,7 @@
         if FIELD is lltype.Void:
             continue
         elif isinstance(FIELD, lltype.Struct):
-            fielddescrs(gccache, FIELD, res)
-        else:
+            gc_fielddescrs(gccache, FIELD, res)
+        elif isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
             res.append(descr.get_field_descr(gccache, STRUCT, name))
     return res


More information about the pypy-commit mailing list