[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