Author: Remi Meier <remi.me...@inf.ethz.ch>
Branch: stmgc-c7
Changeset: r71370:cd438825f621
Date: 2014-05-07 14:06 +0200
http://bitbucket.org/pypy/pypy/changeset/cd438825f621/

Log:    do a pseudo-allocation of WORD bytes when there is no other (checks
        for safe-points)

diff --git a/rpython/jit/backend/llsupport/stmrewrite.py 
b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -1,13 +1,11 @@
 from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
-from rpython.jit.backend.llsupport.descr import (
-    CallDescr, FieldDescr, InteriorFieldDescr, ArrayDescr)
+from rpython.jit.backend.llsupport.descr import CallDescr, FieldDescr
 from rpython.jit.metainterp.resoperation import ResOperation, rop
-from rpython.jit.metainterp.history import BoxPtr, ConstPtr, ConstInt
+from rpython.jit.metainterp.history import BoxPtr, ConstInt
 from rpython.rlib.objectmodel import specialize
-from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.debug import (have_debug_prints, debug_start, debug_stop,
                                 debug_print)
-from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.backend.llsupport.symbolic import WORD
 
 
 class GcStmRewriterAssembler(GcRewriterAssembler):
@@ -121,8 +119,24 @@
             self.read_barrier_applied[v_ptr] = None
 
     def handle_should_break_transaction(self, op):
+        if not self.does_any_allocation:
+            # do a fake allocation since this is needed to check
+            # for requested safe-points:
+            self.does_any_allocation = True
+            self.emitting_an_operation_that_can_collect()
+
+            size = WORD
+            v_result = BoxPtr()
+            assert self._op_malloc_nursery is None # no ongoing allocation
+            malloc_op = ResOperation(rop.CALL_MALLOC_NURSERY,
+                              [ConstInt(size)], v_result)
+            self._op_malloc_nursery = malloc_op
+            self.newops.append(malloc_op)
+            self._previous_size = size
+            self._v_last_malloced_nursery = v_result
+            self.write_barrier_applied[v_result] = None
+
         self.newops.append(op)
-        #self.does_any_allocation = True
 
 
     def must_apply_write_barrier(self, val, v=None):
@@ -148,7 +162,6 @@
         debug_print("fallback for", op.repr())
 
     def maybe_handle_raw_accesses(self, op):
-        from rpython.jit.backend.llsupport.descr import FieldDescr
         descr = op.getdescr()
         assert isinstance(descr, FieldDescr)
         if descr.stm_dont_track_raw_accesses:
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py 
b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -1237,6 +1237,7 @@
         jump(i1)
         """, """
         []
+        p99 = call_malloc_nursery(8)
         i1 = stm_should_break_transaction()
         jump(i1)
         """)
@@ -1263,6 +1264,7 @@
         jump(i1, i2)
         """, """
         []
+        p99 = call_malloc_nursery(8)
         i1 = stm_should_break_transaction()
         i2 = stm_should_break_transaction()
         jump(i1, i2)
@@ -1280,6 +1282,7 @@
         p2 = call_malloc_nursery(%(tdescr.size)d)
         setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
         label()
+        p99 = call_malloc_nursery(8)
         i1 = stm_should_break_transaction()
         jump(i1)
         """)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to