diff options
| author | Mel <einebeere@gmail.com> | 2022-05-27 23:34:40 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 23:34:40 +0000 |
| commit | 83d1dc87f3336d70ccda476627c70c282b7b6e11 (patch) | |
| tree | 70610879d3de1ddf02bbe9067076fe65b52979a9 /pkg/lang/vm/mem/mem.go | |
| parent | 47c4cd3705bee9d7154c42ce95aef6f8a19e0661 (diff) | |
| download | jinx-83d1dc87f3336d70ccda476627c70c282b7b6e11.tar.zst jinx-83d1dc87f3336d70ccda476627c70c282b7b6e11.zip | |
Function envs and value escaping
Diffstat (limited to 'pkg/lang/vm/mem/mem.go')
| -rw-r--r-- | pkg/lang/vm/mem/mem.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/pkg/lang/vm/mem/mem.go b/pkg/lang/vm/mem/mem.go index 4335347..4cb6fc4 100644 --- a/pkg/lang/vm/mem/mem.go +++ b/pkg/lang/vm/mem/mem.go @@ -6,8 +6,13 @@ type Mem struct { } func New() Mem { + cells := make([]cell, 1) + + // Reserve NullPtr + cells[NullPtr].kind = CellKindForbidden + return Mem{ - cells: make([]cell, 0), + cells: cells, free: make([]int, 0), } } @@ -25,7 +30,7 @@ func (m *Mem) Allocate(kind CellKind) Ptr { return Ptr(idx) } else { idx := len(m.cells) - m.cells = append(m.cells, cell{kind: kind}) + m.cells = append(m.cells, cell{kind: kind, refs: 1}) return Ptr(idx) } @@ -47,6 +52,14 @@ func (m *Mem) Get(ptr Ptr) any { return m.cells[ptr].data } +func (m *Mem) Is(ptr Ptr, kind CellKind) bool { + if ptr >= Ptr(len(m.cells)) { + panic("out of bounds") + } + + return m.cells[ptr].kind == kind +} + func (m *Mem) Retain(ptr Ptr) { if ptr >= Ptr(len(m.cells)) { panic("out of bounds") |
