Author: Armin Rigo <ar...@tunes.org> Branch: stm Changeset: r47626:c5b1f9aa7294 Date: 2011-09-27 15:01 +0200 http://bitbucket.org/pypy/pypy/changeset/c5b1f9aa7294/
Log: The compiled tests work out of the box, but I would be happy to work a bit more and avoid that a single stm_getfield() gets turned into a list of operations. diff --git a/pypy/translator/stm/test/test_rstm.py b/pypy/translator/stm/test/test_rstm.py --- a/pypy/translator/stm/test/test_rstm.py +++ b/pypy/translator/stm/test/test_rstm.py @@ -1,50 +1,94 @@ +import py from pypy.translator.stm._rffi_stm import * from pypy.translator.stm.rstm import * from pypy.rpython.annlowlevel import llhelper +A = lltype.Struct('A', ('x', lltype.Signed), ('y', lltype.Signed)) + +def callback1(a): + a = rffi.cast(lltype.Ptr(A), a) + assert a.x == -611 + assert stm_getfield(a, 'x') == -611 + p = lltype.direct_fieldptr(a, 'x') + p = rffi.cast(rffi.VOIDPP, p) + stm_write_word(p, rffi.cast(rffi.VOIDP, 42 * a.y)) + assert stm_getfield(a, 'x') == 42 * a.y + assert a.x == -611 # xxx still the old value when reading non-transact. + if a.y < 10: + a.y += 1 # non-transactionally + abort_and_retry() + return lltype.nullptr(rffi.VOIDP.TO) + def test_stm_getfield(): - A = lltype.Struct('A', ('x', lltype.Signed), ('y', lltype.Signed)) - a = lltype.malloc(A, immortal=True, flavor='raw') + a = lltype.malloc(A, flavor='raw') a.x = -611 a.y = 0 - def callback1(x): - assert a.x == -611 - assert stm_getfield(a, 'x') == -611 - p = lltype.direct_fieldptr(a, 'x') - p = rffi.cast(rffi.VOIDPP, p) - stm_write_word(p, rffi.cast(rffi.VOIDP, 42 * a.y)) - assert stm_getfield(a, 'x') == 42 * a.y - assert a.x == -611 # xxx still the old value when reading non-transact. - if a.y < 10: - a.y += 1 # non-transactionally - abort_and_retry() - else: - return lltype.nullptr(rffi.VOIDP.TO) descriptor_init() perform_transaction(llhelper(CALLBACK, callback1), - lltype.nullptr(rffi.VOIDP.TO)) + rffi.cast(rffi.VOIDP, a)) descriptor_done() assert a.x == 420 + lltype.free(a, flavor='raw') + +def callback2(a): + a = rffi.cast(lltype.Ptr(A), a) + assert a.x == -611 + assert stm_getfield(a, 'x') == -611 + stm_setfield(a, 'x', 42 * a.y) + assert stm_getfield(a, 'x') == 42 * a.y + assert a.x == -611 # xxx still the old value when reading non-transact. + if a.y < 10: + a.y += 1 # non-transactionally + abort_and_retry() + return lltype.nullptr(rffi.VOIDP.TO) def test_stm_setfield(): - A = lltype.Struct('A', ('x', lltype.Signed), ('y', lltype.Signed)) - a = lltype.malloc(A, immortal=True, flavor='raw') + a = lltype.malloc(A, flavor='raw') a.x = -611 a.y = 0 - def callback1(x): - assert a.x == -611 - assert stm_getfield(a, 'x') == -611 - stm_setfield(a, 'x', 42 * a.y) - assert stm_getfield(a, 'x') == 42 * a.y - assert a.x == -611 # xxx still the old value when reading non-transact. - if a.y < 10: - a.y += 1 # non-transactionally - abort_and_retry() - else: - return lltype.nullptr(rffi.VOIDP.TO) descriptor_init() - perform_transaction(llhelper(CALLBACK, callback1), - lltype.nullptr(rffi.VOIDP.TO)) + perform_transaction(llhelper(CALLBACK, callback2), + rffi.cast(rffi.VOIDP, a)) descriptor_done() assert a.x == 420 + lltype.free(a, flavor='raw') + +# ____________________________________________________________ + +from pypy.translator.translator import TranslationContext +from pypy.annotation.listdef import s_list_of_strings +from pypy.translator.c.genc import CStandaloneBuilder + +class StmTests(object): + config = None + + def compile(self, entry_point): + t = TranslationContext(self.config) + t.buildannotator().build_types(entry_point, [s_list_of_strings]) + t.buildrtyper().specialize() + cbuilder = CStandaloneBuilder(t, entry_point, t.config) + cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) + cbuilder.compile() + return t, cbuilder + + +class TestRStm(StmTests): + + def test_compiled_stm_getfield(self): + def entry_point(argv): + test_stm_getfield() + print 'ok!' + return 0 + t, cbuilder = self.compile(entry_point) + data = cbuilder.cmdexec('') + assert data == 'ok!\n' + + def test_compiled_stm_setfield(self): + def entry_point(argv): + test_stm_setfield() + print 'ok!' + return 0 + t, cbuilder = self.compile(entry_point) + data = cbuilder.cmdexec('') + assert data == 'ok!\n' _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit