[pypy-svn] r22752 - in pypy/dist/pypy/translator: backendopt c/test
ericvrp at codespeak.net
ericvrp at codespeak.net
Fri Jan 27 18:52:13 CET 2006
Author: ericvrp
Date: Fri Jan 27 18:52:11 2006
New Revision: 22752
Modified:
pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py
pypy/dist/pypy/translator/backendopt/support.py
pypy/dist/pypy/translator/c/test/test_backendoptimized.py
Log:
Added first working raising operation in rpython
Modified: pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py (original)
+++ pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py Fri Jan 27 18:52:11 2006
@@ -1,19 +1,29 @@
-from pypy.objspace.flow.model import Block, Constant, flatten
-from pypy.translator.backendopt.support import log, all_operations
-import pypy.rpython.raisingops
+from pypy.translator.backendopt.support import log, all_operations, annotate
+import pypy.rpython.raisingops.raisingops
log = log.raisingop2directcall
def raisingop2direct_call(translator):
"""search for operations that could raise an exception and change that
operation into a direct_call to a function from the raisingops directory.
- This function also needs to be annotated.
+ This function also needs to be annotated and specialized.
"""
+ seen = {}
for op in all_operations(translator):
s = op.opname
if not s.startswith('int_') and not s.startswith('uint_') and not s.startswith('float_'):
continue
if not s.endswith('_zer') and not s.endswith('_ovf') and not s.endswith('_val'):
continue
- log(s)
- op.args.insert(0, s)
+ func = getattr(pypy.rpython.raisingops.raisingops, s, None)
+ assert func, "exception raising operation %s was not found" % s
+ if s not in seen:
+ seen[s] = 0
+ log.info(s)
+ seen[s] += 1
+ op.args.insert(0, annotate(translator, func, op.result, op.args))
op.opname = 'direct_call'
+ for k, v in seen.iteritems():
+ log("%4dx %s" % (v, k))
+ if seen != {}:
+ translator.rtyper.specialize_more_blocks()
+ #translator.view()
Modified: pypy/dist/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/support.py (original)
+++ pypy/dist/pypy/translator/backendopt/support.py Fri Jan 27 18:52:11 2006
@@ -1,7 +1,8 @@
-# logging
-
import py
+from pypy.rpython.lltypesystem.lltype import functionptr, FuncType, typeOf
+from pypy.rpython.rmodel import inputconst
from pypy.tool.ansi_print import ansi_log
+
log = py.log.Producer("backendopt")
py.log.setconsumer("backendopt", ansi_log)
@@ -15,3 +16,10 @@
for block in graph.iterblocks():
for op in block.operations:
yield op
+
+def annotate(translator, func, result, args):
+ args = [arg.concretetype for arg in args]
+ graph = translator.rtyper.annotate_helper(func, args)
+ fptr = functionptr(FuncType(args, result.concretetype), func.func_name, graph=graph)
+ c = inputconst(typeOf(fptr), fptr)
+ return c
Modified: pypy/dist/pypy/translator/c/test/test_backendoptimized.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_backendoptimized.py (original)
+++ pypy/dist/pypy/translator/c/test/test_backendoptimized.py Fri Jan 27 18:52:11 2006
@@ -183,7 +183,6 @@
backend_optimizations(t, raisingop2direct_call_all=True)
def test_int_floordiv_zer(self):
- py.test.skip("WIP")
def f(x=int):
try:
y = 123 / x
More information about the Pypy-commit
mailing list