Skip to content

Commit

Permalink
fix: unmatched push and pop in stack manipulation
Browse files Browse the repository at this point in the history
  • Loading branch information
jumanji144 committed Jan 29, 2024
1 parent 701d2bc commit 3b034ea
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -115,4 +122,10 @@ default void push(@NotNull Value... values) {
push(value);
}
}

default void pushRaw(@NotNull Value... values) {
for (Value value : values) {
pushRaw(value);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 3b034ea

Please sign in to comment.