in src/main/java/org/apache/commons/compress/harmony/pack200/BcBands.java [398:454]
public void visitMethodInsn(int opcode, final String owner, final String name, final String desc) {
byteCodeOffset += 3;
switch (opcode) {
case 182: // invokevirtual
case 183: // invokespecial
case 184: // invokestatic
boolean aload_0 = false;
if (bcCodes.size() > 0 && bcCodes.get(bcCodes.size() - 1) == ALOAD_0) {
bcCodes.remove(bcCodes.size() - 1);
aload_0 = true;
opcode += 7;
}
if (owner.equals(currentClass)) {
opcode += 24; // change to invokevirtual_this,
// invokespecial_this etc.
if (name.equals("<init>") && opcode == 207) {
opcode = 230; // invokespecial_this_init
bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
} else {
bcThisMethod.add(cpBands.getCPMethod(owner, name, desc));
}
} else if (owner.equals(superClass)) { // TODO
opcode += 38; // change to invokevirtual_super,
// invokespecial_super etc.
if (name.equals("<init>") && opcode == 221) {
opcode = 231; // invokespecial_super_init
bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
} else {
bcSuperMethod.add(cpBands.getCPMethod(owner, name, desc));
}
} else {
if (aload_0) {
opcode -= 7;
bcCodes.add(ALOAD_0); // add aload_0 back in
// because there's no
// special rewrite in this
// case.
}
if (name.equals("<init>") && opcode == 183 && owner.equals(currentNewClass)) {
opcode = 232; // invokespecial_new_init
bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
} else {
bcMethodRef.add(cpBands.getCPMethod(owner, name, desc));
}
}
bcCodes.add(opcode);
break;
case 185: // invokeinterface
byteCodeOffset += 2;
final CPMethodOrField cpIMethod = cpBands.getCPIMethod(owner, name, desc);
bcIMethodRef.add(cpIMethod);
bcCodes.add(INVOKEINTERFACE);
break;
}
updateRenumbering();
}