diff options
| author | Mel <einebeere@gmail.com> | 2022-05-28 14:28:46 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-28 14:28:46 +0000 |
| commit | 2ddb215e3b0d3818b3fac8f315d97d8020eb699f (patch) | |
| tree | 80ab831b31a550751847f543cf4741f8d3449f2f /pkg/lang/vm/mem | |
| parent | 0a7700112f82e634a957685bee0cbaa3458f4945 (diff) | |
| download | jinx-2ddb215e3b0d3818b3fac8f315d97d8020eb699f.tar.zst jinx-2ddb215e3b0d3818b3fac8f315d97d8020eb699f.zip | |
Extract stack package and hide behind interface
Diffstat (limited to 'pkg/lang/vm/mem')
| -rw-r--r-- | pkg/lang/vm/mem/cell.go | 2 | ||||
| -rw-r--r-- | pkg/lang/vm/mem/mem.go | 32 |
2 files changed, 23 insertions, 11 deletions
diff --git a/pkg/lang/vm/mem/cell.go b/pkg/lang/vm/mem/cell.go index fcf9a50..830d382 100644 --- a/pkg/lang/vm/mem/cell.go +++ b/pkg/lang/vm/mem/cell.go @@ -39,5 +39,5 @@ type cell struct { } type CellData interface { - DropCell(*Mem) + DropCell(Mem) } diff --git a/pkg/lang/vm/mem/mem.go b/pkg/lang/vm/mem/mem.go index bdcf01f..a645ee2 100644 --- a/pkg/lang/vm/mem/mem.go +++ b/pkg/lang/vm/mem/mem.go @@ -1,6 +1,18 @@ package mem -type Mem struct { +type Mem interface { + Allocate(kind CellKind) (Ptr, error) + + Set(ptr Ptr, v CellData) error + Get(ptr Ptr) (CellData, error) + Is(ptr Ptr, kind CellKind) bool + Kind(ptr Ptr) CellKind + + Retain(ptr Ptr) error + Release(ptr Ptr) error +} + +type memImpl struct { cells []cell free []Ptr } @@ -11,13 +23,13 @@ func New() Mem { // Reserve NullPtr cells[NullPtr].kind = CellKindForbidden - return Mem{ + return &memImpl{ cells: cells, free: make([]Ptr, 0), } } -func (m *Mem) Allocate(kind CellKind) (Ptr, error) { +func (m *memImpl) Allocate(kind CellKind) (Ptr, error) { if len(m.free) > 0 { idx := m.free[len(m.free)-1] m.free = m.free[:len(m.free)-1] @@ -40,7 +52,7 @@ func (m *Mem) Allocate(kind CellKind) (Ptr, error) { } -func (m *Mem) Set(ptr Ptr, v CellData) error { +func (m *memImpl) Set(ptr Ptr, v CellData) error { if err := m.validPtr(ptr); err != nil { return err } @@ -49,7 +61,7 @@ func (m *Mem) Set(ptr Ptr, v CellData) error { return nil } -func (m *Mem) Get(ptr Ptr) (CellData, error) { +func (m *memImpl) Get(ptr Ptr) (CellData, error) { if err := m.validPtr(ptr); err != nil { return nil, err } @@ -57,7 +69,7 @@ func (m *Mem) Get(ptr Ptr) (CellData, error) { return m.cells[ptr].data, nil } -func (m *Mem) Is(ptr Ptr, kind CellKind) bool { +func (m *memImpl) Is(ptr Ptr, kind CellKind) bool { if ptr >= Ptr(len(m.cells)) { return false } @@ -65,7 +77,7 @@ func (m *Mem) Is(ptr Ptr, kind CellKind) bool { return m.cells[ptr].kind == kind } -func (m *Mem) Kind(ptr Ptr) CellKind { +func (m *memImpl) Kind(ptr Ptr) CellKind { if ptr >= Ptr(len(m.cells)) { return CellKindForbidden } @@ -73,7 +85,7 @@ func (m *Mem) Kind(ptr Ptr) CellKind { return m.cells[ptr].kind } -func (m *Mem) Retain(ptr Ptr) error { +func (m *memImpl) Retain(ptr Ptr) error { if err := m.validPtr(ptr); err != nil { return err } @@ -82,7 +94,7 @@ func (m *Mem) Retain(ptr Ptr) error { return nil } -func (m *Mem) Release(ptr Ptr) error { +func (m *memImpl) Release(ptr Ptr) error { if err := m.validPtr(ptr); err != nil { return err } @@ -99,7 +111,7 @@ func (m *Mem) Release(ptr Ptr) error { return nil } -func (m *Mem) validPtr(ptr Ptr) error { +func (m *memImpl) validPtr(ptr Ptr) error { if ptr >= Ptr(len(m.cells)) { return ErrInvalidMemAccess{ptr} } |
