about summary refs log tree commit diff
path: root/pkg/lang/vm/mem
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-28 14:28:46 +0000
committerGitHub <noreply@github.com>2022-05-28 14:28:46 +0000
commit2ddb215e3b0d3818b3fac8f315d97d8020eb699f (patch)
tree80ab831b31a550751847f543cf4741f8d3449f2f /pkg/lang/vm/mem
parent0a7700112f82e634a957685bee0cbaa3458f4945 (diff)
downloadjinx-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.go2
-rw-r--r--pkg/lang/vm/mem/mem.go32
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}
 	}