From 3fa3e5acec6ce642c4d336cf9f0f0ab4680bf17a Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 16 Apr 2023 20:10:57 +0100 Subject: [PATCH] fix: correct args shift for instance invoke-custom (#1816) --- .../main/java/jadx/core/codegen/InsnGen.java | 3 +- .../java8/TestLambdaInstance2.java | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/java8/TestLambdaInstance2.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 285f9a63e..80c0ecdc7 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -1014,9 +1014,10 @@ public class InsnGen { // force set external arg names into call method args int extArgsCount = customNode.getArgsCount(); int startArg = customNode.getHandleType() == MethodHandleType.INVOKE_STATIC ? 0 : 1; // skip 'this' arg + int callArg = 0; for (int i = startArg; i < extArgsCount; i++) { RegisterArg extArg = (RegisterArg) customNode.getArg(i); - RegisterArg callRegArg = callArgs.get(i); + RegisterArg callRegArg = callArgs.get(callArg++); callRegArg.getSVar().setCodeVar(extArg.getSVar().getCodeVar()); } code.add(" -> {"); diff --git a/jadx-core/src/test/java/jadx/tests/integration/java8/TestLambdaInstance2.java b/jadx-core/src/test/java/jadx/tests/integration/java8/TestLambdaInstance2.java new file mode 100644 index 000000000..c1cefa3cc --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/java8/TestLambdaInstance2.java @@ -0,0 +1,36 @@ +package jadx.tests.integration.java8; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestLambdaInstance2 extends IntegrationTest { + + public static class TestCls { + private String field; + + public Runnable test(String str, int i) { + return () -> call(str, i); + } + + public void call(String str, int i) { + field = str + '=' + i; + } + + public void check() throws Exception { + field = ""; + test("num", 7).run(); + assertThat(field).isEqualTo("num=7"); + } + } + + @Test + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .doesNotContain("lambda$") + .containsOne("call(str, i)"); + } +}