[pypy-svn] r64943 - in pypy/branch/pyjitpl5/pypy/translator: . test
arigo at codespeak.net
arigo at codespeak.net
Fri May 1 14:56:33 CEST 2009
Author: arigo
Date: Fri May 1 14:56:21 2009
New Revision: 64943
Modified:
pypy/branch/pyjitpl5/pypy/translator/test/test_unsimplify.py
pypy/branch/pyjitpl5/pypy/translator/unsimplify.py
Log:
Add a helper, unsimplify.call_final_function().
Modified: pypy/branch/pyjitpl5/pypy/translator/test/test_unsimplify.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/test/test_unsimplify.py (original)
+++ pypy/branch/pyjitpl5/pypy/translator/test/test_unsimplify.py Fri May 1 14:56:21 2009
@@ -1,12 +1,15 @@
+import os
from pypy.translator.translator import TranslationContext, graphof
-from pypy.translator.unsimplify import split_block
+from pypy.translator.unsimplify import split_block, call_final_function
from pypy.rpython.llinterp import LLInterpreter
from pypy.objspace.flow.model import checkgraph
+from pypy.rlib.objectmodel import we_are_translated
+from pypy.tool.udir import udir
-def translate(func, argtypes):
+def translate(func, argtypes, type_system="lltype"):
t = TranslationContext()
t.buildannotator().build_types(func, argtypes)
- t.buildrtyper().specialize()
+ t.buildrtyper(type_system=type_system).specialize()
return graphof(t, func), t
def test_split_blocks_simple():
@@ -66,3 +69,21 @@
result = interp.eval_graph(graph, [2])
assert result == 2
+def test_call_final_function():
+ tmpfile = str(udir.join('test_call_final_function'))
+ for type_system in ['lltype', 'ootype']:
+ def f(x):
+ return x * 6
+ def goodbye_world():
+ if we_are_translated():
+ fd = os.open(tmpfile, os.O_WRONLY | os.O_CREAT, 0)
+ os.close(fd)
+ graph, t = translate(f, [int], type_system)
+ call_final_function(t, goodbye_world)
+ #
+ if os.path.exists(tmpfile):
+ os.unlink(tmpfile)
+ interp = LLInterpreter(t.rtyper)
+ result = interp.eval_graph(graph, [7])
+ assert result == 42
+ assert os.path.isfile(tmpfile)
Modified: pypy/branch/pyjitpl5/pypy/translator/unsimplify.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/unsimplify.py (original)
+++ pypy/branch/pyjitpl5/pypy/translator/unsimplify.py Fri May 1 14:56:21 2009
@@ -154,3 +154,27 @@
break
if links_to_start_block:
insert_empty_startblock(None, graph)
+
+def call_final_function(translator, final_func):
+ """When the program finishes normally, call 'final_func()'."""
+ from pypy.annotation import model as annmodel
+ from pypy.rpython.lltypesystem import lltype
+ from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
+
+ annhelper = MixLevelHelperAnnotator(translator.rtyper)
+ c_final_func = annhelper.constfunc(final_func, [], annmodel.s_None)
+ annhelper.finish()
+
+ entry_point = translator.graphs[0]
+ v = copyvar(translator.annotator, entry_point.getreturnvar())
+ extrablock = Block([v])
+ v_none = varoftype(lltype.Void)
+ newop = SpaceOperation('direct_call', [c_final_func], v_none)
+ extrablock.operations = [newop]
+ extrablock.closeblock(Link([v], entry_point.returnblock))
+ for block in entry_point.iterblocks():
+ if block is not extrablock:
+ for link in block.exits:
+ if link.target is entry_point.returnblock:
+ link.target = extrablock
+ checkgraph(entry_point)
More information about the Pypy-commit
mailing list