/**
* Peephole optimization.
*/
private void peepHoleOptimization(MethodGenerator methodGen) {
InstructionList il = methodGen.getInstructionList();
InstructionFinder find = new InstructionFinder(il);
InstructionHandle ih;
String pattern;
// LoadInstruction, POP => (removed)
// pattern = "LoadInstruction POP";
// changed to lower case - changing to all lower case although only the instruction with capital I
// is creating a problem in the Turkish locale
pattern = "loadinstruction pop";
for (Iterator iter = find.search(pattern); iter.hasNext();) {
InstructionHandle[] match = (InstructionHandle[]) iter.next();
try {
if (!match[0].hasTargeters() && !match[1].hasTargeters()) {
il.delete(match[0], match[1]);
}
}
catch (TargetLostException e) {
// TODO: move target down into the list
}
}
// ILOAD_N, ILOAD_N, SWAP, ISTORE_N => ILOAD_N
// pattern = "ILOAD ILOAD SWAP ISTORE";
// changed to lower case - changing to all lower case although only the instruction with capital I
// is creating a problem in the Turkish locale
pattern = "iload iload swap istore";
for (Iterator iter = find.search(pattern); iter.hasNext();) {
InstructionHandle[] match = (InstructionHandle[]) iter.next();
try {
com.sun.org.apache.bcel.internal.generic.ILOAD iload1 =
(com.sun.org.apache.bcel.internal.generic.ILOAD) match[0].getInstruction();
com.sun.org.apache.bcel.internal.generic.ILOAD iload2 =
(com.sun.org.apache.bcel.internal.generic.ILOAD) match[1].getInstruction();
com.sun.org.apache.bcel.internal.generic.ISTORE istore =
(com.sun.org.apache.bcel.internal.generic.ISTORE) match[3].getInstruction();
if (!match[1].hasTargeters() &&
!match[2].hasTargeters() &&
!match[3].hasTargeters() &&
iload1.getIndex() == iload2.getIndex() &&
iload2.getIndex() == istore.getIndex())
{
il.delete(match[1], match[3]);
}
}
catch (TargetLostException e) {
// TODO: move target down into the list
}
}
// LoadInstruction_N, LoadInstruction_M, SWAP => LoadInstruction_M, LoadInstruction_N
// pattern = "LoadInstruction LoadInstruction SWAP";
// changed to lower case - changing to all lower case although only the instruction with capital I
// is creating a problem in the Turkish locale
pattern = "loadinstruction loadinstruction swap";
for (Iterator iter = find.search(pattern); iter.hasNext();) {
InstructionHandle[] match = (InstructionHandle[])iter.next();
try {
if (!match[0].hasTargeters() &&
!match[1].hasTargeters() &&
!match[2].hasTargeters())
{
Instruction load_m = match[1].getInstruction();
il.insert(match[0], load_m);
il.delete(match[1], match[2]);
}
}
catch (TargetLostException e) {
// TODO: move target down into the list
}
}
// ALOAD_N ALOAD_N => ALOAD_N DUP
// pattern = "ALOAD ALOAD";
// changed to lower case - changing to all lower case although only the instruction with capital I
// is creating a problem in the Turkish locale
pattern = "aload aload";
for (Iterator iter = find.search(pattern); iter.hasNext();) {
InstructionHandle[] match = (InstructionHandle[])iter.next();
try {
if (!match[1].hasTargeters()) {
com.sun.org.apache.bcel.internal.generic.ALOAD aload1 =
(com.sun.org.apache.bcel.internal.generic.ALOAD) match[0].getInstruction();