[pypy-commit] pypy stm: Yay! targetdemo is fixed and seems to be working.

arigo noreply at buildbot.pypy.org
Thu Nov 3 19:15:41 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: stm
Changeset: r48710:b27ec3dc59d2
Date: 2011-11-03 19:15 +0100
http://bitbucket.org/pypy/pypy/changeset/b27ec3dc59d2/

Log:	Yay! targetdemo is fixed and seems to be working. Added a test for
	it.

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,15 +102,29 @@
 
 def stm_transaction_boundary(funcgen, op):
     assert funcgen.exception_policy == 'stm'
-    lines = ['STM_TRANSACTION_BOUNDARY();']
-    TMPVAR = 'ty_%s'
+    # make code looking like this:
+    #
+    #     stm_commit_transaction();
+    #     {
+    #         volatile long tmp_123 = l_123;
+    #         setjmp(jmpbuf);
+    #         l_123 = tmp_123;
+    #     }
+    #     stm_begin_transaction(&jmpbuf);
+    #
+    lines = ['\tsetjmp(jmpbuf);']
+    TMPVAR = 'tmp_%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}'
+        lines.insert(0, '\t%s = %s;' % (cdeclname, realname))
+        lines.append('\t%s = %s;' % (realname, tmpname))
+    lines.insert(0, '{')
+    lines.insert(0, 'stm_commit_transaction();')
+    lines.append('}')
+    lines.append('stm_begin_transaction(&jmpbuf);')
+    return '\n'.join(lines)
 
 def stm_try_inevitable(funcgen, op):
     info = op.args[0].value
diff --git a/pypy/translator/stm/src_stm/et.h b/pypy/translator/stm/src_stm/et.h
--- a/pypy/translator/stm/src_stm/et.h
+++ b/pypy/translator/stm/src_stm/et.h
@@ -47,11 +47,6 @@
 #define STM_DECLARE_VARIABLE()          ; jmp_buf jmpbuf
 #define STM_MAKE_INEVITABLE()           stm_try_inevitable_if(&jmpbuf  \
                                                         STM_EXPLAIN("return"))
-#define STM_TRANSACTION_BOUNDARY()      \
-       stm_commit_transaction();        \
-       setjmp(jmpbuf);                  \
-       stm_begin_transaction(&jmpbuf);
-
 
 // XXX little-endian only!
 #define STM_read_partial_word(T, base, offset)                          \
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
@@ -108,12 +108,13 @@
 
 # ____________________________________________________________
 
-class TestTransformSingleThread(StandaloneTests):
+class CompiledSTMTests(StandaloneTests):
 
     def compile(self, entry_point):
         from pypy.config.pypyoption import get_pypy_config
         self.config = get_pypy_config(translating=True)
         self.config.translation.stm = True
+        self.config.translation.gc = "none"
         #
         # Prevent the RaiseAnalyzer from just emitting "WARNING: Unknown
         # operation".  We want instead it to crash.
@@ -125,6 +126,9 @@
             del RaiseAnalyzer.fail_on_unknown_operation
         return res
 
+
+class TestTransformSingleThread(CompiledSTMTests):
+
     def test_no_pointer_operations(self):
         def simplefunc(argv):
             i = 0
diff --git a/pypy/translator/stm/test/test_ztranslated.py b/pypy/translator/stm/test/test_ztranslated.py
new file mode 100644
--- /dev/null
+++ b/pypy/translator/stm/test/test_ztranslated.py
@@ -0,0 +1,11 @@
+from pypy.translator.stm.test.test_transform import CompiledSTMTests
+from pypy.translator.stm.test import targetdemo
+
+
+class TestSTMTranslated(CompiledSTMTests):
+
+    def test_hello_world(self):
+        t, cbuilder = self.compile(targetdemo.entry_point)
+        data = cbuilder.cmdexec('')
+        assert 'done sleeping.' in data
+        assert 'check ok!' in data


More information about the pypy-commit mailing list