summaryrefslogtreecommitdiff
path: root/comp
diff options
context:
space:
mode:
Diffstat (limited to 'comp')
-rw-r--r--comp/compiler.go21
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)