summaryrefslogtreecommitdiff
path: root/vm/vm.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-09 19:10:27 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-09 19:10:27 +0100
commit7520aa4474ea30985cf26631c6bbdebf38484a0d (patch)
treee1e344c2fdc04affc0095eab26a39eef1fc3ba91 /vm/vm.go
parent6ae0a2530c9a57fc093d2159591d9cae8140d641 (diff)
feat: initial support for maps
Diffstat (limited to 'vm/vm.go')
-rw-r--r--vm/vm.go11
1 files changed, 5 insertions, 6 deletions
diff --git a/vm/vm.go b/vm/vm.go
index b5c6cf5..709b459 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -42,6 +42,7 @@ const (
Grow // -- ; sp += $1
Index // a i -- a[i] ;
IndexSet // a i v -- a; a[i] = v
+ MapSet // a i v -- a; a[i] = v
Jump // -- ; ip += $1
JumpTrue // cond -- ; if cond { ip += $1 }
JumpFalse // cond -- ; if cond { ip += $1 }
@@ -170,11 +171,7 @@ func (m *Machine) Run() (err error) {
case Fdup:
mem = append(mem, mem[c.Arg[0]+fp-1])
case Fnew:
- mem = append(mem, NewValue(mem[c.Arg[0]].Type))
- if len(c.Arg) > 1 {
- mem[len(mem)-1].Grow(c.Arg[1])
- mem[len(mem)-1].SetLen(c.Arg[1])
- }
+ mem = append(mem, NewValue(mem[c.Arg[0]].Type, c.Arg[1:]...))
case Field:
fv := mem[sp-1].FieldByIndex(c.Arg)
if !fv.CanSet() {
@@ -268,9 +265,11 @@ func (m *Machine) Run() (err error) {
mem[sp-2].Value = mem[sp-2].Index(int(mem[sp-1].Int()))
mem = mem[:sp-1]
case IndexSet:
- log.Println("## IndexSet:", sp-3, mem[sp-3].Type)
mem[sp-3].Value.Index(int(mem[sp-2].Int())).Set(mem[sp-1].Value)
mem = mem[:sp-2]
+ case MapSet:
+ mem[sp-3].SetMapIndex(mem[sp-2].Value, mem[sp-1].Value)
+ mem = mem[:sp-2]
case Vassign:
mem[sp-2].Set(mem[sp-1].Value)
mem = mem[:sp-2]