/* Soot - a J*va Optimization Framework
* Copyright (C) 2005 Nomair A. Naeem
*
* This library 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 library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package soot.dava.toolkits.base.AST.transformations;
import soot.*;
import java.util.*;
import soot.dava.internal.AST.*;
/*
Nomair A. Naeem 21-FEB-2005
*/
public class EmptyElseRemover{
public static void removeElseBody(ASTNode node,ASTIfElseNode ifElseNode ,int subBodyNumber, int nodeNumber){
if(!(node instanceof ASTIfElseNode)){
//these are the nodes which always have one subBody
List<Object> subBodies = node.get_SubBodies();
if(subBodies.size()!=1){
//there is something wrong
throw new RuntimeException("Please report this benchmark to the programmer");
}
List<Object> onlySubBody = (List<Object>)subBodies.get(0);
/*
The onlySubBody contains the ASTIfElseNode whose elsebody has to be removed
at location given by the nodeNumber variable
*/
List<Object> newBody = createNewNodeBody(onlySubBody,nodeNumber,ifElseNode);
if(newBody==null){
//something went wrong
return;
}
if(node instanceof ASTMethodNode){
((ASTMethodNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTSynchronizedBlockNode){
((ASTSynchronizedBlockNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTLabeledBlockNode){
((ASTLabeledBlockNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTUnconditionalLoopNode){
((ASTUnconditionalLoopNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTIfNode){
((ASTIfNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTWhileNode){
((ASTWhileNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else if(node instanceof ASTDoWhileNode){
((ASTDoWhileNode)node).replaceBody(newBody);
G.v().ASTTransformations_modified = true;
//System.out.println("REMOVED ELSE BODY");
}
else {
//there is no other case something is wrong if we get here
return;
}
}
else{//its an ASTIfElseNode
//if its an ASIfElseNode then check which Subbody has the labeledBlock
if(subBodyNumber!=0 && subBodyNumber!=1){
//something bad is happening dont do nothin
//System.out.println("Error-------not modifying AST");
return;
}
List<Object> subBodies = node.get_SubBodies();
if(subBodies.size()!=2){
//there is something wrong
throw new RuntimeException("Please report this benchmark to the programmer");
}
List<Object> toModifySubBody = (List<Object>)subBodies.get(subBodyNumber);
/*
The toModifySubBody contains the ASTIfElseNode to be removed
at location given by the nodeNumber variable
*/
List<Object> newBody = createNewNodeBody(toModifySubBody,nodeNumber,ifElseNode);
if(newBody==null){
//something went wrong
return;
}
if(subBodyNumber==0){
//the if body was modified
//System.out.println("REMOVED ELSE BODY");
G.v().ASTTransformations_modified = true;
((ASTIfElseNode)node).replaceBody(newBody,(List<Object>)subBodies.get(1));
}
else if(subBodyNumber==1){
//else body was modified
//System.out.println("REMOVED ELSE BODY");
G.v().ASTTransformations_modified = true;
((ASTIfElseNode)node).replaceBody((List<Object>)subBodies.get(0),newBody);
}
else{//realllly shouldnt come here
//something bad is happening dont do nothin
//System.out.println("Error-------not modifying AST");
return;
}
}//end of ASTIfElseNode
}
public static List<Object> createNewNodeBody(List<Object> oldSubBody,int nodeNumber,ASTIfElseNode ifElseNode){
//create a new SubBody
List<Object> newSubBody = new ArrayList<Object>();
//this is an iterator of ASTNodes
Iterator<Object> it = oldSubBody.iterator();
//copy to newSubBody all nodes until you get to nodeNumber
int index=0;
while(index!=nodeNumber ){
if(!it.hasNext()){
return null;
}
newSubBody.add(it.next());
index++;
}
//at this point the iterator is pointing to the ASTIfElseNode to be removed
//just to make sure check this
ASTNode toRemove = (ASTNode)it.next();
if(!(toRemove instanceof ASTIfElseNode)){
//something is wrong
return null;
}
else{
ASTIfElseNode toRemoveNode = (ASTIfElseNode)toRemove;
//just double checking that this is a empty else node
List<Object> elseBody = toRemoveNode.getElseBody();
if(elseBody.size()!=0){
//something is wrong we cant remove a non empty elsebody
return null;
}
//so this is the ElseBody to remove
//need to create an ASTIfNode from the ASTIfElseNode
ASTIfNode newNode = new ASTIfNode(toRemoveNode.get_Label(),toRemoveNode.get_Condition(),toRemoveNode.getIfBody());
//add this node to the newSubBody
newSubBody.add(newNode);
}
//add any remaining nodes in the oldSubBody to the new one
while(it.hasNext()){
newSubBody.add(it.next());
}
//newSubBody is ready return it
return newSubBody;
}
}