[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