Author: Armin Rigo <[email protected]>
Branch: stm-thread-2
Changeset: r60176:ffd1aad64887
Date: 2013-01-18 16:04 +0100
http://bitbucket.org/pypy/pypy/changeset/ffd1aad64887/

Log:    Do not turn inevitable either on raw_malloc, in addition to
        malloc(flavor='raw').

diff --git a/pypy/translator/backendopt/writeanalyze.py 
b/pypy/translator/backendopt/writeanalyze.py
--- a/pypy/translator/backendopt/writeanalyze.py
+++ b/pypy/translator/backendopt/writeanalyze.py
@@ -82,7 +82,7 @@
             for op in block.operations:
                 self.allvariables.add(op.result)
                 if (op.opname == 'malloc' or op.opname == 'malloc_varsize'
-                    or op.opname == 'new'):
+                    or op.opname == 'new' or op.opname == 'raw_malloc'):
                     continue
                 elif op.opname in ('cast_pointer', 'same_as'):
                     if self.is_fresh_malloc(op.args[0]):
diff --git a/pypy/translator/stm/inevitable.py 
b/pypy/translator/stm/inevitable.py
--- a/pypy/translator/stm/inevitable.py
+++ b/pypy/translator/stm/inevitable.py
@@ -71,6 +71,11 @@
         # If the transaction is splitted, the remaining parts of the
         # CFG will always run in inevitable mode anyways.
         return not fresh_mallocs.is_fresh_malloc(op.args[0])
+    #
+    if op.opname == 'raw_malloc':
+        return False # XXX: Produces memory leaks on aborts
+    if op.opname == 'raw_free':
+        return not fresh_mallocs.is_fresh_malloc(op.args[0])
 
     #
     # Function calls
diff --git a/pypy/translator/stm/test/test_inevitable.py 
b/pypy/translator/stm/test/test_inevitable.py
--- a/pypy/translator/stm/test/test_inevitable.py
+++ b/pypy/translator/stm/test/test_inevitable.py
@@ -42,13 +42,13 @@
 
     def test_unsupported_op(self):
         X = lltype.Struct('X', ('foo', lltype.Signed))
+        addr = llmemory.raw_malloc(llmemory.sizeof(X))
 
         def f1():
-            addr = llmemory.raw_malloc(llmemory.sizeof(X))
             llmemory.raw_free(addr)
 
         res = self.interpret_inevitable(f1, [])
-        assert res == 'raw_malloc'
+        assert res == 'raw_free'
 
     def test_raw_getfield(self):
         X = lltype.Struct('X', ('foo', lltype.Signed))
@@ -105,7 +105,7 @@
         res = self.interpret_inevitable(f1, [])
         assert res is None
 
-    def test_raw_malloc(self):
+    def test_raw_malloc_1(self):
         X = lltype.Struct('X', ('foo', lltype.Signed))
 
         def f1():
@@ -117,6 +117,18 @@
         assert 0, """we do not turn inevitable before
         raw-mallocs which causes leaks on aborts"""
 
+    def test_raw_malloc_2(self):
+        X = lltype.Struct('X', ('foo', lltype.Signed))
+
+        def f1():
+            addr = llmemory.raw_malloc(llmemory.sizeof(X))
+            llmemory.raw_free(addr)
+
+        res = self.interpret_inevitable(f1, [])
+        assert res is None
+        assert 0, """we do not turn inevitable before
+        raw-mallocs which causes leaks on aborts"""
+
     def test_unknown_raw_free(self):
         X = lltype.Struct('X', ('foo', lltype.Signed))
         def f2(p):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to