fix: wrap negative literals before cast (#1327)
This commit is contained in:
@@ -112,7 +112,7 @@ public class InsnGen {
|
||||
}
|
||||
code.add(mgen.getNameGen().useArg(reg));
|
||||
} else if (arg.isLiteral()) {
|
||||
code.add(lit((LiteralArg) arg));
|
||||
addLiteralArg(code, (LiteralArg) arg, flags);
|
||||
} else if (arg.isInsnWrap()) {
|
||||
addWrappedArg(code, (InsnWrapArg) arg, flags);
|
||||
} else if (arg.isNamed()) {
|
||||
@@ -122,6 +122,15 @@ public class InsnGen {
|
||||
}
|
||||
}
|
||||
|
||||
private void addLiteralArg(ICodeWriter code, LiteralArg litArg, Set<Flags> flags) {
|
||||
String literalStr = lit(litArg);
|
||||
if (!flags.contains(Flags.BODY_ONLY_NOWRAP) && literalStr.startsWith("-")) {
|
||||
code.add('(').add(literalStr).add(')');
|
||||
} else {
|
||||
code.add(literalStr);
|
||||
}
|
||||
}
|
||||
|
||||
private void addWrappedArg(ICodeWriter code, InsnWrapArg arg, Set<Flags> flags) throws CodegenException {
|
||||
InsnNode wrapInsn = arg.getWrapInsn();
|
||||
if (wrapInsn.contains(AFlag.FORCE_ASSIGN_INLINE)) {
|
||||
|
||||
@@ -508,7 +508,17 @@ public class InsnDecoder {
|
||||
private InsnNode makeNewArray(InsnData insn) {
|
||||
ArgType indexType = ArgType.parse(insn.getIndexAsType());
|
||||
int dim = (int) insn.getLiteral();
|
||||
ArgType arrType = dim == 0 ? indexType : ArgType.array(indexType, dim);
|
||||
ArgType arrType;
|
||||
if (dim == 0) {
|
||||
arrType = indexType;
|
||||
} else {
|
||||
if (indexType.isArray()) {
|
||||
// java bytecode can pass array as a base type
|
||||
arrType = indexType;
|
||||
} else {
|
||||
arrType = ArgType.array(indexType, dim);
|
||||
}
|
||||
}
|
||||
int regsCount = insn.getRegsCount();
|
||||
NewArrayNode newArr = new NewArrayNode(arrType, regsCount - 1);
|
||||
newArr.setResult(InsnArg.reg(insn, 0, arrType));
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package jadx.tests.integration.invoke;
|
||||
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
import jadx.tests.api.extensions.profiles.TestProfile;
|
||||
import jadx.tests.api.extensions.profiles.TestWithProfiles;
|
||||
|
||||
import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
|
||||
|
||||
public class TestOverloadedInvoke extends IntegrationTest {
|
||||
|
||||
public static class TestCls {
|
||||
public static final int N = 10;
|
||||
|
||||
public void test() {
|
||||
int[][][] arr = new int[N][N][N];
|
||||
use(arr, -1);
|
||||
use(arr[0], -2);
|
||||
}
|
||||
|
||||
public void use(Object[][] arr, Object obj) {
|
||||
}
|
||||
|
||||
public void use(int[][] arr, int i) {
|
||||
}
|
||||
}
|
||||
|
||||
@TestWithProfiles({ TestProfile.DX_J8, TestProfile.D8_J11, TestProfile.JAVA8 })
|
||||
public void test() {
|
||||
noDebugInfo();
|
||||
assertThat(getClassNode(TestCls.class))
|
||||
.code()
|
||||
.containsOne("use(iArr[0], -2);")
|
||||
.containsOne("use((Object[][]) iArr, (Object) (-1));");
|
||||
// TODO: don't add unnecessary casts
|
||||
// .containsOne("use(iArr, -1);");
|
||||
// TODO: replace call `Array.newInstance` with new array creation: `new int[N][N][N]`
|
||||
// .containsOne("new int[10][10][10];");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user