Author: Ronan Lamy <[email protected]>
Branch: less-stringly-ops
Changeset: r67647:e7fe7dd9a842
Date: 2013-10-19 20:20 +0100
http://bitbucket.org/pypy/pypy/changeset/e7fe7dd9a842/
Log: create OverflowingOp
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -53,6 +53,7 @@
class HLOperation(SpaceOperation):
__metaclass__ = HLOperationMeta
pure = False
+ can_overflow = False
def __init__(self, *args):
self.args = list(args)
@@ -116,12 +117,25 @@
# store operation with variable result instead
pass
+class OverflowingOperation(PureOperation):
+ can_overflow = True
+ def ovfchecked(self):
+ ovf = self.ovf_variant(*self.args)
+ ovf.offset = self.offset
+ return ovf
+
def add_operator(name, arity, pyfunc=None, pure=False, ovf=False):
operator_func = getattr(operator, name, None)
- base_cls = PureOperation if pure else HLOperation
+ if ovf:
+ assert pure
+ base_cls = OverflowingOperation
+ elif pure:
+ base_cls = PureOperation
+ else:
+ base_cls = HLOperation
cls = HLOperationMeta(name, (base_cls,), {'opname': name, 'arity': arity,
- 'can_overflow': ovf, 'canraise': []})
+ 'canraise': []})
if pyfunc is not None:
func2op[pyfunc] = cls
if operator_func:
@@ -134,6 +148,7 @@
from rpython.rlib.rarithmetic import ovfcheck
ovf_func = lambda *args: ovfcheck(cls.pyfunc(*args))
add_operator(name + '_ovf', arity, pyfunc=ovf_func)
+ cls.ovf_variant = getattr(op, name + '_ovf')
# ____________________________________________________________
diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py
--- a/rpython/translator/simplify.py
+++ b/rpython/translator/simplify.py
@@ -6,9 +6,9 @@
"""
import py
-from rpython.flowspace import operation
from rpython.flowspace.model import (SpaceOperation, Variable, Constant,
c_last_exception, checkgraph, mkentrymap)
+from rpython.flowspace.operation import OverflowingOperation
from rpython.rlib import rarithmetic
from rpython.translator import unsimplify
from rpython.translator.backendopt import ssa
@@ -92,13 +92,6 @@
"""
covf = Constant(rarithmetic.ovfcheck)
- def check_syntax(opname):
- oper = getattr(operation.op, opname + "_ovf")
- exlis = oper.canraise
- if OverflowError not in exlis:
- raise Exception("ovfcheck in %s: Operation %s has no"
- " overflow variant" % (graph.name, opname))
-
for block in graph.iterblocks():
for i in range(len(block.operations)-1, -1, -1):
op = block.operations[i]
@@ -120,11 +113,14 @@
join_blocks(graph) # merge the two blocks together
transform_ovfcheck(graph) # ...and try again
return
- op1 = block.operations[i-1]
- check_syntax(op1.opname)
- op1.opname += '_ovf'
+ op1 = block.operations[i - 1]
+ if not isinstance(op1, OverflowingOperation):
+ raise Exception("ovfcheck in %s: Operation %s has no "
+ "overflow variant" % (graph.name,
op1.opname))
+ op1_ovf = op1.ovfchecked()
+ block.operations[i - 1] = op1_ovf
del block.operations[i]
- block.renamevariables({op.result: op1.result})
+ block.renamevariables({op.result: op1_ovf.result})
def simplify_exceptions(graph):
"""The exception handling caused by non-implicit exceptions
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit