Handle case where try handler block is before try block

This commit is contained in:
de4dot 2011-10-28 01:27:00 +02:00
parent 09178a6e95
commit deda2d5d60

View File

@ -29,6 +29,7 @@ namespace de4dot.blocks {
Stack<BlockState> stateStack = new Stack<BlockState>();
List<ExceptionInfo> exceptions = new List<ExceptionInfo>();
Dictionary<BaseBlock, bool> visited = new Dictionary<BaseBlock, bool>();
List<BaseBlock> notProcessedYet = new List<BaseBlock>();
class BlockState {
public ScopeBlock scopeBlock;
@ -264,6 +265,13 @@ namespace de4dot.blocks {
});
stateStack.Pop();
foreach (var bb in notProcessedYet) {
bool wasVisited;
visited.TryGetValue(bb, out wasVisited);
if (!wasVisited)
throw new ApplicationException("A block wasn't processed");
}
}
void processBaseBlocks(List<BaseBlock> lb, Func<Block, bool> placeLast) {
@ -318,6 +326,12 @@ namespace de4dot.blocks {
doFilterHandlerBlock(bb as FilterHandlerBlock);
else if (bb is HandlerBlock)
doHandlerBlock(bb as HandlerBlock);
else if (bb is TryHandlerBlock) {
// The try handler block is usually after the try block, but sometimes it isn't...
// Handle that case here.
visited.Remove(bb);
notProcessedYet.Add(bb);
}
else
throw new ApplicationException("Invalid block found");
}