[pypy-commit] pypy annotator: effectively define unaryop.UNARY_OPERATIONS in rpython.flowspace.operation

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


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

Log:	effectively define unaryop.UNARY_OPERATIONS in
	rpython.flowspace.operation

diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -5,6 +5,7 @@
 from __future__ import absolute_import
 
 from types import MethodType
+from rpython.flowspace.operation import op
 from rpython.annotator.model import (SomeObject, SomeInteger, SomeBool,
     SomeString, SomeChar, SomeList, SomeDict, SomeTuple, SomeImpossibleValue,
     SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeFloat, SomeIterator,
@@ -20,15 +21,8 @@
 def immutablevalue(x):
     return getbookkeeper().immutablevalue(x)
 
-UNARY_OPERATIONS = set(['len', 'bool', 'getattr', 'setattr', 'delattr',
-                        'simple_call', 'call_args', 'str', 'repr',
-                        'iter', 'next', 'invert', 'type', 'issubtype',
-                        'pos', 'neg', 'abs', 'hex', 'oct',
-                        'ord', 'int', 'float', 'long',
-                        'hash', 'id',    # <== not supported any more
-                        'getslice', 'setslice', 'delslice',
-                        'neg_ovf', 'abs_ovf', 'hint', 'unicode', 'unichr'])
-
+UNARY_OPERATIONS = set([oper.opname for oper in op.__dict__.values()
+                        if oper.dispatch == 1])
 for opname in UNARY_OPERATIONS:
     missing_operation(SomeObject, opname)
 
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -54,6 +54,8 @@
     __metaclass__ = HLOperationMeta
     pure = False
     can_overflow = False
+    dispatch = None  # number of arguments to dispatch on
+                     # (None means special handling)
 
     def __init__(self, *args):
         self.args = list(args)
@@ -131,7 +133,7 @@
         return ovf
 
 
-def add_operator(name, arity, pyfunc=None, pure=False, ovf=False):
+def add_operator(name, arity, dispatch=None, pyfunc=None, pure=False, ovf=False):
     operator_func = getattr(operator, name, None)
     if ovf:
         assert pure
@@ -141,7 +143,8 @@
     else:
         base_cls = HLOperation
     cls = HLOperationMeta(name, (base_cls,), {'opname': name, 'arity': arity,
-                                              'canraise': []})
+                                              'canraise': [],
+                                              'dispatch': dispatch})
     if pyfunc is not None:
         func2op[pyfunc] = cls
     if operator_func:
@@ -153,7 +156,7 @@
     if ovf:
         from rpython.rlib.rarithmetic import ovfcheck
         ovf_func = lambda *args: ovfcheck(cls.pyfunc(*args))
-        add_operator(name + '_ovf', arity, pyfunc=ovf_func)
+        add_operator(name + '_ovf', arity, dispatch, pyfunc=ovf_func)
         cls.ovf_variant = getattr(op, name + '_ovf')
 
 # ____________________________________________________________
@@ -261,35 +264,35 @@
 
 
 add_operator('is_', 2, pure=True)
-add_operator('id', 1, pyfunc=id)
-add_operator('type', 1, pyfunc=new_style_type, pure=True)
-add_operator('issubtype', 2, pyfunc=issubclass, pure=True)  # not for old-style classes
-add_operator('repr', 1, pyfunc=repr, pure=True)
-add_operator('str', 1, pyfunc=str, pure=True)
+add_operator('id', 1, dispatch=1, pyfunc=id)
+add_operator('type', 1, dispatch=1, pyfunc=new_style_type, pure=True)
+add_operator('issubtype', 2, dispatch=1, pyfunc=issubclass, pure=True)  # not for old-style classes
+add_operator('repr', 1, dispatch=1, pyfunc=repr, pure=True)
+add_operator('str', 1, dispatch=1, pyfunc=str, pure=True)
 add_operator('format', 2, pyfunc=unsupported)
-add_operator('len', 1, pyfunc=len, pure=True)
-add_operator('hash', 1, pyfunc=hash)
-add_operator('setattr', 3, pyfunc=setattr)
-add_operator('delattr', 2, pyfunc=delattr)
+add_operator('len', 1, dispatch=1, pyfunc=len, pure=True)
+add_operator('hash', 1, dispatch=1, pyfunc=hash)
+add_operator('setattr', 3, dispatch=1, pyfunc=setattr)
+add_operator('delattr', 2, dispatch=1, pyfunc=delattr)
 add_operator('getitem', 2, pure=True)
 add_operator('getitem_idx', 2, pure=True)
 add_operator('getitem_key', 2, pure=True)
 add_operator('getitem_idx_key', 2, pure=True)
 add_operator('setitem', 3)
 add_operator('delitem', 2)
-add_operator('getslice', 3, pyfunc=do_getslice, pure=True)
-add_operator('setslice', 4, pyfunc=do_setslice)
-add_operator('delslice', 3, pyfunc=do_delslice)
+add_operator('getslice', 3, dispatch=1, pyfunc=do_getslice, pure=True)
+add_operator('setslice', 4, dispatch=1, pyfunc=do_setslice)
+add_operator('delslice', 3, dispatch=1, pyfunc=do_delslice)
 add_operator('trunc', 1, pyfunc=unsupported)
-add_operator('pos', 1, pure=True)
-add_operator('neg', 1, pure=True, ovf=True)
-add_operator('bool', 1, pyfunc=bool, pure=True)
+add_operator('pos', 1, dispatch=1, pure=True)
+add_operator('neg', 1, dispatch=1, pure=True, ovf=True)
+add_operator('bool', 1, dispatch=1, pyfunc=bool, pure=True)
 op.is_true = op.nonzero = op.bool  # for llinterp
-add_operator('abs', 1, pyfunc=abs, pure=True, ovf=True)
-add_operator('hex', 1, pyfunc=hex, pure=True)
-add_operator('oct', 1, pyfunc=oct, pure=True)
-add_operator('ord', 1, pyfunc=ord, pure=True)
-add_operator('invert', 1, pure=True)
+add_operator('abs', 1, dispatch=1, pyfunc=abs, pure=True, ovf=True)
+add_operator('hex', 1, dispatch=1, pyfunc=hex, pure=True)
+add_operator('oct', 1, dispatch=1, pyfunc=oct, pure=True)
+add_operator('ord', 1, dispatch=1, pyfunc=ord, pure=True)
+add_operator('invert', 1, dispatch=1, pure=True)
 add_operator('add', 2, pure=True, ovf=True)
 add_operator('sub', 2, pure=True, ovf=True)
 add_operator('mul', 2, pure=True, ovf=True)
@@ -303,10 +306,10 @@
 add_operator('and_', 2, pure=True)
 add_operator('or_', 2, pure=True)
 add_operator('xor', 2, pure=True)
-add_operator('int', 1, pyfunc=do_int, pure=True)
+add_operator('int', 1, dispatch=1, pyfunc=do_int, pure=True)
 add_operator('index', 1, pyfunc=do_index, pure=True)
-add_operator('float', 1, pyfunc=do_float, pure=True)
-add_operator('long', 1, pyfunc=do_long, pure=True)
+add_operator('float', 1, dispatch=1, pyfunc=do_float, pure=True)
+add_operator('long', 1, dispatch=1, pyfunc=do_long, pure=True)
 add_operator('inplace_add', 2, pyfunc=inplace_add)
 add_operator('inplace_sub', 2, pyfunc=inplace_sub)
 add_operator('inplace_mul', 2, pyfunc=inplace_mul)
@@ -339,7 +342,7 @@
 add_operator('newtuple', None, pure=True, pyfunc=lambda *args:args)
 add_operator('newlist', None)
 add_operator('newslice', 3)
-add_operator('hint', None)
+add_operator('hint', None, dispatch=1)
 
 
 class Pow(PureOperation):
@@ -358,6 +361,7 @@
 class Iter(HLOperation):
     opname = 'iter'
     arity = 1
+    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(iter)
@@ -372,6 +376,7 @@
 class Next(HLOperation):
     opname = 'next'
     arity = 1
+    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(next)
@@ -396,6 +401,7 @@
 class GetAttr(HLOperation):
     opname = 'getattr'
     arity = 2
+    dispatch = 1
     can_overflow = False
     canraise = []
     pyfunc = staticmethod(getattr)
@@ -438,9 +444,11 @@
 
 class SimpleCall(CallOp):
     opname = 'simple_call'
+    dispatch = 1
 
 class CallArgs(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