[pypy-commit] pypy default: Hide c_last_exception as an implementation detail of Block

rlamy noreply at buildbot.pypy.org
Mon Mar 2 00:14:05 CET 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: 
Changeset: r76210:b6ada241779b
Date: 2015-03-01 20:45 +0000
http://bitbucket.org/pypy/pypy/changeset/b6ada241779b/

Log:	Hide c_last_exception as an implementation detail of Block

diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -6,8 +6,8 @@
 from rpython.tool.pairtype import pair
 from rpython.tool.error import (format_blocked_annotation_error,
                              gather_error, source_lines)
-from rpython.flowspace.model import (Variable, Constant, FunctionGraph,
-                                      c_last_exception, checkgraph)
+from rpython.flowspace.model import (
+    Variable, Constant, FunctionGraph, checkgraph)
 from rpython.translator import simplify, transform
 from rpython.annotator import model as annmodel, signature
 from rpython.annotator.argument import simple_args
@@ -407,8 +407,7 @@
                     self.bookkeeper.leave()
 
         except BlockedInference as e:
-            if (e.op is block.operations[-1] and
-                block.exitswitch == c_last_exception):
+            if e.op is block.raising_op:
                 # this is the case where the last operation of the block will
                 # always raise an exception which is immediately caught by
                 # an exception handler.  We then only follow the exceptional
@@ -450,8 +449,8 @@
 
         # filter out those exceptions which cannot
         # occour for this specific, typed operation.
-        if block.exitswitch == c_last_exception:
-            op = block.operations[-1]
+        if block.canraise:
+            op = block.raising_op
             can_only_throw = op.get_can_only_throw(self)
             if can_only_throw is not None:
                 candidates = can_only_throw
diff --git a/rpython/flowspace/model.py b/rpython/flowspace/model.py
--- a/rpython/flowspace/model.py
+++ b/rpython/flowspace/model.py
@@ -190,6 +190,15 @@
             txt = "%s(%s)" % (txt, self.exitswitch)
         return txt
 
+    @property
+    def canraise(self):
+        return self.exitswitch is c_last_exception
+
+    @property
+    def raising_op(self):
+        if self.canraise:
+            return self.operations[-1]
+
     def getvariables(self):
         "Return all variables mentioned in this Block."
         result = self.inputargs[:]
@@ -591,11 +600,11 @@
                 assert len(block.exits) <= 1
                 if block.exits:
                     assert block.exits[0].exitcase is None
-            elif block.exitswitch == Constant(last_exception):
+            elif block.canraise:
                 assert len(block.operations) >= 1
                 # check if an exception catch is done on a reasonable
                 # operation
-                assert block.operations[-1].opname not in ("keepalive",
+                assert block.raising_op.opname not in ("keepalive",
                                                            "cast_pointer",
                                                            "same_as")
                 assert len(block.exits) >= 2
diff --git a/rpython/flowspace/test/test_objspace.py b/rpython/flowspace/test/test_objspace.py
--- a/rpython/flowspace/test/test_objspace.py
+++ b/rpython/flowspace/test/test_objspace.py
@@ -4,7 +4,7 @@
 from contextlib import contextmanager
 
 from rpython.flowspace.model import (
-    Constant, mkentrymap, c_last_exception, const)
+    Constant, mkentrymap, const)
 from rpython.translator.simplify import simplify_graph
 from rpython.flowspace.objspace import build_flow
 from rpython.flowspace.flowcontext import FlowingError, FlowContext
@@ -826,7 +826,7 @@
                 return None
         graph = self.codetest(myfunc)
         simplify_graph(graph)
-        assert graph.startblock.exitswitch == c_last_exception
+        assert graph.startblock.canraise
         assert graph.startblock.exits[0].target is graph.returnblock
         assert graph.startblock.exits[1].target is graph.returnblock
 
diff --git a/rpython/jit/codewriter/flatten.py b/rpython/jit/codewriter/flatten.py
--- a/rpython/jit/codewriter/flatten.py
+++ b/rpython/jit/codewriter/flatten.py
@@ -1,4 +1,4 @@
-from rpython.flowspace.model import Variable, Constant, c_last_exception
+from rpython.flowspace.model import Variable, Constant
 from rpython.jit.metainterp.history import AbstractDescr, getkind
 from rpython.rtyper.lltypesystem import lltype
 
@@ -167,7 +167,7 @@
             # up in the manually hacked graphs for generators...
             self.make_link(link)
         #
-        elif block.exitswitch is c_last_exception:
+        elif block.canraise:
             # An exception block. See test_exc_exitswitch in test_flatten.py
             # for an example of what kind of code this makes.
             index = -1
@@ -184,7 +184,7 @@
                     # actually a '-live-'
                     self.make_link(block.exits[0])
                     return
-            # 
+            #
             self.emitline('catch_exception', TLabel(block.exits[0]))
             self.make_link(block.exits[0])
             self.emitline(Label(block.exits[0]))
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -8,7 +8,7 @@
 from rpython.jit.metainterp.history import getkind
 from rpython.jit.metainterp.typesystem import deref, arrayItem
 from rpython.jit.metainterp.blackhole import BlackholeInterpreter
-from rpython.flowspace.model import SpaceOperation, Variable, Constant, c_last_exception
+from rpython.flowspace.model import SpaceOperation, Variable, Constant
 from rpython.rlib import objectmodel
 from rpython.rlib.jit import _we_are_jitted
 from rpython.rlib.rgc import lltype_is_gc
@@ -110,7 +110,7 @@
                 else:
                     raise TypeError(repr(op1))
         #
-        if block.exitswitch == c_last_exception:
+        if block.canraise:
             if len(newoperations) == count_before_last_operation:
                 self._killed_exception_raising_operation(block)
         block.operations = newoperations
@@ -175,7 +175,7 @@
 
     def follow_constant_exit(self, block):
         v = block.exitswitch
-        if isinstance(v, Constant) and v != c_last_exception:
+        if isinstance(v, Constant) and not block.canraise:
             llvalue = v.value
             for link in block.exits:
                 if link.llexitcase == llvalue:
@@ -192,7 +192,7 @@
         if len(block.exits) != 2:
             return False
         v = block.exitswitch
-        if (v == c_last_exception or isinstance(v, tuple)
+        if (block.canraise or isinstance(v, tuple)
             or v.concretetype != lltype.Bool):
             return False
         for op in block.operations[::-1]:
diff --git a/rpython/memory/gctransform/test/test_transform.py b/rpython/memory/gctransform/test/test_transform.py
--- a/rpython/memory/gctransform/test/test_transform.py
+++ b/rpython/memory/gctransform/test/test_transform.py
@@ -1,5 +1,5 @@
 from rpython.memory.gctransform.transform import BaseGCTransformer
-from rpython.flowspace.model import c_last_exception, Variable
+from rpython.flowspace.model import Variable
 from rpython.translator.backendopt.support import var_needsgc
 from rpython.translator.translator import TranslationContext, graphof
 from rpython.translator.exceptiontransform import ExceptionTransformer
@@ -119,8 +119,8 @@
     if pop_alives == len(block.operations):
         # it's a block we inserted
         return
+    assert not block.canraise
     for link in block.exits:
-        assert block.exitswitch is not c_last_exception
         refs_out = 0
         for v2 in link.target.inputargs:
             if var_needsgc(v2) and not is_borrowed(v2):
diff --git a/rpython/memory/gctransform/transform.py b/rpython/memory/gctransform/transform.py
--- a/rpython/memory/gctransform/transform.py
+++ b/rpython/memory/gctransform/transform.py
@@ -1,6 +1,6 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory
-from rpython.flowspace.model import SpaceOperation, Variable, Constant, \
-     c_last_exception, checkgraph
+from rpython.flowspace.model import (
+    SpaceOperation, Variable, Constant, checkgraph)
 from rpython.translator.unsimplify import insert_empty_block
 from rpython.translator.unsimplify import insert_empty_startblock
 from rpython.translator.unsimplify import starts_with_empty_block
@@ -180,7 +180,7 @@
             hop.dispatch()
 
         if len(block.exits) != 0: # i.e not the return block
-            assert block.exitswitch is not c_last_exception
+            assert not block.canraise
 
             deadinallexits = set(self.livevars)
             for link in block.exits:
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -5,8 +5,7 @@
 
 import py
 
-from rpython.flowspace.model import (FunctionGraph, Constant, Variable,
-    c_last_exception)
+from rpython.flowspace.model import (FunctionGraph, Constant, Variable)
 from rpython.rlib import rstackovf
 from rpython.rlib.objectmodel import (ComputedIntSymbolic, CDefinedIntSymbolic,
     Symbolic)
@@ -292,7 +291,6 @@
             is None, values is the concrete return value.
         """
         self.curr_block = block
-        catch_exception = block.exitswitch == c_last_exception
         e = None
 
         try:
@@ -300,7 +298,7 @@
                 self.curr_operation_index = i
                 self.eval_operation(op)
         except LLException, e:
-            if not (catch_exception and op is block.operations[-1]):
+            if op is not block.raising_op:
                 raise
         except RuntimeError, e:
             rstackovf.check_stack_overflow()
@@ -312,7 +310,7 @@
             evalue = exdata.get_standard_ll_exc_instance(rtyper, classdef)
             etype = exdata.fn_type_of_exc_inst(evalue)
             e = LLException(etype, evalue)
-            if not (catch_exception and op is block.operations[-1]):
+            if op is not block.raising_op:
                 raise e
 
         # determine nextblock and/or return value
@@ -354,7 +352,7 @@
             # single-exit block
             assert len(block.exits) == 1
             link = block.exits[0]
-        elif catch_exception:
+        elif block.canraise:
             link = block.exits[0]
             if e:
                 exdata = self.llinterpreter.typer.exceptiondata
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -17,7 +17,7 @@
 
 from rpython.annotator import model as annmodel, unaryop, binaryop
 from rpython.rtyper.llannotation import SomePtr, lltype_to_annotation
-from rpython.flowspace.model import Variable, Constant, SpaceOperation, c_last_exception
+from rpython.flowspace.model import Variable, Constant, SpaceOperation
 from rpython.rtyper.annlowlevel import annotate_lowlevel_helper, LowLevelAnnotatorPolicy
 from rpython.rtyper.error import TyperError
 from rpython.rtyper.exceptiondata import ExceptionData
@@ -353,7 +353,7 @@
         if (pos is not None and pos != len(newops) - 1):
             # this is for the case where the llop that raises the exceptions
             # is not the last one in the list.
-            assert block.exitswitch == c_last_exception
+            assert block.canraise
             noexclink = block.exits[0]
             assert noexclink.exitcase is None
             if pos == "removed":
@@ -388,7 +388,7 @@
             if isinstance(block.exitswitch, Variable):
                 r_case = self.bindingrepr(block.exitswitch)
             else:
-                assert block.exitswitch == c_last_exception
+                assert block.canraise
                 r_case = rclass.get_type_repr(self)
             link.llexitcase = r_case.convert_const(link.exitcase)
         else:
@@ -458,7 +458,7 @@
             for op in block.operations[:-1]:
                 yield HighLevelOp(self, op, [], llops)
             # look for exception links for the last operation
-            if block.exitswitch == c_last_exception:
+            if block.canraise:
                 exclinks = block.exits[1:]
             else:
                 exclinks = []
diff --git a/rpython/translator/backendopt/constfold.py b/rpython/translator/backendopt/constfold.py
--- a/rpython/translator/backendopt/constfold.py
+++ b/rpython/translator/backendopt/constfold.py
@@ -1,5 +1,5 @@
 from rpython.flowspace.model import (Constant, Variable, SpaceOperation,
-    c_last_exception, mkentrymap)
+    mkentrymap)
 from rpython.rtyper.lltypesystem import lltype
 from rpython.rtyper.lltypesystem.lloperation import llop
 from rpython.translator.unsimplify import insert_empty_block, split_block
@@ -66,7 +66,7 @@
 def constant_fold_block(block):
     constants = {}
     block.operations = fold_op_list(block.operations, constants,
-                           exc_catch=block.exitswitch == c_last_exception)
+                                    exc_catch=block.canraise)
     if constants:
         if block.exitswitch in constants:
             switch = constants[block.exitswitch].value
@@ -155,7 +155,7 @@
     folded_count = fold_op_list(block.operations, constants, exit_early=True)
 
     n = len(block.operations)
-    if block.exitswitch == c_last_exception:
+    if block.canraise:
         n -= 1
     # is the next, non-folded operation an indirect_call?
     if folded_count < n:
diff --git a/rpython/translator/backendopt/inline.py b/rpython/translator/backendopt/inline.py
--- a/rpython/translator/backendopt/inline.py
+++ b/rpython/translator/backendopt/inline.py
@@ -1,7 +1,7 @@
 import sys
 
 from rpython.flowspace.model import (Variable, Constant, Block, Link,
-    SpaceOperation, c_last_exception, FunctionGraph, mkentrymap)
+    SpaceOperation, FunctionGraph, mkentrymap)
 from rpython.rtyper.lltypesystem.lltype import Bool, Signed, typeOf, Void, Ptr, normalizeptr
 from rpython.tool.algo import sparsemat
 from rpython.translator.backendopt import removenoops
@@ -112,7 +112,7 @@
     for block in graph.iterblocks():
         if block is graph.exceptblock:
             return True      # the except block is reachable
-        if block.exitswitch == c_last_exception:
+        if block.canraise:
             consider_ops_to = -1
         else:
             consider_ops_to = len(block.operations)
@@ -132,7 +132,7 @@
         else:
             return True # conservatively
     for block in from_graph.iterblocks():
-        if block.exitswitch == c_last_exception:
+        if block.canraise:
             consider_ops_to = -1
         else:
             consider_ops_to = len(block.operations)
@@ -196,8 +196,7 @@
         self.op = block.operations[index_operation]
         self.graph_to_inline = self.get_graph_from_op(self.op)
         self.exception_guarded = False
-        if (block.exitswitch == c_last_exception and
-            index_operation == len(block.operations) - 1):
+        if self.op is block.raising_op:
             self.exception_guarded = True
             if self.inline_guarded_calls:
                 if (not self.inline_guarded_calls_no_matter_what and
diff --git a/rpython/translator/backendopt/mallocv.py b/rpython/translator/backendopt/mallocv.py
--- a/rpython/translator/backendopt/mallocv.py
+++ b/rpython/translator/backendopt/mallocv.py
@@ -1,7 +1,6 @@
 from rpython.flowspace.model import Variable, Constant, Block, Link
 from rpython.flowspace.model import SpaceOperation, copygraph
 from rpython.flowspace.model import checkgraph
-from rpython.flowspace.model import c_last_exception
 from rpython.translator.backendopt.support import log
 from rpython.translator.simplify import join_blocks
 from rpython.translator.unsimplify import varoftype
@@ -534,7 +533,7 @@
             return None
 
     def has_exception_catching(self, catchingframe):
-        if catchingframe.sourceblock.exitswitch != c_last_exception:
+        if not catchingframe.sourceblock.canraise:
             return False
         else:
             operations = catchingframe.sourceblock.operations
@@ -711,7 +710,7 @@
         self.specblock.exitswitch = self.rename_nonvirtual(block.exitswitch,
                                                            'exitswitch')
         links = block.exits
-        catch_exc = self.specblock.exitswitch == c_last_exception
+        catch_exc = self.specblock.canraise
 
         if not catch_exc and isinstance(self.specblock.exitswitch, Constant):
             # constant-fold the switch
diff --git a/rpython/translator/backendopt/removeassert.py b/rpython/translator/backendopt/removeassert.py
--- a/rpython/translator/backendopt/removeassert.py
+++ b/rpython/translator/backendopt/removeassert.py
@@ -1,4 +1,4 @@
-from rpython.flowspace.model import Constant, checkgraph, c_last_exception
+from rpython.flowspace.model import Constant, checkgraph
 from rpython.rtyper.lltypesystem import lltype
 from rpython.rtyper.rtyper import LowLevelOpList, inputconst
 from rpython.translator.backendopt.support import log
@@ -59,7 +59,7 @@
     if len(exits) <= 1:
         return False
     remove_condition = len(exits) == 2
-    if block.exitswitch == c_last_exception:
+    if block.canraise:
         if link is exits[0]:
             return False       # cannot remove the non-exceptional path
     else:
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -3,8 +3,7 @@
 from rpython.translator.c.support import cdecl
 from rpython.translator.c.support import llvalue_from_constant, gen_assignments
 from rpython.translator.c.support import c_string_constant, barebonearray
-from rpython.flowspace.model import Variable, Constant
-from rpython.flowspace.model import c_last_exception, copygraph
+from rpython.flowspace.model import Variable, Constant, copygraph
 from rpython.rtyper.lltypesystem.lltype import (Ptr, Void, Bool, Signed, Unsigned,
     SignedLongLong, Float, UnsignedLongLong, Char, UniChar, ContainerType,
     Array, FixedSizeArray, ForwardReference, FuncType)
@@ -233,7 +232,7 @@
                 for op in self.gen_link(block.exits[0]):
                     yield op
             else:
-                assert block.exitswitch != c_last_exception
+                assert not block.canraise
                 # block ending in a switch on a value
                 TYPE = self.lltypemap(block.exitswitch)
                 if TYPE == Bool:
diff --git a/rpython/translator/exceptiontransform.py b/rpython/translator/exceptiontransform.py
--- a/rpython/translator/exceptiontransform.py
+++ b/rpython/translator/exceptiontransform.py
@@ -3,7 +3,7 @@
 from rpython.translator.unsimplify import insert_empty_block, split_block
 from rpython.translator.backendopt import canraise, inline
 from rpython.flowspace.model import Block, Constant, Variable, Link, \
-    c_last_exception, SpaceOperation, FunctionGraph, mkentrymap
+    SpaceOperation, FunctionGraph, mkentrymap
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rtyper.lltypesystem import lloperation
 from rpython.rtyper.rclass import ll_inst_type
@@ -243,7 +243,7 @@
         elif block is graph.returnblock:
             return need_exc_matching, n_gen_exc_checks
         last_operation = len(block.operations) - 1
-        if block.exitswitch == c_last_exception:
+        if block.canraise:
             need_exc_matching = True
             last_operation -= 1
         elif (len(block.exits) == 1 and
@@ -267,7 +267,7 @@
             self.gen_exc_check(block, graph.returnblock, afterblock)
             n_gen_exc_checks += 1
         if need_exc_matching:
-            assert lastblock.exitswitch == c_last_exception
+            assert lastblock.canraise
             if not self.raise_analyzer.can_raise(lastblock.operations[-1]):
                 lastblock.exitswitch = None
                 lastblock.recloseblock(lastblock.exits[0])
diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py
--- a/rpython/translator/simplify.py
+++ b/rpython/translator/simplify.py
@@ -8,8 +8,8 @@
 from collections import defaultdict
 
 from rpython.tool.algo.unionfind import UnionFind
-from rpython.flowspace.model import (Variable, Constant,
-                                     c_last_exception, checkgraph, mkentrymap)
+from rpython.flowspace.model import (
+        Variable, Constant, checkgraph, mkentrymap)
 from rpython.flowspace.operation import OverflowingOperation, op
 from rpython.rlib import rarithmetic
 from rpython.translator import unsimplify
@@ -43,8 +43,6 @@
 
 
 def replace_exitswitch_by_constant(block, const):
-    assert isinstance(const, Constant)
-    assert const != c_last_exception
     newexits = [link for link in block.exits
                      if link.exitcase == const.value]
     if len(newexits) == 0:
@@ -133,13 +131,12 @@
     chain of is_/issubtype tests. We collapse them all into
     the block's single list of exits.
     """
-    clastexc = c_last_exception
     renaming = {}
     def rename(v):
         return renaming.get(v, v)
 
     for block in graph.iterblocks():
-        if not (block.exitswitch == clastexc
+        if not (block.canraise
                 and block.exits[-1].exitcase is Exception):
             continue
         covered = [link.exitcase for link in block.exits[1:-1]]
@@ -199,8 +196,8 @@
 def transform_xxxitem(graph):
     # xxx setitem too
     for block in graph.iterblocks():
-        if block.operations and block.exitswitch == c_last_exception:
-            last_op = block.operations[-1]
+        if block.canraise:
+            last_op = block.raising_op
             if last_op.opname == 'getitem':
                 postfx = []
                 for exit in block.exits:
@@ -217,9 +214,6 @@
 
 def remove_dead_exceptions(graph):
     """Exceptions can be removed if they are unreachable"""
-
-    clastexc = c_last_exception
-
     def issubclassofmember(cls, seq):
         for member in seq:
             if member and issubclass(cls, member):
@@ -227,7 +221,7 @@
         return False
 
     for block in list(graph.iterblocks()):
-        if block.exitswitch != clastexc:
+        if not block.canraise:
             continue
         exits = []
         seen = []
@@ -263,7 +257,7 @@
             continue
         source = link.prevblock
         switch = source.exitswitch
-        if (isinstance(switch, Constant) and switch != c_last_exception):
+        if (isinstance(switch, Constant) and not source.canraise):
             exits = replace_exitswitch_by_constant(source, switch)
             stack.extend(exits)
         else:
@@ -339,7 +333,8 @@
             newexitswitch = rename(link.target.exitswitch)
             link.prevblock.exitswitch = newexitswitch
             link.prevblock.recloseblock(*exits)
-            if isinstance(newexitswitch, Constant) and newexitswitch != c_last_exception:
+            if (isinstance(newexitswitch, Constant) and
+                    not link.prevblock.canraise):
                 exits = replace_exitswitch_by_constant(link.prevblock,
                                                        newexitswitch)
             stack.extend(exits)
@@ -363,7 +358,7 @@
                 # can we remove this exit without breaking the graph?
                 if len(block.exits) < 2:
                     break
-                if block.exitswitch == c_last_exception:
+                if block.canraise:
                     if exit.exitcase is None:
                         break
                     if len(block.exits) == 2:
@@ -465,12 +460,7 @@
     start_blocks = find_start_blocks(graphs)
 
     def canremove(op, block):
-        if op.opname not in CanRemove:
-            return False
-        if block.exitswitch != c_last_exception:
-            return True
-        # cannot remove the exc-raising operation
-        return op is not block.operations[-1]
+        return op.opname in CanRemove and op is not block.raising_op
 
     # compute dependencies and an initial read_vars
     for block in blocks:
@@ -538,9 +528,8 @@
                     if translator is not None:
                         graph = get_graph(op.args[0], translator)
                         if (graph is not None and
-                            has_no_side_effects(translator, graph) and
-                            (block.exitswitch != c_last_exception or
-                             i != len(block.operations)- 1)):
+                                has_no_side_effects(translator, graph) and
+                                op is not block.raising_op):
                             del block.operations[i]
         # look for output variables never used
         # warning: this must be completely done *before* we attempt to
@@ -764,9 +753,8 @@
     # collect relevant operations based on the family of their result
     for block in graph.iterblocks():
         if (len(block.operations) == 1 and
-            block.operations[0].opname == 'next' and
-            block.exitswitch == c_last_exception and
-            len(block.exits) >= 2):
+                block.operations[0].opname == 'next' and
+                block.canraise and len(block.exits) >= 2):
             cases = [link.exitcase for link in block.exits]
             if None in cases and StopIteration in cases:
                 # it's a straightforward loop start block
diff --git a/rpython/translator/transform.py b/rpython/translator/transform.py
--- a/rpython/translator/transform.py
+++ b/rpython/translator/transform.py
@@ -5,9 +5,8 @@
 completed.
 """
 
-from rpython.flowspace.model import SpaceOperation
-from rpython.flowspace.model import Variable, Constant, Link
-from rpython.flowspace.model import c_last_exception, checkgraph
+from rpython.flowspace.model import (
+    SpaceOperation, Variable, Constant, Link, checkgraph)
 from rpython.annotator import model as annmodel
 from rpython.rtyper.lltypesystem import lltype
 
@@ -155,7 +154,7 @@
                 if not block.exits:
                     # oups! cannot reach the end of this block
                     cutoff_alwaysraising_block(self, block)
-                elif block.exitswitch == c_last_exception:
+                elif block.canraise:
                     # exceptional exit
                     if block.exits[0].exitcase is not None:
                         # killed the non-exceptional path!
@@ -271,4 +270,3 @@
     transform_dead_op_vars(ann, block_subset)
     if ann.translator:
         checkgraphs(ann, block_subset)
-


More information about the pypy-commit mailing list