[pypy-svn] r59068 - in pypy/dist/pypy/translator/backendopt: . test

arigo at codespeak.net arigo at codespeak.net
Mon Oct 13 13:45:05 CEST 2008


Author: arigo
Date: Mon Oct 13 13:45:05 2008
New Revision: 59068

Modified:
   pypy/dist/pypy/translator/backendopt/mallocv.py
   pypy/dist/pypy/translator/backendopt/test/test_mallocv.py
Log:
Test and fix.


Modified: pypy/dist/pypy/translator/backendopt/mallocv.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/mallocv.py	(original)
+++ pypy/dist/pypy/translator/backendopt/mallocv.py	Mon Oct 13 13:45:05 2008
@@ -399,7 +399,7 @@
             nodelist.append(RuntimeSpecNode(v, v.concretetype))
         trivialframe = VirtualFrame(block, 0, nodelist)
         spec = BlockSpecializer(self, v_result)
-        spec.initialize_renamings(trivialframe)
+        spec.initialize_renamings(trivialframe, keep_inputargs=True)
         self.pending_specializations.append(spec)
         self.pending_patch = (block, spec.specblock)
 
@@ -600,16 +600,22 @@
         self.v_expand_malloc = v_expand_malloc
         self.specblock = Block([])
 
-    def initialize_renamings(self, virtualframe):
+    def initialize_renamings(self, virtualframe, keep_inputargs=False):
         # we make a copy of the original 'virtualframe' because the
         # specialize_operations() will mutate some of its content.
         virtualframe = virtualframe.copy({})
         self.virtualframe = virtualframe
         self.nodes = virtualframe.get_nodes_in_use()
         self.renamings = {}    # {RuntimeSpecNode(): Variable()}
+        if keep_inputargs:
+            assert virtualframe.varlist == virtualframe.sourceblock.inputargs
         specinputargs = []
-        for rtnode in virtualframe.find_rt_nodes():
-            v = rtnode.newvar()
+        for i, rtnode in enumerate(virtualframe.find_rt_nodes()):
+            if keep_inputargs:
+                v = virtualframe.varlist[i]
+                assert v.concretetype == rtnode.TYPE
+            else:
+                v = rtnode.newvar()
             self.renamings[rtnode] = v
             specinputargs.append(v)
         self.specblock.inputargs = specinputargs

Modified: pypy/dist/pypy/translator/backendopt/test/test_mallocv.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_mallocv.py	(original)
+++ pypy/dist/pypy/translator/backendopt/test/test_mallocv.py	Mon Oct 13 13:45:05 2008
@@ -46,6 +46,7 @@
     def check(self, fn, signature, args, expected_result,
               expected_mallocs=0, expected_calls=0):
         t = TranslationContext()
+        self.translator = t
         t.buildannotator().build_types(fn, signature)
         t.buildrtyper(type_system=self.type_system).specialize()
         graph = graphof(t, fn)
@@ -478,6 +479,18 @@
             return a.n
         self.check(fn13, [int], [10], 4)
 
+    def test_preserve_annotations_on_graph(self):
+        class A:
+            pass
+        def fn14(n):
+            a = A()
+            a.n = n + 1
+            return a.n
+        graph = self.check(fn14, [int], [10], 11)
+        annotator = self.translator.annotator
+        assert annotator.binding(graph.getargs()[0]).knowntype is int
+        assert annotator.binding(graph.getreturnvar()).knowntype is int
+
 
 class TestLLTypeMallocRemoval(BaseMallocRemovalTest):
     type_system = 'lltype'



More information about the Pypy-commit mailing list