diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-11 19:02:27 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-11 19:02:27 +0100 |
| commit | 5a04b5512a128bd1805792cca4eabacf5fd49b27 (patch) | |
| tree | a9d4fa09d14bc2b1e17ea2ff14878f556ed41536 /comp | |
| parent | 7520aa4474ea30985cf26631c6bbdebf38484a0d (diff) | |
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.
Diffstat (limited to 'comp')
| -rw-r--r-- | comp/compiler.go | 21 |
1 files changed, 19 insertions, 2 deletions
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) |
