Skip to content

Commit

Permalink
feat: vm.MutableStack wrapper (#31)
Browse files Browse the repository at this point in the history
* feat: `vm.MutableStack` wrapper

* refactor: use `require.Empty()`
  • Loading branch information
ARR4N authored Sep 18, 2024
1 parent c70b3e3 commit df13389
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
14 changes: 14 additions & 0 deletions core/vm/stack.libevm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package vm

import "github.com/holiman/uint256"

// A MutableStack embeds a Stack to expose unexported mutation methods.
type MutableStack struct {
*Stack
}

// Push pushes a value to the stack.
func (s MutableStack) Push(d *uint256.Int) { s.Stack.push(d) }

// Pop pops a value from the stack.
func (s MutableStack) Pop() uint256.Int { return s.Stack.pop() }
27 changes: 27 additions & 0 deletions core/vm/stack.libevm_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package vm_test

import (
"testing"

"github.com/holiman/uint256"
"github.com/stretchr/testify/require"

"github.com/ethereum/go-ethereum/core/vm"
)

func TestMutableStack(t *testing.T) {
s := &vm.Stack{}
m := vm.MutableStack{Stack: s}

push := func(u uint64) uint256.Int {
u256 := uint256.NewInt(u)
m.Push(u256)
return *u256
}

require.Empty(t, s.Data(), "new stack")
want := []uint256.Int{push(42), push(314159), push(142857)}
require.Equalf(t, want, s.Data(), "after pushing %d values to empty stack", len(want))
require.Equal(t, want[len(want)-1], m.Pop(), "popped value")
require.Equal(t, want[:len(want)-1], s.Data(), "after popping a single value")
}

0 comments on commit df13389

Please sign in to comment.