Attachment:
ClassConstant.java
Description: Binary data
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/scalar/ConstantPropagatorAndFolder.java soot/jimple/toolkits/scalar/ConstantPropagatorAndFolder.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/scalar/ConstantPropagatorAndFolder.java 2003-07-25 15:02:28.891675800 -0700
+++ soot/jimple/toolkits/scalar/ConstantPropagatorAndFolder.java 2003-11-06 16:47:12.661607900 -0800
@@ -79,7 +79,7 @@
if (defsOfUse.size() == 1) {
DefinitionStmt defStmt =
(DefinitionStmt) defsOfUse.get(0);
- if (defStmt.getRightOp() instanceof NumericConstant) {
+ if (defStmt.getRightOp() instanceof Constant) {
if (useBox.canContainValue(defStmt.getRightOp())) {
useBox.setValue(defStmt.getRightOp());
numPropagated++;
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/scalar/Evaluator.java soot/jimple/toolkits/scalar/Evaluator.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/scalar/Evaluator.java 2003-07-25 15:02:28.511117200 -0700
+++ soot/jimple/toolkits/scalar/Evaluator.java 2003-11-06 16:53:05.199077300 -0800
@@ -37,7 +37,10 @@
public class Evaluator {
public static boolean isValueConstantValued(Value op) {
-
+
+ if (op instanceof ClassConstant) {
+ return true;
+ } else
if (op instanceof Constant)
return true;
else if ((op instanceof UnopExpr)) {
@@ -68,6 +71,15 @@
if (isValueConstantValued(((BinopExpr)op).getOp1()) &&
isValueConstantValued(((BinopExpr)op).getOp2()))
return true;
+ } else if (op instanceof StaticInvokeExpr) {
+ StaticInvokeExpr expr = (StaticInvokeExpr)op;
+ SootMethod method = (SootMethod)expr.getMethod();
+ if(method.getSignature().equals(
+ "<java.lang.Class: java.lang.Class forName(java.lang.String)>")) {
+ if (isValueConstantValued(expr.getArg(0))) {
+ return true;
+ }
+ }
}
return false;
} // isValueConstantValued
@@ -102,7 +114,18 @@
return ((NumericConstant)c1).remainder((NumericConstant)c2);
else if (op instanceof EqExpr || op instanceof NeExpr)
{
- if (c1 instanceof NumericConstant)
+ if (c1 instanceof ClassConstant)
+ {
+ boolean equality = ((ClassConstant)c1).equals
+ ((ClassConstant)c2);
+
+ boolean truth = (op instanceof EqExpr) ? equality :
+ !equality;
+
+ // Yeah, this variable name sucks, but I couldn't resist.
+ IntConstant beauty = IntConstant.v(truth ? 1 : 0);
+ return beauty;
+ } else if (c1 instanceof NumericConstant)
{
if (op instanceof EqExpr)
return ((NumericConstant)c1).equalEqual
@@ -171,6 +194,15 @@
}
else
throw new RuntimeException("unknown binop: " + op);
+ } else if (op instanceof StaticInvokeExpr) {
+ StaticInvokeExpr expr = (StaticInvokeExpr)op;
+ SootMethod method = (SootMethod)expr.getMethod();
+ if(method.getSignature().equals(
+ "<java.lang.Class: java.lang.Class forName(java.lang.String)>")) {
+ StringConstant name =
+ (StringConstant)getConstantValueOf(expr.getArg(0));
+ return ClassConstant.v(name.toString());
+ }
}
throw new RuntimeException("couldn't getConstantValueOf of: " + op);
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/ConstraintChecker.java soot/jimple/toolkits/typing/ConstraintChecker.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/ConstraintChecker.java 2003-07-25 15:02:30.554116000 -0700
+++ soot/jimple/toolkits/typing/ConstraintChecker.java 2003-11-06 16:22:10.867896300 -0800
@@ -425,6 +425,13 @@
error("Type Error(26)");
}
}
+ else if(r instanceof ClassConstant)
+ {
+ if(!left.hasDescendantOrSelf(hierarchy.typeNode(RefType.v("java.lang.Class"))))
+ {
+ error("Type Error(27a)");
+ }
+ }
else if(r instanceof BinopExpr)
{
//******** BINOP EXPR ********
@@ -466,6 +473,11 @@
{
lop = hierarchy.typeNode(RefType.v("java.lang.String"));
}
+ else if(lv instanceof ClassConstant)
+ {
+ lop = hierarchy.typeNode(RefType.v("java.lang.Class"));
+
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -500,6 +512,10 @@
{
rop = hierarchy.typeNode(RefType.v("java.lang.String"));
}
+ else if(rv instanceof ClassConstant)
+ {
+ rop = hierarchy.typeNode(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
@@ -894,6 +910,10 @@
{
lop = hierarchy.typeNode(RefType.v("java.lang.String"));
}
+ else if(lv instanceof ClassConstant)
+ {
+ lop = hierarchy.typeNode(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -928,6 +948,10 @@
{
rop = hierarchy.typeNode(RefType.v("java.lang.String"));
}
+ else if(rv instanceof ClassConstant)
+ {
+ rop = hierarchy.typeNode(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/ConstraintCollector.java soot/jimple/toolkits/typing/ConstraintCollector.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/ConstraintCollector.java 2003-07-25 15:02:30.383866100 -0700
+++ soot/jimple/toolkits/typing/ConstraintCollector.java 2003-11-06 16:16:53.049678100 -0800
@@ -285,6 +285,10 @@
{
right = resolver.typeVariable(RefType.v("java.lang.String"));
}
+ else if(r instanceof ClassConstant)
+ {
+ right = resolver.typeVariable(RefType.v("java.lang.Class"));
+ }
else if(r instanceof BinopExpr)
{
//******** BINOP EXPR ********
@@ -326,6 +330,10 @@
{
lop = resolver.typeVariable(RefType.v("java.lang.String"));
}
+ else if(lv instanceof ClassConstant)
+ {
+ lop = resolver.typeVariable(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -360,6 +368,10 @@
{
rop = resolver.typeVariable(RefType.v("java.lang.String"));
}
+ else if(rv instanceof ClassConstant)
+ {
+ rop = resolver.typeVariable(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
@@ -675,6 +687,10 @@
{
lop = resolver.typeVariable(RefType.v("java.lang.String"));
}
+ else if(lv instanceof ClassConstant)
+ {
+ lop = resolver.typeVariable(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -709,6 +725,10 @@
{
rop = resolver.typeVariable(RefType.v("java.lang.String"));
}
+ else if(rv instanceof ClassConstant)
+ {
+ rop = resolver.typeVariable(RefType.v("java.lang.Class"));
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/integer/ConstraintChecker.java soot/jimple/toolkits/typing/integer/ConstraintChecker.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/integer/ConstraintChecker.java 2003-07-25 15:02:30.453969000 -0700
+++ soot/jimple/toolkits/typing/integer/ConstraintChecker.java 2003-11-06 16:31:25.202852700 -0800
@@ -369,6 +369,9 @@
else if(r instanceof StringConstant)
{
}
+ else if(r instanceof ClassConstant)
+ {
+ }
else if(r instanceof BinopExpr)
{
//******** BINOP EXPR ********
@@ -441,6 +444,9 @@
else if(lv instanceof StringConstant)
{
}
+ else if(lv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -506,6 +512,9 @@
else if(rv instanceof StringConstant)
{
}
+ else if(rv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
@@ -998,6 +1007,9 @@
else if(lv instanceof StringConstant)
{
}
+ else if(lv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -1063,6 +1075,9 @@
else if(rv instanceof StringConstant)
{
}
+ else if(rv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
diff -aur vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/integer/ConstraintCollector.java soot/jimple/toolkits/typing/integer/ConstraintCollector.java
--- vendors/soot/2.0.1/soot/src/soot/jimple/toolkits/typing/integer/ConstraintCollector.java 2003-07-25 15:02:30.413910200 -0700
+++ soot/jimple/toolkits/typing/integer/ConstraintCollector.java 2003-11-06 16:30:49.700741200 -0800
@@ -306,6 +306,9 @@
else if(r instanceof StringConstant)
{
}
+ else if(r instanceof ClassConstant)
+ {
+ }
else if(r instanceof BinopExpr)
{
//******** BINOP EXPR ********
@@ -378,6 +381,9 @@
else if(lv instanceof StringConstant)
{
}
+ else if(lv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
@@ -443,6 +449,9 @@
else if(rv instanceof StringConstant)
{
}
+ else if(rv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());
@@ -824,11 +833,14 @@
{
}
else if(lv instanceof StringConstant)
- {
- }
+ {
+ }
+ else if(lv instanceof ClassConstant)
+ {
+ }
else
- {
- throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
+ {
+ throw new RuntimeException("Unhandled binary expression left operand type: " + lv.getClass());
}
//******** RIGHT ********
@@ -891,6 +903,9 @@
else if(rv instanceof StringConstant)
{
}
+ else if(rv instanceof ClassConstant)
+ {
+ }
else
{
throw new RuntimeException("Unhandled binary expression right operand type: " + rv.getClass());