diff --git a/pkg/vm/slot.go b/pkg/vm/slot.go new file mode 100644 index 000000000..e5a3d928d --- /dev/null +++ b/pkg/vm/slot.go @@ -0,0 +1,29 @@ +package vm + +// Slot is a fixed-size slice of stack items. +type Slot struct { + storage []StackItem +} + +// newSlot returns new slot of n items. +func newSlot(n int) *Slot { + return &Slot{ + storage: make([]StackItem, n), + } +} + +// Set sets i-th storage slot. +func (s *Slot) Set(i int, item StackItem) { + s.storage[i] = item +} + +// Get returns item contained in i-th slot. +func (s *Slot) Get(i int) StackItem { + if item := s.storage[i]; item != nil { + return item + } + return NullItem{} +} + +// Size returns slot size. +func (s *Slot) Size() int { return len(s.storage) } diff --git a/pkg/vm/slot_test.go b/pkg/vm/slot_test.go new file mode 100644 index 000000000..49684e73a --- /dev/null +++ b/pkg/vm/slot_test.go @@ -0,0 +1,21 @@ +package vm + +import ( + "math/big" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSlot_Get(t *testing.T) { + s := newSlot(3) + require.NotNil(t, s) + require.Equal(t, 3, s.Size()) + + // NullItem is the default + item := s.Get(2) + require.Equal(t, NullItem{}, item) + + s.Set(1, NewBigIntegerItem(big.NewInt(42))) + require.Equal(t, NewBigIntegerItem(big.NewInt(42)), s.Get(1)) +}