Browse Source

Fix issue in no-standard [new] instruction replace

A standard *new* construct bytecode will generate like:

```
new okhttp3/OkHttpClient
dup
invokespecial okhttp3/OkHttpClient <init> ()V
astore 1
```

but a few part of compiler will generate no-standard bytecode like:

```
new okhttp3/OkHttpClient
dup
astore 1
invokespecial okhttp3/OkHttpClient <init> ()V
```
which will cause javassist build stack error.

This commit will fix it
tags/rel_3_30_0_ga
LayHool 1 year ago
parent
commit
e447071657
No account linked to committer's email address
1 changed files with 14 additions and 1 deletions
  1. 14
    1
      src/main/javassist/expr/NewExpr.java

+ 14
- 1
src/main/javassist/expr/NewExpr.java View File

@@ -193,6 +193,14 @@ public class NewExpr extends Expr {
*/
int codeSize = canReplace();
int end = pos + codeSize;
//check isStoreBeforeInit ,such as : new xx/xx ; dup;[astoreN];invokespecial xx/xx;
int beforeStoreOp = 0;
int preOp = iterator.byteAt(currentPos - 1);
if (iterator.byteAt(newPos + 3) == Opcode.DUP
&& (preOp >= Opcode.ASTORE_0
&& preOp <= Opcode.ASTORE_3) && currentPos - newPos == 5) {
beforeStoreOp = preOp;
}
for (int i = pos; i < end; ++i)
iterator.writeByte(NOP, i);

@@ -230,7 +238,12 @@ public class NewExpr extends Expr {
if (codeSize > 3) // if the original code includes DUP.
bytecode.addAload(retVar);

replace0(pos, bytecode, bytecodeSize);
if (beforeStoreOp >= Opcode.ASTORE_0) {
bytecode.addOpcode(beforeStoreOp);
replace0(pos - 1, bytecode, bytecodeSize + 1);
} else {
replace0(pos, bytecode, bytecodeSize);
}
}
catch (CompileError e) { throw new CannotCompileException(e); }
catch (NotFoundException e) { throw new CannotCompileException(e); }

Loading…
Cancel
Save