diff --git a/core/vm/stack.libevm.go b/core/vm/stack.libevm.go new file mode 100644 index 000000000000..bc16735276cd --- /dev/null +++ b/core/vm/stack.libevm.go @@ -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() } diff --git a/core/vm/stack.libevm_test.go b/core/vm/stack.libevm_test.go new file mode 100644 index 000000000000..f6ce05e1a6bc --- /dev/null +++ b/core/vm/stack.libevm_test.go @@ -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") +}