summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-24 14:04:01 +0300
committerPaul Buetow <paul@buetow.org>2026-05-24 14:04:01 +0300
commitbe23ab5bd3ac953a0de50aeef6569ee783982d81 (patch)
tree8a392ea2c5578190b648e34a03579f16b49a5c95
parent7d754768b8d610015cdb016ecda54bbdad54fa6c (diff)
fix(rpn): restore stack values in popAll on partial failure (lj)
If stack.Pop() errors midway through the loop, already-popped values are pushed back in reverse order before returning the error, preventing stack corruption from concurrent modification or unexpected failures.
-rw-r--r--internal/rpn/operations_helpers.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/internal/rpn/operations_helpers.go b/internal/rpn/operations_helpers.go
index afdfa0e..03c0bb1 100644
--- a/internal/rpn/operations_helpers.go
+++ b/internal/rpn/operations_helpers.go
@@ -79,6 +79,10 @@ func popAll(stack *Stack, op string) ([]StackValue, error) {
for stack.Len() > 0 {
val, err := stack.Pop()
if err != nil {
+ // Restore already-popped values in reverse order (top of stack first).
+ for i := len(values) - 1; i >= 0; i-- {
+ stack.Push(values[i])
+ }
return nil, fmt.Errorf("%s: failed to pop: %w", op, err)
}
values = append(values, val)