From 1eb9d03b155738b519900443440ac782c1d8c8ba Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 29 May 2005 22:01:31 +0000 Subject: [PATCH] checkpoint darcs-hash:20050529220131-5007d-e41bcef034c7e0246980698a6a5ae991b9216ae7.gz --- src/org/ibex/arenaj/Main.java | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/org/ibex/arenaj/Main.java b/src/org/ibex/arenaj/Main.java index 50982a6..abf7552 100644 --- a/src/org/ibex/arenaj/Main.java +++ b/src/org/ibex/arenaj/Main.java @@ -232,7 +232,7 @@ public class Main extends SceneTransformer { for(Iterator it = sc.getMethods().iterator(); it.hasNext();) { SootMethod m = (SootMethod)it.next(); - if (!m.isConcrete()) continue; + if (!m.isConcrete() || !m.hasActiveBody()) continue; boolean doremove = true; Body mincBody = m.getActiveBody(); if (implementsGladiator(m.getDeclaringClass()) && m.getName().equals("")) { @@ -261,9 +261,8 @@ public class Main extends SceneTransformer { } } else if (u instanceof InvokeStmt) { InvokeExpr ie = ((InvokeStmt)u).getInvokeExpr(); - SootMethod meth = ie.getMethod(); - System.out.println(meth.getName()); - if (meth.getDeclaringClass().getName().equals("java.lang.Object") && meth.getName().equals("")) + SootMethodRef meth = ie.getMethodRef(); + if (meth.declaringClass().getName().equals("java.lang.Object") && meth.name().equals("")) mincBody.getUnits().remove(u); } } @@ -410,6 +409,8 @@ public class Main extends SceneTransformer { Local l = (Local)it.next(); if (implementsGladiator(l.getType())) l.setType(IntType.v()); } + if (!smeth.isStatic()) + body.getThisLocal().setType(ownerClass.getType()); for(int qq=0; qq<2; qq++) for(Iterator stmtIt = units.snapshotIterator(); stmtIt.hasNext();) { Stmt s = (Stmt) stmtIt.next(); if (s instanceof DefinitionStmt) { @@ -422,7 +423,9 @@ public class Main extends SceneTransformer { if (((ReturnStmt)s).getOp().getType() instanceof NullType) ((ReturnStmt)s).getOpBox().setValue(IntConstant.v(-1)); List l = s.getUseAndDefBoxes(); - for(Iterator it = l.iterator(); it.hasNext();) { + List l2l = new LinkedList(); + l2l.addAll(l); + for(Iterator it = l2l.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof ValueBox) { ValueBox vb = (ValueBox)o; @@ -447,7 +450,8 @@ public class Main extends SceneTransformer { Local ll = viaLocal(invokeExpr, body, s); vb.setValue(ll); v = ll; - continue; + qq = 0; + break; } } else @@ -470,7 +474,7 @@ public class Main extends SceneTransformer { //pl.remove(0); } pl.add(IntType.v()); - li.add(viaLocal(iie.getBase(),body,s)); + li.add(/*viaLocal(*/iie.getBase()/*,body,s)*/); SootClass sc = mr.declaringClass(); name = sc.getShortName().substring(sc.getShortName().lastIndexOf('$')+1) + "$$" + name; mr = Scene.v().makeMethodRef(getArenaForGladiator(sc), @@ -549,21 +553,33 @@ public class Main extends SceneTransformer { break; } - } else if (v instanceof InstanceFieldRef) { - InstanceFieldRef ifr = (InstanceFieldRef)v; + } else if (v instanceof FieldRef) { + FieldRef ifr = (FieldRef)v; SootFieldRef fr = ifr.getFieldRef(); Type t = fr.type(); if (implementsGladiator(fr.declaringClass()) && fr.name().equals("this$0")) { vb.setValue(body.getThisLocal()); } else if (implementsGladiator(fr.declaringClass())) { SootClass arena = getArenaForGladiator(fr.declaringClass()); - InstanceFieldRef sfr = newIFR(body, getSliceForField(fr)); - vb.setValue(Jimple.v().newArrayRef(viaLocal(sfr, body, s), ifr.getBase())); + if (fr.isStatic()) { + vb.setValue(newIFR(body, getSliceForField(fr))); + } else { + InstanceFieldRef sfr = newIFR(body, getSliceForField(fr)); + vb.setValue(Jimple.v().newArrayRef(viaLocal(sfr, body, s), ((InstanceFieldRef)ifr).getBase())); + } } if ((t instanceof RefType) && implementsGladiator(((RefType)t).getSootClass())) { SootClass tc = ((RefType)t).getSootClass(); SootClass arena = getArenaForGladiator(tc); - ifr.setFieldRef(Scene.v().makeFieldRef(arena, fr.name(), IntType.v(), false)); + ifr.setFieldRef(Scene.v().makeFieldRef(arena, fr.name(), IntType.v(), fr.isStatic())); + } else if (t instanceof ArrayType) { + ArrayType at = (ArrayType)t; + Type et = at.getElementType(); + if (et instanceof RefType && implementsGladiator(((RefType)et).getSootClass())) + ifr.setFieldRef(Scene.v().makeFieldRef(fr.declaringClass(), + fr.name(), + IntType.v().makeArrayType(), + fr.isStatic())); } } -- 1.7.10.4