From 5a04b5512a128bd1805792cca4eabacf5fd49b27 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Sun, 11 Jan 2026 19:02:27 +0100 Subject: fix: handle assign statements on map elements A new token MapAssign is added to implement assignements involving a map, slice or array, an index key expression and a value expression. --- comp/compiler.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'comp/compiler.go') diff --git a/comp/compiler.go b/comp/compiler.go index 47c4a88..8a136e1 100644 --- a/comp/compiler.go +++ b/comp/compiler.go @@ -130,8 +130,13 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { case lang.Index: showStack() pop() - push(&symbol.Symbol{Type: pop().Type.Elem()}) - emit(t, vm.Index) + s := pop() + if s.Type.Rtype.Kind() == reflect.Map { + emit(t, vm.MapIndex) + } else { + emit(t, vm.Index) + } + push(&symbol.Symbol{Type: s.Type.Elem()}) case lang.Greater: push(&symbol.Symbol{Type: booleanOpType(pop(), pop())}) @@ -232,6 +237,18 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { } emit(t, vm.Vassign) + case lang.MapAssign: + s := stack[len(stack)-3] + switch s.Type.Rtype.Kind() { + case reflect.Array, reflect.Slice: + emit(t, vm.IndexSet) + case reflect.Map: + emit(t, vm.MapSet) + default: + return errorf("not a map or array: %s", s.Name) + } + stack = stack[:len(stack)-3] + case lang.Equal: push(&symbol.Symbol{Type: booleanOpType(pop(), pop())}) emit(t, vm.Equal) -- cgit v1.2.3