Author: Armin Rigo <ar...@tunes.org> Branch: stm Changeset: r48709:a45743e6ee4e Date: 2011-11-03 18:54 +0100 http://bitbucket.org/pypy/pypy/changeset/a45743e6ee4e/
Log: Test and fix. diff --git a/pypy/translator/stm/funcgen.py b/pypy/translator/stm/funcgen.py --- a/pypy/translator/stm/funcgen.py +++ b/pypy/translator/stm/funcgen.py @@ -102,7 +102,15 @@ def stm_transaction_boundary(funcgen, op): assert funcgen.exception_policy == 'stm' - return 'STM_TRANSACTION_BOUNDARY();' + lines = ['STM_TRANSACTION_BOUNDARY();'] + TMPVAR = 'ty_%s' + for v in op.args: + tmpname = TMPVAR % v.name + cdeclname = cdecl(funcgen.lltypename(v), 'volatile ' + tmpname) + realname = funcgen.expr(v) + lines.insert(0, '%s = %s;' % (cdeclname, realname)) + lines.append('%s = %s;' % (realname, tmpname)) + return '{\n\t' + '\n\t'.join(lines) + '\n}' def stm_try_inevitable(funcgen, op): info = op.args[0].value diff --git a/pypy/translator/stm/test/test_transform.py b/pypy/translator/stm/test/test_transform.py --- a/pypy/translator/stm/test/test_transform.py +++ b/pypy/translator/stm/test/test_transform.py @@ -175,3 +175,21 @@ return 0 t, cbuilder = self.compile(simplefunc) cbuilder.cmdexec('') + + def test_transaction_boundary_3(self): + def simplefunc(argv): + s1 = argv[0] + debug_print('STEP1:', len(s1)) + rstm.transaction_boundary() + rstm.transaction_boundary() + rstm.transaction_boundary() + debug_print('STEP2:', len(s1)) + return 0 + t, cbuilder = self.compile(simplefunc) + data, err = cbuilder.cmdexec('', err=True) + lines = err.splitlines() + steps = [(line[:6], line[6:]) + for line in lines if line.startswith('STEP')] + steps = zip(*steps) + assert steps[0] == ('STEP1:', 'STEP2:') + assert steps[1][0] == steps[1][1] diff --git a/pypy/translator/stm/transform.py b/pypy/translator/stm/transform.py --- a/pypy/translator/stm/transform.py +++ b/pypy/translator/stm/transform.py @@ -1,4 +1,4 @@ -from pypy.objspace.flow.model import SpaceOperation, Constant +from pypy.objspace.flow.model import SpaceOperation, Constant, Variable from pypy.objspace.flow.model import Block, Link, checkgraph from pypy.annotation import model as annmodel from pypy.translator.stm import _rffi_stm @@ -41,7 +41,9 @@ if block.operations == (): return newoperations = [] - for op in block.operations: + self.current_block = block + for i, op in enumerate(block.operations): + self.current_op_index = i try: meth = getattr(self, 'stt_' + op.opname) except AttributeError: @@ -60,6 +62,7 @@ else: assert res is None block.operations = newoperations + self.current_block = None def transform_graph(self, graph): for block in graph.iterblocks(): @@ -128,7 +131,20 @@ def stt_stm_transaction_boundary(self, newoperations, op): self.seen_transaction_boundary = True - return True + v_result = op.result + # record in op.args the list of variables that are alive across + # this call + block = self.current_block + vars = set() + for op in block.operations[:self.current_op_index:-1]: + vars.discard(op.result) + vars.update(op.args) + for link in block.exits: + vars.update(link.args) + vars.update(link.getextravars()) + livevars = [v for v in vars if isinstance(v, Variable)] + newop = SpaceOperation('stm_transaction_boundary', livevars, v_result) + newoperations.append(newop) def stt_malloc(self, newoperations, op): flags = op.args[1].value _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit