Author: Ronan Lamy <ronan.l...@gmail.com> Branch: var-in-Some Changeset: r71573:7c1072611e34 Date: 2014-05-19 00:32 +0100 http://bitbucket.org/pypy/pypy/changeset/7c1072611e34/
Log: implement double dispatch in consider_op() diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py --- a/rpython/flowspace/operation.py +++ b/rpython/flowspace/operation.py @@ -7,7 +7,7 @@ import operator import sys import types -from rpython.tool.pairtype import pair +from rpython.tool.pairtype import pair, DoubleDispatchRegistry from rpython.rlib.unroll import unrolling_iterable, _unroller from rpython.tool.sourcetools import compile2 from rpython.flowspace.model import (Constant, WrapException, const, Variable, @@ -54,13 +54,10 @@ type.__init__(cls, name, bases, attrdict) if hasattr(cls, 'opname'): setattr(op, cls.opname, cls) - cls._registry = {} - - def register(cls, Some_cls): - def decorator(func): - cls._registry[Some_cls] = func - return func - return decorator + if cls.dispatch == 1: + cls._registry = {} + elif cls.dispatch == 2: + cls._registry = DoubleDispatchRegistry() class HLOperation(SpaceOperation): @@ -152,6 +149,13 @@ dispatch = 1 @classmethod + def register(cls, Some_cls): + def decorator(func): + cls._registry[Some_cls] = func + return func + return decorator + + @classmethod def _dispatch(cls, Some_cls): for c in Some_cls.__mro__: try: @@ -185,16 +189,26 @@ dispatch = 2 @classmethod + def register(cls, Some1, Some2): + def decorator(func): + cls._registry[Some1, Some2] = func + return func + return decorator + + @classmethod def get_specialization(cls, s_arg1, s_arg2, *_ignored): - impl = getattr(pair(s_arg1, s_arg2), cls.opname) + try: + impl = getattr(pair(s_arg1, s_arg2), cls.opname) - def specialized(arg1, arg2, *other_args): - return impl(*[x.ann for x in other_args]) - try: - specialized.can_only_throw = impl.can_only_throw + def specialized(arg1, arg2, *other_args): + return impl(*[x.ann for x in other_args]) + try: + specialized.can_only_throw = impl.can_only_throw + except AttributeError: + pass + return specialized except AttributeError: - pass - return specialized + return cls._registry[type(s_arg1), type(s_arg2)] def get_can_only_throw(self, annotator): args_s = [annotator.binding(v) for v in self.args] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit