[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