提交 e8f57d3a 编写于 作者: S Skylot

fix: prevent infinite loop in block tree mod for loops (#1147)

上级 766e7193
...@@ -498,19 +498,26 @@ public class BlockProcessor extends AbstractVisitor { ...@@ -498,19 +498,26 @@ public class BlockProcessor extends AbstractVisitor {
} }
private static boolean checkLoops(MethodNode mth, BlockNode block) { private static boolean checkLoops(MethodNode mth, BlockNode block) {
if (!block.contains(AFlag.LOOP_START)) {
return false;
}
List<LoopInfo> loops = block.getAll(AType.LOOP); List<LoopInfo> loops = block.getAll(AType.LOOP);
int loopsCount = loops.size(); int loopsCount = loops.size();
if (loopsCount == 0) { if (loopsCount == 0) {
return false; return false;
} }
for (LoopInfo loop : loops) {
if (insertBlocksForBreak(mth, loop)) {
return true;
}
}
if (loopsCount > 1 && splitLoops(mth, block, loops)) { if (loopsCount > 1 && splitLoops(mth, block, loops)) {
return true; return true;
} }
if (loopsCount == 1) { if (loopsCount == 1) {
LoopInfo loop = loops.get(0); LoopInfo loop = loops.get(0);
return insertBlocksForBreak(mth, loop) return insertBlocksForContinue(mth, loop)
|| insertBlocksForContinue(mth, loop) || insertBlockForPredecessors(mth, loop)
|| insertBlockForProdecessors(mth, loop)
|| insertPreHeader(mth, loop); || insertPreHeader(mth, loop);
} }
return false; return false;
...@@ -588,7 +595,7 @@ public class BlockProcessor extends AbstractVisitor { ...@@ -588,7 +595,7 @@ public class BlockProcessor extends AbstractVisitor {
/** /**
* Insert additional block if loop header has several predecessors (exclude back edges) * Insert additional block if loop header has several predecessors (exclude back edges)
*/ */
private static boolean insertBlockForProdecessors(MethodNode mth, LoopInfo loop) { private static boolean insertBlockForPredecessors(MethodNode mth, LoopInfo loop) {
BlockNode loopHeader = loop.getStart(); BlockNode loopHeader = loop.getStart();
List<BlockNode> preds = loopHeader.getPredecessors(); List<BlockNode> preds = loopHeader.getPredecessors();
if (preds.size() > 2) { if (preds.size() > 2) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册