From 4e82233cbce93064ac3ae0a996ee7dcfa5de1687 Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Mon, 26 Jan 2026 18:51:39 +0000 Subject: [PATCH] fix(java-input): fix `dup2_x1` stack to regs conversion for wide types (#2755) --- .../tests/integration/jbc/TestDup2x1.java | 26 +++++++++++++++++++ .../java/data/code/JavaInsnsRegister.java | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/jbc/TestDup2x1.java diff --git a/jadx-core/src/test/java/jadx/tests/integration/jbc/TestDup2x1.java b/jadx-core/src/test/java/jadx/tests/integration/jbc/TestDup2x1.java new file mode 100644 index 000000000..6267d5c48 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/jbc/TestDup2x1.java @@ -0,0 +1,26 @@ +package jadx.tests.integration.jbc; + +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 TestDup2x1 extends IntegrationTest { + + @SuppressWarnings({ "FieldCanBeLocal", "checkstyle:InnerAssignment", "unused" }) + public static class TestCls { + private long value; + + public long setValue(long v) { + return this.value = v; + } + } + + @TestWithProfiles(TestProfile.JAVA11) + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("this.value = v;"); + } +} diff --git a/jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnsRegister.java b/jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnsRegister.java index a5d1a38f5..031bac4c7 100644 --- a/jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnsRegister.java +++ b/jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnsRegister.java @@ -310,7 +310,7 @@ public class JavaInsnsRegister { s.peekFrom(4, 8).peekFrom(1, 9); } else { s.insn().setRegsCount(6); - s.insert(2, WIDE); + s.insert(1, WIDE); s.peekFrom(0, 0).peekFrom(1, 1); s.peekFrom(1, 2).peekFrom(2, 3); s.peekFrom(2, 4).peekFrom(0, 5);