From d2f69dccb3643834a79da79be4ece189a7178c9e Mon Sep 17 00:00:00 2001 From: Mel Date: Sun, 29 May 2022 21:42:32 +0000 Subject: Types, Methods and basic Core Lib --- pkg/lang/vm/mem/mem.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'pkg/lang/vm/mem/mem.go') diff --git a/pkg/lang/vm/mem/mem.go b/pkg/lang/vm/mem/mem.go index 0f15743..6c1d58d 100644 --- a/pkg/lang/vm/mem/mem.go +++ b/pkg/lang/vm/mem/mem.go @@ -2,6 +2,7 @@ package mem type Mem interface { Allocate(kind CellKind) (Ptr, error) + AllocateAt(ptr Ptr, kind CellKind) error Set(ptr Ptr, v CellData) error Get(ptr Ptr) (CellData, error) @@ -55,7 +56,36 @@ func (m *memImpl) Allocate(kind CellKind) (Ptr, error) { m.cells = append(m.cells, cell{kind: kind, refs: 1}) return Ptr(idx), nil } +} + +func (m *memImpl) AllocateAt(ptr Ptr, kind CellKind) error { + if kind == CellKindForbidden || kind == CellKindEmpty { + return ErrInvalidCellKind{kind} + } + + if ptr < Ptr(len(m.cells)) && m.cells[ptr].kind != CellKindEmpty { + return ErrInvalidMemAccess{ptr} + } + + if ptr > 10000 { + return ErrMemOverflow + } + if ptr >= Ptr(len(m.cells)) { + m.cells = append(m.cells, make([]cell, ptr-Ptr(len(m.cells))+1)...) + } + + m.cells[ptr] = cell{kind: kind, refs: 1} + + // Remove cell from free list, if it was there. + for i, f := range m.free { + if f == ptr { + m.free = append(m.free[:i], m.free[i+1:]...) + break + } + } + + return nil } func (m *memImpl) Set(ptr Ptr, v CellData) error { -- cgit 1.4.1