aboutsummaryrefslogtreecommitdiff
path: root/pkg/lang/vm/mem
diff options
context:
space:
mode:
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}
}