
soot.dava.toolkits.base.AST.transformations.PushLabeledBlockIn Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of soot Show documentation
Show all versions of soot Show documentation
A Java Optimization Framework
package soot.dava.toolkits.base.AST.transformations;
/*-
* #%L
* Soot - a J*va Optimization Framework
* %%
* Copyright (C) 2005 Nomair A. Naeem
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* .
* #L%
*/
import java.util.Iterator;
import java.util.List;
import soot.G;
import soot.dava.internal.AST.ASTLabeledBlockNode;
import soot.dava.internal.AST.ASTLabeledNode;
import soot.dava.internal.AST.ASTNode;
import soot.dava.internal.AST.ASTStatementSequenceNode;
import soot.dava.internal.AST.ASTTryNode;
import soot.dava.internal.SET.SETNodeLabel;
import soot.dava.internal.asg.AugmentedStmt;
import soot.dava.internal.javaRep.DAbruptStmt;
import soot.dava.toolkits.base.AST.analysis.DepthFirstAdapter;
import soot.jimple.Stmt;
/*
Nomair A. Naeem 18-FEB-2005
The class is responsible to do the following transformation on the AST
label_1:{
___________________ ____________________
| | | |
| no break label_1 | | no break label_1 |
|___________________| |____________________|
| | | |
|ASTLabeledNode | | label_1: |
|while(cond){ | ----> | while(cond){ |
| use of label_1 | | use of label_1 |
| | | } |
|} | |____________________|
|___________________|
| |
| Nothing here |
|___________________|
}//end of label_1
The important thing to note in this case is that the node which uses breaks
extends ASTLabeledNode so that we can move the label down. Obviously there shouldnt be
an already existing label on this node. Once the node containing the break is detected
there should be no node following this in the body of the labeled block. This is so because
if the break is moved down that code will get executed and thats a wrong transformation.
label_1:{
___________________ _____________________
| | | |
|label_2 | | label_2: |
|while(cond){ | ----> | while(cond){ |
| use of label_1 | | label_1 replaced|
| | | by label_2 |
|} | |___}_________________|
|___________________|
| |
| Nothing here |
|___________________|
}//end of label_1
If the previous pattern did not match because the node on which we wanted to push the label
inwards already had a label we can try to use the label on the inner node. This is only possible
if there is only a single node in the labeledBlocks subBody, to make sure that we break and jump
to exactly the same point as we were jumping before.
TO MAKE CODE EFFECIENT BLOCK THE ANALYSIS TO GOING INTO STATEMENTS
this is done by overriding the caseASTStatementSequenceNode
*/
public class PushLabeledBlockIn extends DepthFirstAdapter {
public PushLabeledBlockIn() {
}
public PushLabeledBlockIn(boolean verbose) {
super(verbose);
}
public void caseASTStatementSequenceNode(ASTStatementSequenceNode node) {
}
public void outASTLabeledBlockNode(ASTLabeledBlockNode node) {
String label = node.get_Label().toString();
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy