From 3b034ea632ce21e30e112b344dcff2e8d112f917 Mon Sep 17 00:00:00 2001 From: Justus Garbe Date: Mon, 29 Jan 2024 14:39:44 +0100 Subject: [PATCH] fix: unmatched push and pop in stack manipulation --- .../compile/analysis/frame/ValuedFrame.java | 13 +++++++++++++ .../compile/analysis/frame/ValuedFrameImpl.java | 5 +++++ .../analysis/jvm/ValuedJvmAnalysisEngine.java | 12 ++++++------ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrame.java b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrame.java index 233d6fb..c3cf248 100644 --- a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrame.java +++ b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrame.java @@ -106,6 +106,13 @@ default Value pop(@NotNull ClassType type) { */ void push(@NotNull Value value); + /** + * Pushes a raw value onto the stack, without pushing a {@link me.darknet.assembler.compile.analysis.Values#VOID_VALUE} + * for {@link Types#LONG} and {@link Types#DOUBLE}. + * @param value Value to push onto the stack. + */ + void pushRaw(@NotNull Value value); + /** * @param values * Value to push onto the stack. @@ -115,4 +122,10 @@ default void push(@NotNull Value... values) { push(value); } } + + default void pushRaw(@NotNull Value... values) { + for (Value value : values) { + pushRaw(value); + } + } } diff --git a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrameImpl.java b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrameImpl.java index 69cd25b..28707fc 100644 --- a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrameImpl.java +++ b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/frame/ValuedFrameImpl.java @@ -172,6 +172,11 @@ public void push(@NotNull Value value) { stack.push(Values.VOID_VALUE); } + @Override + public void pushRaw(@NotNull Value value) { + stack.push(value); + } + @NotNull @Override public Value peek() { diff --git a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java index b44310f..f2f9180 100644 --- a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java +++ b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java @@ -56,38 +56,38 @@ public void execute(SimpleInstruction instruction) { case DUP_X1 -> { Value value1 = frame.pop(); Value value2 = frame.pop(); - frame.push(value1, value2, value1); + frame.pushRaw(value1, value2, value1); } case DUP_X2 -> { Value value1 = frame.pop(); Value value2 = frame.pop(); Value value3 = frame.pop(); - frame.push(value1, value3, value2, value1); + frame.pushRaw(value1, value3, value2, value1); } case DUP2 -> { Value value1 = frame.pop(); Value value2 = frame.pop(); - frame.push(value2, value1, value2, value1); + frame.pushRaw(value2, value1, value2, value1); } case DUP2_X1 -> { Value value1 = frame.pop(); Value value2 = frame.pop(); Value value3 = frame.pop(); - frame.push(value2, value1, value3, value2, value1); + frame.pushRaw(value2, value1, value3, value2, value1); } case DUP2_X2 -> { Value value1 = frame.pop(); Value value2 = frame.pop(); Value value3 = frame.pop(); Value value4 = frame.pop(); - frame.push(value2, value1, value4, value3, value2, value1); + frame.pushRaw(value2, value1, value4, value3, value2, value1); } case POP, IRETURN, FRETURN, ARETURN, MONITORENTER, MONITOREXIT -> frame.pop(); case POP2, LRETURN, DRETURN -> frame.pop2(); case SWAP -> { Value value1 = frame.pop(); Value value2 = frame.pop(); - frame.push(value1, value2); + frame.pushRaw(value1, value2); } case INEG, FNEG -> { Value value = frame.pop();