Author: Ronan Lamy <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit