[pypy-commit] pypy stmgc-c7: in-progress

arigo noreply at buildbot.pypy.org
Mon Jun 30 13:04:54 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r72283:ee9beb2782fe
Date: 2014-06-30 13:04 +0200
http://bitbucket.org/pypy/pypy/changeset/ee9beb2782fe/

Log:	in-progress

diff --git a/rpython/memory/gc/stmgc.py b/rpython/memory/gc/stmgc.py
--- a/rpython/memory/gc/stmgc.py
+++ b/rpython/memory/gc/stmgc.py
@@ -43,6 +43,14 @@
     def get_type_id(self, obj):
         return llop.stm_addr_get_tid(llgroup.HALFWORD, obj)
 
+    def get_card_base_itemsize(self, obj, offset_itemsize):
+        typeid = self.get_type_id(obj)
+        assert self.is_varsize(typeid)
+        ofs = self.fixed_size(typeid)
+        isz = self.varsize_item_sizes(typeid)
+        offset_itemsize[0] = rffi.cast(lltype.Unsigned, ofs)
+        offset_itemsize[1] = rffi.cast(lltype.Unsigned, isz)
+
     def setup(self):
         # Hack: MovingGCBase.setup() sets up stuff related to id(), which
         # we implement differently anyway.  So directly call GCBase.setup().
diff --git a/rpython/memory/gctransform/stmframework.py b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -32,6 +32,16 @@
             getfn(pypy_stmcb_trace, [llannotation.SomeAddress(),
                                      llannotation.SomePtr(GCClass.VISIT_FPTR)],
                   annmodel.s_None))
+        #
+        def pypy_stmcb_get_card_base_itemsize(obj, offset_itemsize):
+            gc.get_card_base_itemsize(obj, offset_itemsize)
+        pypy_stmcb_get_card_base_itemsize.c_name = (
+            "pypy_stmcb_get_card_base_itemsize")
+        self.autoregister_ptrs.append(
+            getfn(pypy_stmcb_get_card_base_itemsize,
+                  [llannotation.SomeAddress(),
+                   llannotation.SomePtr(rffi.CArrayPtr(lltype.Unsigned))],
+                  annmodel.s_None))
 
     def build_root_walker(self):
         return StmRootWalker(self)
@@ -87,6 +97,11 @@
                 if var_needsgc(hop.spaceop.args[-1]):
                     raise Exception("in stm_ignored block: write of a gc "
                                     "pointer")
+            elif self._set_into_gc_array_part(hop.spaceop) is not None:
+                self.write_barrier_from_array_calls += 1
+                v_index = self._set_into_gc_array_part(hop.spaceop)
+                assert v_index.concretetype == lltype.Signed
+                hop.genop("stm_write", [v_struct, v_index])
             else:
                 self.write_barrier_calls += 1
                 hop.genop("stm_write", [v_struct])
diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -62,7 +62,11 @@
     assert isinstance(op.args[0].concretetype, lltype.Ptr)
     assert op.args[0].concretetype.TO._gckind == 'gc'
     arg0 = funcgen.expr(op.args[0])
-    return 'stm_write((object_t *)%s);' % (arg0,)
+    if len(op.args) == 1:
+        return 'stm_write((object_t *)%s);' % (arg0,)
+    else:
+        arg1 = funcgen.expr(op.args[1])
+        return 'stm_write_card((object_t *)%s, %s);' % (arg0, arg1)
 
 def stm_can_move(funcgen, op):
     arg0 = funcgen.expr(op.args[0])
diff --git a/rpython/translator/stm/src_stm/stmgcintf.c b/rpython/translator/stm/src_stm/stmgcintf.c
--- a/rpython/translator/stm/src_stm/stmgcintf.c
+++ b/rpython/translator/stm/src_stm/stmgcintf.c
@@ -10,6 +10,7 @@
 __thread uintptr_t pypy_stm_nursery_low_fill_mark_saved;
 
 extern Signed pypy_stmcb_size_rounded_up(void*);
+extern void pypy_stmcb_get_card_base_itemsize(void*, uintptr_t[]);
 extern void pypy_stmcb_trace(void*, void(*)(void*));
 
 inline ssize_t stmcb_size_rounded_up(struct object_s *obj) {
@@ -19,6 +20,11 @@
     return result;
 }
 
+inline void stmcb_get_card_base_itemsize(struct object_s *obj,
+                                         uintptr_t offset_itemsize[2]) {
+    pypy_stmcb_get_card_base_itemsize(obj, offset_itemsize);
+}
+
 inline void stmcb_trace(struct object_s *obj, void visit(object_t **)) {
     pypy_stmcb_trace(obj, (void(*)(void*))visit);
 }
diff --git a/rpython/translator/stm/test/test_ztranslated.py b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -451,6 +451,20 @@
         data = cbuilder.cmdexec('')
         assert 'did not crash 84\n' in data
 
+    def test_stm_write_card(self):
+        lst = [0] * 100
+        def main(argv):
+            lst[42] = 43
+            print 'did not crash', lst[42]
+            return 0
+
+        t, cbuilder = self.compile(main)
+        first_op = t.graphs[0].startblock.operations[0]
+        assert first_op.opnames ==  opnames[0] == 'stm_write'
+        assert first_op.args[1].value == 42
+        data = cbuilder.cmdexec('')
+        assert 'did not crash 43\n' in data
+
     def test_float_inf_nan_in_struct(self):
         mylist = [float("inf"), float("-inf"), float("nan")]
         def main(argv):


More information about the pypy-commit mailing list