[pypy-commit] pypy annotator: Don't use unaryop.UNARY_OPERATIONS in annrpython.py

rlamy noreply at buildbot.pypy.org
Sat Dec 14 12:47:50 CET 2013


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: annotator
Changeset: r68434:d35c47e702b3
Date: 2013-12-14 02:37 +0100
http://bitbucket.org/pypy/pypy/changeset/d35c47e702b3/

Log:	Don't use unaryop.UNARY_OPERATIONS in annrpython.py

diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -9,7 +9,7 @@
 from rpython.flowspace.model import (Variable, Constant, FunctionGraph,
                                       c_last_exception, checkgraph)
 from rpython.translator import simplify, transform
-from rpython.annotator import model as annmodel, signature, unaryop, binaryop
+from rpython.annotator import model as annmodel, signature, binaryop
 from rpython.annotator.bookkeeper import Bookkeeper
 
 import py
@@ -460,7 +460,7 @@
                 arg2 = self.binding(op.args[1])
                 binop = getattr(pair(arg1, arg2), op.opname, None)
                 can_only_throw = annmodel.read_can_only_throw(binop, arg1, arg2)
-            elif op.opname in unaryop.UNARY_OPERATIONS:
+            elif op.dispatch == 1:
                 arg1 = self.binding(op.args[0])
                 opname = op.opname
                 if opname == 'contains': opname = 'op_contains'
@@ -625,16 +625,6 @@
         return self.bookkeeper.newdict()
 
 
-def _register_unary():
-    d = {}
-    for opname in unaryop.UNARY_OPERATIONS:
-        fnname = 'consider_op_' + opname
-        exec py.code.Source("""
-def consider_op_%s(self, arg, *args):
-    return arg.%s(*args)
-""" % (opname, opname)).compile() in globals(), d
-        setattr(RPythonAnnotator, fnname, d[fnname])
-
 def _register_binary():
     d = {}
     for opname in binaryop.BINARY_OPERATIONS:
@@ -646,7 +636,6 @@
         setattr(RPythonAnnotator, fnname, d[fnname])
 
 # register simple operations handling
-_register_unary()
 _register_binary()
 
 
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -132,9 +132,19 @@
         ovf.offset = self.offset
         return ovf
 
+class SingleDispatchMixin(object):
+    dispatch = 1
+    def consider(self, annotator, arg, *other_args):
+        impl = getattr(arg, self.opname)
+        return impl(*other_args)
+
 
 def add_operator(name, arity, dispatch=None, pyfunc=None, pure=False, ovf=False):
     operator_func = getattr(operator, name, None)
+    if dispatch == 1:
+        bases = [SingleDispatchMixin]
+    else:
+        bases = []
     if ovf:
         assert pure
         base_cls = OverflowingOperation
@@ -142,7 +152,8 @@
         base_cls = PureOperation
     else:
         base_cls = HLOperation
-    cls = HLOperationMeta(name, (base_cls,), {'opname': name, 'arity': arity,
+    bases.append(base_cls)
+    cls = HLOperationMeta(name, tuple(bases), {'opname': name, 'arity': arity,
                                               'canraise': [],
                                               'dispatch': dispatch})
     if pyfunc is not None:
@@ -358,10 +369,9 @@
         self.offset = -1
 
 
-class Iter(HLOperation):
+class Iter(SingleDispatchMixin, HLOperation):
     opname = 'iter'
     arity = 1
-    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(iter)
@@ -373,10 +383,9 @@
             if isinstance(iterable, unrolling_iterable):
                 return const(iterable.get_unroller())
 
-class Next(HLOperation):
+class Next(SingleDispatchMixin, HLOperation):
     opname = 'next'
     arity = 1
-    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(next)
@@ -398,10 +407,9 @@
         frame.guessexception([StopIteration, RuntimeError], force=True)
         return w_item
 
-class GetAttr(HLOperation):
+class GetAttr(SingleDispatchMixin, HLOperation):
     opname = 'getattr'
     arity = 2
-    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(getattr)
@@ -442,13 +450,11 @@
         # *any* exception for non-builtins
         return [Exception]
 
-class SimpleCall(CallOp):
+class SimpleCall(SingleDispatchMixin, CallOp):
     opname = 'simple_call'
-    dispatch = 1
 
-class CallArgs(CallOp):
+class CallArgs(SingleDispatchMixin, CallOp):
     opname = 'call_args'
-    dispatch = 1
 
 # Other functions that get directly translated to SpaceOperators
 func2op[type] = op.type


More information about the pypy-commit mailing list