Author: Ronan Lamy <ronan.l...@gmail.com> Branch: less-stringly-ops Changeset: r66245:a8a1f2f496f1 Date: 2013-08-12 20:18 +0100 http://bitbucket.org/pypy/pypy/changeset/a8a1f2f496f1/
Log: Don't sugar isinstance in the first place diff --git a/rpython/flowspace/objspace.py b/rpython/flowspace/objspace.py --- a/rpython/flowspace/objspace.py +++ b/rpython/flowspace/objspace.py @@ -158,7 +158,8 @@ Returns an FSException object whose w_value is an instance of w_type. """ frame = self.frame - if frame.guessbool(self.isinstance(w_arg1, self.w_type)): + if frame.guessbool(self.call_function(const(isinstance), w_arg1, + self.w_type)): # this is for all cases of the form (Class, something) if frame.guessbool(self.is_(w_arg2, self.w_None)): # raise Type: we assume we have to instantiate Type diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py --- a/rpython/flowspace/operation.py +++ b/rpython/flowspace/operation.py @@ -211,7 +211,6 @@ add_operator('is_', 2, 'is', pure=True) add_operator('id', 1, 'id', pyfunc=id) add_operator('type', 1, 'type', pyfunc=new_style_type, pure=True) -add_operator('isinstance', 2, 'isinstance', pyfunc=isinstance, pure=True) add_operator('issubtype', 2, 'issubtype', pyfunc=issubclass, pure=True) # not for old-style classes add_operator('repr', 1, 'repr', pyfunc=repr, pure=True) add_operator('str', 1, 'str', pyfunc=str, pure=True) @@ -232,7 +231,7 @@ add_operator('neg', 1, 'neg', pure=True, ovf=True) add_operator('bool', 1, 'truth', pyfunc=bool, pure=True) op.is_true = op.nonzero = op.bool # for llinterp -add_operator('abs' , 1, 'abs', pyfunc=abs, pure=True, ovf=True) +add_operator('abs', 1, 'abs', pyfunc=abs, pure=True, ovf=True) add_operator('hex', 1, 'hex', pyfunc=hex, pure=True) add_operator('oct', 1, 'oct', pyfunc=oct, pure=True) add_operator('ord', 1, 'ord', pyfunc=ord, pure=True) diff --git a/rpython/flowspace/specialcase.py b/rpython/flowspace/specialcase.py --- a/rpython/flowspace/specialcase.py +++ b/rpython/flowspace/specialcase.py @@ -1,4 +1,4 @@ -from rpython.flowspace.model import Constant +from rpython.flowspace.model import Constant, const SPECIAL_CASES = {} @@ -30,6 +30,14 @@ "pytest.ini from the root of the PyPy repository into your " "own project.") +@register_flow_sc(isinstance) +def sc_isinstance(space, args): + w_instance, w_type = args + if w_instance.foldable() and w_type.foldable(): + return const(isinstance(w_instance.value, w_type.value)) + return space.frame.do_operation('simple_call', const(isinstance), + w_instance, w_type) + # _________________________________________________________________________ # a simplified version of the basic printing routines, for RPython programs class StdOutBuffer: diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py --- a/rpython/translator/simplify.py +++ b/rpython/translator/simplify.py @@ -57,17 +57,6 @@ # ____________________________________________________________ -def desugar_isinstance(graph): - """Replace isinstance operation with a call to isinstance.""" - constant_isinstance = Constant(isinstance) - for block in graph.iterblocks(): - for i in range(len(block.operations) - 1, -1, -1): - op = block.operations[i] - if op.opname == "isinstance": - args = [constant_isinstance, op.args[0], op.args[1]] - new_op = SpaceOperation("simple_call", args, op.result) - block.operations[i] = new_op - def eliminate_empty_blocks(graph): """Eliminate basic blocks that do not contain any operations. When this happens, we need to replace the preceeding link with the @@ -975,7 +964,6 @@ # ____ all passes & simplify_graph all_passes = [ - desugar_isinstance, eliminate_empty_blocks, remove_assertion_errors, join_blocks, _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit