From d58fbe0c88b7848ce4d8ef300d594b7cc39f94cc Mon Sep 17 00:00:00 2001 From: Evgenii Date: Fri, 16 Aug 2019 13:05:07 +0300 Subject: [PATCH] compiler: use separate opcodes for string and number equality --- pkg/vm/compiler/codegen.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/vm/compiler/codegen.go b/pkg/vm/compiler/codegen.go index a0b3e852a..080f72368 100644 --- a/pkg/vm/compiler/codegen.go +++ b/pkg/vm/compiler/codegen.go @@ -382,15 +382,22 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { ast.Walk(c, n.X) ast.Walk(c, n.Y) - // VM has separate opcode for string concatenation - if n.Op == token.ADD { - typ, ok := tinfo.Type.Underlying().(*types.Basic) - if ok && typ.Kind() == types.String { + switch { + case n.Op == token.ADD: + // VM has separate opcodes for number and string concatenation + if isStringType(tinfo.Type) { emitOpcode(c.prog, vm.CAT) } else { emitOpcode(c.prog, vm.ADD) } - } else { + case n.Op == token.EQL: + // VM has separate opcodes for number and string equality + if isStringType(tinfo.Type) { + emitOpcode(c.prog, vm.EQUAL) + } else { + emitOpcode(c.prog, vm.NUMEQUAL) + } + default: c.convertToken(n.Op) } return nil