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