[Soot-list] A BUG about JimpleConstructorFolder and Line number
or any options I did not turn on?
Peng Li
lipeng360 at gmail.com
Mon Apr 9 20:31:52 EDT 2007
HI Chris,
This is the diff result,
Cheers
Peng
------------------
$ diff -u JimpleConstructorFolder.java ModifiedJimpleConstructorFolder.java
--- JimpleConstructorFolder.java Mon Apr 9 17:28:49 2007
+++ ModifiedJimpleConstructorFolder.java Mon Apr 9 17:28:40 2007
@@ -1,16 +1,17 @@
-package soot.jimple.toolkits.base;
import soot.options.*;
import soot.*;
import soot.toolkits.scalar.*;
import soot.jimple.*;
+import soot.jimple.internal.JNewExpr;
import soot.toolkits.graph.*;
import soot.grimp.*;
import soot.util.*;
import java.util.*;
+
import soot.tagkit.*;
-public class JimpleConstructorFolder extends BodyTransformer
+public class ModifiedJimpleConstructorFolder extends BodyTransformer
{
//public JimpleConstructorFolder( Singletons.Global g ) {}
//public static JimpleConstructorFolder v() { return
G.v().JimpleConstructorFolder(); }
@@ -17,13 +18,15 @@
/** This method pushes all newExpr down to be the stmt directly
before every
* invoke of the init */
+ static Vector NewOldHashCode = new Vector();
+
public void internalTransform(Body b, String phaseName, Map options)
{
JimpleBody body = (JimpleBody)b;
-
- if(Options.v().verbose())
+ ClassMember cm = body.getMethod();
+ /*if(Options.v().verbose())
G.v().out.println("[" + body.getMethod().getName() +
- "] Folding Jimple constructors...");
+ "] Folding Jimple constructors...");*/
Chain units = body.getUnits();
List stmtList = new ArrayList();
@@ -61,15 +64,25 @@
//check if very next statement is invoke -->
//this indicates there is no control flow between
//new and invoke and should do nothing
+
if (nextStmtIt.hasNext()){
Stmt next = (Stmt)nextStmtIt.next();
- if (next instanceof InvokeStmt){
+ if (next instanceof InvokeStmt)
+ {
InvokeStmt invoke = (InvokeStmt)next;
if (invoke.getInvokeExpr() instanceof SpecialInvokeExpr &&
-
invoke.getInvokeExpr().getMethodRef().name().equals(SootMethod.constructorName))
{
+
invoke.getInvokeExpr().getMethodRef().name().equals(SootMethod.constructorName))
+ {
SpecialInvokeExpr invokeExpr =
(SpecialInvokeExpr)invoke.getInvokeExpr();
- if (invokeExpr.getBase() == lhs){
+ if (invokeExpr.getBase() == lhs)
+ {
+ NewExprWithHashCode exprcode = new
NewExprWithHashCode();
+ JNewExpr newexpr=(JNewExpr)
((AssignStmt)s).getRightOp();
+
exprcode.SetNewExprWithHashCode((AssignStmt)s, newexpr.hashCode(),
newexpr.hashCode(), invoke, cm.getDeclaringClass().toString(),
body.getMethod(), getLineNumber(s));
+
+ // System.out.println
("******"+newexpr.hashCode()+" "+newexpr +"*****"+s.hashCode()+"
"+s);
+ NewOldHashCode.add(exprcode);
continue;
}
}
@@ -91,18 +104,29 @@
lhs != ((SpecialInvokeExpr)is.getInvokeExpr()).getBase())
continue;
- //make a new one here
- AssignStmt constructStmt = Jimple.v().newAssignStmt
- (((DefinitionStmt)s).getLeftOp(),
((DefinitionStmt)s).getRightOp());
- constructStmt.setRightOp
- (Jimple.v().newNewExpr
- (((NewExpr)rhs).getBaseType()));
+ //make a new stmt here
+ AssignStmt constructStmt =
Jimple.v().newAssignStmt(((DefinitionStmt)s).getLeftOp(),
((DefinitionStmt)s).getRightOp());
+ LineNumberTag tag =
(LineNumberTag)s.getTag("LineNumberTag"); // add
+ constructStmt.addTag(tag);
+ constructStmt.setRightOp(Jimple.v().newNewExpr(((NewExpr)rhs).getBaseType()));
MadeNewInvokeExpr = true;
+
// redirect jumps
use.redirectJumpsToThisTo(constructStmt);
// insert new one here
units.insertBefore(constructStmt, use);
+
+ NewExprWithHashCode exprcode1 = new NewExprWithHashCode();
+ JNewExpr newexpr1 = (JNewExpr) constructStmt.getRightOp();
+
+ JNewExpr newexpr2=(JNewExpr) ((AssignStmt)s).getRightOp();
+ exprcode1.SetNewExprWithHashCode(constructStmt,
newexpr2.hashCode(), newexpr1.hashCode(), is,
cm.getDeclaringClass().toString(), body.getMethod(),
getLineNumber(constructStmt));
+ System.out.println(getLineNumber(constructStmt));
+ //System.out.println ("******"+jjj.hashCode()+" "+jjj
+"*****"+constructStmt.hashCode()+" "+constructStmt);
+ NewOldHashCode.add(exprcode1);
+
+
if (s.hasTag("SourceLnPosTag")){
constructStmt.addTag((SourceLnPosTag)s.getTag("SourceLnPosTag"));
}
@@ -113,4 +137,17 @@
}
}
}
+
+ private static int getLineNumber(Stmt s) {
+ Iterator ti = s.getTags().iterator();
+ while (ti.hasNext()) {
+ Object o = ti.next();
+ if (o instanceof LineNumberTag)
+ {
+ LineNumberTag linetag = (LineNumberTag) o;
+ return linetag.getLineNumber();
+ }
+ }
+ return -1;
+ }
}
More information about the Soot-list
mailing list