pop stack more, I dont know if this is right, but maps a couple more fields

This commit is contained in:
Adam
2016-02-12 13:30:01 -05:00
parent d4b148f72a
commit cdc949abe0
6 changed files with 88 additions and 141 deletions

View File

@@ -136,17 +136,17 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
// switch frame order in executor frame list // switch frame order in executor frame list
Execution e = f1.getExecution(), // Execution e = f1.getExecution(),
e2 = f2.getExecution(); // e2 = f2.getExecution();
//
int i = e2.frames.indexOf(f2), // int i = e2.frames.indexOf(f2),
i2 = e2.frames.indexOf(branch2); // i2 = e2.frames.indexOf(branch2);
//
e2.frames.remove(i); // e2.frames.remove(i);
e2.frames.add(i, branch2); // e2.frames.add(i, branch2);
//
e2.frames.remove(i2); // e2.frames.remove(i2);
e2.frames.add(i2, f2); // e2.frames.add(i2, f2);
} }
@Override @Override

View File

@@ -139,17 +139,17 @@ public abstract class If0 extends Instruction implements JumpingInstruction, Com
// switch frame order in executor frame list // switch frame order in executor frame list
Execution e = f1.getExecution(), // Execution e = f1.getExecution(),
e2 = f2.getExecution(); // e2 = f2.getExecution();
//
int i = e2.frames.indexOf(f2), // int i = e2.frames.indexOf(f2),
i2 = e2.frames.indexOf(branch2); // i2 = e2.frames.indexOf(branch2);
//
e2.frames.remove(i); // e2.frames.remove(i);
e2.frames.add(i, branch2); // e2.frames.add(i, branch2);
//
e2.frames.remove(i2); // e2.frames.remove(i2);
e2.frames.add(i2, f2); // e2.frames.add(i2, f2);
} }
@Override @Override

View File

@@ -27,7 +27,7 @@ public class MethodSignatureMapper
{ {
for (Method m : c1.getMethods().getMethods()) for (Method m : c1.getMethods().getMethods())
{ {
if (m.isStatic() || m.getName().equals("<init>") || count(c1.getMethods(), m.getDescriptor()) > 1) if (m.isStatic() || count(c1.getMethods(), m.getDescriptor()) > 1)
continue; continue;
Method other = get(c2.getMethods(), m.getDescriptor()); Method other = get(c2.getMethods(), m.getDescriptor());

View File

@@ -12,7 +12,7 @@ public class ParallelExecutorMapping
{ {
private ClassGroup group, group2; private ClassGroup group, group2;
private Map<Object, Object> map = new HashMap<>(); private Map<Object, Object> map = new HashMap<>();
private List<Object> order = new ArrayList<>(); //private List<Object> order = new ArrayList<>();
public Method m1, m2; public Method m1, m2;
public ParallelExecutorMapping(ClassGroup group, ClassGroup group2) public ParallelExecutorMapping(ClassGroup group, ClassGroup group2)
@@ -39,7 +39,7 @@ public class ParallelExecutorMapping
belongs(two, group2); belongs(two, group2);
map.put(one, two); map.put(one, two);
order.add(one); //order.add(one);
} }
public Object get(Object o) public Object get(Object o)
@@ -52,7 +52,7 @@ public class ParallelExecutorMapping
return map; return map;
} }
public List<Object> getOrder() { return order; } //public List<Object> getOrder() { return order; }
private void belongs(Object o, ClassGroup to) private void belongs(Object o, ClassGroup to)
{ {

View File

@@ -51,6 +51,8 @@ public class ParallellMappingExecutor
return step(); return step();
} }
//assert e2.frames.contains(f2);
// assert f1.other.other == f1; // assert f1.other.other == f1;
// assert f2.other.other == f2; // assert f2.other.other == f2;
@@ -64,94 +66,16 @@ public class ParallellMappingExecutor
// as not executing // as not executing
if (!f1.isExecuting() || !f2.isExecuting()) if (!f1.isExecuting() || !f2.isExecuting())
{ {
// assert f1.returnTo == null || !e.frames.contains(f1.returnTo); // assert f1.returnTo == null;
// assert f2.returnTo == null || !e2.frames.contains(f2.returnTo); // assert f2.returnTo == null;
//
// // get the previous instruction. if this frame is the result of a fork and there isn't any, get the fork instruction
// InstructionContext fork1 = f1.getInstructions().isEmpty() ? f1.forking : f1.getInstructions().get(f1.getInstructions().size() - 1);
// InstructionContext fork2 = f2.getInstructions().isEmpty() ? f2.forking : f2.getInstructions().get(f2.getInstructions().size() - 1);
//
// assert fork1 != null;
// assert fork2 != null;
//
// if (!(f1.getInstructions().isEmpty() == f2.getInstructions().isEmpty()))
// {
// int i = 5;
// }
//
// // Due to jump ob one side can stop while the other side jumps. So we need to remove the excess frames to keep it in line.
//
// if (fork1 == f1.forking)
// {
// // if f1 was forked, remove source frame.
//
// assert fork1.getBranches().size() == 1;
// //assert fork1.getBranches().get(0) == f1;
//
// int i1 = e.frames.indexOf(fork1.getFrame()); // this might be -1 because it is now in an invokestatic. AHhh.
// if (i1 == -1)
// {
// i1 = e.frames.indexOf(fork1.getFrame().returnTo);
// //XXX returnframes are diff objects is why?
// }
// int i2 = e.frames.indexOf(fork1.getBranches().get(0));
//
// // remove fork1.frame
// e.frames.remove(fork1.getFrame());
// //e.frames.remove(fork1.getBranches().get(0));
// }
// else
// {
// //p1 = f1.getInstructions().get(f1.getInstructions().size() - 1);
//
// for (Frame branch : fork1.getBranches())
// {
// e.frames.remove(branch);
// }
// }
//
// // this is empty but should be removing a branch, because of the map other, theres no prev instruction.
// // should always populate prev instruction
// //if (f2.getInstructions().size() > 0)
// if (fork2 == f2.forking)
// {
// assert fork2.getBranches().size() == 1;
// //assert fork2.getBranches().get(0) == f2;
//
// int i1 = e2.frames.indexOf(fork2.getFrame());
// int i2 = e2.frames.indexOf(fork2.getBranches().get(0));
//
// e2.frames.remove(fork2.getFrame());
// //e.frames.remove(fork2.getBranches().get(0));
// }
// else
// {
// //p2 = f2.getInstructions().get(f2.getInstructions().size() - 1);
//
// for (Frame branch : fork2.getBranches())
// {
// e2.frames.remove(branch);
// }
// }
//assert e.frames.get(0) == f1; // XXX I dont know if this is right! only helps a few fields.
//assert e2.frames.get(0) == f2; popStack(f1);
popStack(f2);
e.frames.remove(f1); e.frames.remove(f1);
e2.frames.remove(f2); e2.frames.remove(f2);
// Frame f1wtf = e.frames.get(0),
// f2wtf = e2.frames.get(0);
//
// int otherIndex1 = e2.frames.indexOf(f1wtf.other),
// otherIndex2 = e.frames.indexOf(f2wtf.other);
//
// // assert f1wtf.other.other == f1wtf;
// // assert f2wtf.other.other == f2wtf;
//
// assert f1wtf.other == f2wtf;
// assert f2wtf.other == f1wtf;
step1 = step2 = true; step1 = step2 = true;
return step(); return step();
@@ -344,10 +268,17 @@ public class ParallellMappingExecutor
f2.created = is; f2.created = is;
f2.initialize(i); f2.initialize(i);
assert e.frames.contains(f); // assert e.frames.contains(f);
int idx = e.frames.indexOf(f); if (e.frames.contains(f))
e.frames.remove(f); // old frame goes away {
e.frames.add(idx, f2); int idx = e.frames.indexOf(f);
e.frames.remove(f); // old frame goes away
e.frames.add(idx, f2);
}
else
{
e.frames.add(f);
}
assert f.other.other == f; assert f.other.other == f;
@@ -370,9 +301,12 @@ public class ParallellMappingExecutor
if (f.isExecuting() || f.returnTo == null) if (f.isExecuting() || f.returnTo == null)
return f; return f;
InstructionContext i = f.getInstructions().get(f.getInstructions().size() - 1); // if (!f.getInstructions().isEmpty())
if (!(i.getInstruction() instanceof ReturnInstruction)) // return f;
return f; //
// InstructionContext i = f.getInstructions().get(f.getInstructions().size() - 1);
// if (!(i.getInstruction() instanceof ReturnInstruction))
// return f;
Frame r = popStackForce(f); Frame r = popStackForce(f);
@@ -390,14 +324,21 @@ public class ParallellMappingExecutor
assert f.returnTo != null; assert f.returnTo != null;
assert e.frames.contains(f); //assert e.frames.contains(f);
assert !e.frames.contains(f.returnTo); assert !e.frames.contains(f.returnTo);
// replace frame with returnTo if (e.frames.contains(f))
int idx = e.frames.indexOf(f); {
e.frames.remove(f); // replace frame with returnTo
assert !e.frames.contains(f.returnTo); int idx = e.frames.indexOf(f);
e.frames.add(idx, f.returnTo); e.frames.remove(f);
assert !e.frames.contains(f.returnTo);
e.frames.add(idx, f.returnTo);
}
else
{
e.frames.add(f.returnTo);
}
assert f.other.other == f; assert f.other.other == f;
assert f.returnTo.other == null; assert f.returnTo.other == null;

View File

@@ -88,13 +88,13 @@ public class MapStaticTest
ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); ClassGroup group1 = JarUtil.loadJar(new File(JAR1));
ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); ClassGroup group2 = JarUtil.loadJar(new File(JAR2));
Method m1 = group1.findClass("client").findMethod("vmethod3054"); Method m1 = group1.findClass("class92").findMethod("method2176");
Method m2 = group2.findClass("client").findMethod("vmethod2973"); Method m2 = group2.findClass("client").findMethod("method540");
ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
System.out.println("BEGIN OF MAPPING"); System.out.println("BEGIN OF MAPPING");
for (Object o : mappings.getOrder()) for (Object o : mappings.getMap().keySet())
{ {
Object value = mappings.get(o); Object value = mappings.get(o);
System.out.println(o + " <-> " + value); System.out.println(o + " <-> " + value);
@@ -116,8 +116,8 @@ public class MapStaticTest
ClassGroup group1 = JarUtil.loadJar(new File(JAR1)); ClassGroup group1 = JarUtil.loadJar(new File(JAR1));
ClassGroup group2 = JarUtil.loadJar(new File(JAR2)); ClassGroup group2 = JarUtil.loadJar(new File(JAR2));
Method m1 = group1.findClass("client").findMethod("vmethod3096"); Method m1 = group1.findClass("class92").findMethod("method2176");
Method m2 = group2.findClass("client").findMethod("vmethod2975"); Method m2 = group2.findClass("client").findMethod("method540");
HashMap<Object, Object> all = new HashMap(); HashMap<Object, Object> all = new HashMap();
List<ParallelExecutorMapping> pmes = new ArrayList<>(); List<ParallelExecutorMapping> pmes = new ArrayList<>();
@@ -127,7 +127,13 @@ public class MapStaticTest
for (ParallelExecutorMapping pme : pmes) for (ParallelExecutorMapping pme : pmes)
finalm.merge(pme); finalm.merge(pme);
//summary(finalm); System.out.println("BEGIN OF MAPPING");
for (Object o : finalm.getMap().keySet())
{
Object value = finalm.get(o);
System.out.println(o + " <-> " + value);
}
System.out.println("END OF MAPPINGS " + finalm.getMap().size());
} }
//@Test //@Test
@@ -237,18 +243,18 @@ public class MapStaticTest
System.out.println("GROUP 1 " + sg1); System.out.println("GROUP 1 " + sg1);
System.out.println("GROUP 2 " + sg2); System.out.println("GROUP 2 " + sg2);
// System.out.println("db step " + ParallellMappingExecutor.doubleStep.size());
//
// for (Method m : group1.findClass("client").getMethods().getMethods()) for (Method m : group1.findClass("client").getMethods().getMethods())
// { {
// if (!finalm.getMap().containsKey(m) && !m.isStatic()) if (!finalm.getMap().containsKey(m))
// System.out.println("missing " + m); System.out.println("missing " + m);
// } }
// for (Field m : group1.findClass("client").getFields().getFields()) for (Field m : group1.findClass("client").getFields().getFields())
// { {
// if (!finalm.getMap().containsKey(m)) if (!finalm.getMap().containsKey(m))
// System.out.println("missing " + m); System.out.println("missing " + m);
// } }
} }
//@Test //@Test