Hello,
I had a problem with a new statement without DUP in the bytecode
(code like this :
void method {
new Object();
}
has no dup statement because the result isn't stored )
So I had the following error :
javassist.CannotCompileException: sorry, cannot edit NEW followed by no DUP
and I corrected it by changing the folowwing lines in NewExpr.java:
private int canReplace() throws CannotCompileException {
int op = iterator.byteAt(newPos + 3);
if (op == Opcode.DUP)
return 4;
else if (op == Opcode.DUP_X1
&& iterator.byteAt(newPos + 4) == Opcode.SWAP)
return 5;
else if (op == Opcode.INVOKESPECIAL)
return 3; // for Eclipse's compiler
else
throw new CannotCompileException(
"sorry, cannot edit NEW followed by no DUP");
}
by
private int canReplace() throws CannotCompileException {
int op = iterator.byteAt(newPos + 3);
if (op == Opcode.DUP)
return 4;
else if (op == Opcode.DUP_X1
&& iterator.byteAt(newPos + 4) == Opcode.SWAP)
return 5;
else if (op == Opcode.INVOKESPECIAL)
return 3; // for Eclipse's compiler
else
return 3;
}
(just the last else changed)
I don't know if this will always work correctly but in my case, it does (I'm instrumenting jetty, a java server with javassist).
By the way, I'm using eclipse and I've got the latest javassist version I think (3.6.0-2007)
thanks