From 4ccda04eea4f51ec86c0b7d846a14d1b028a83cb Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 19 Aug 2019 19:18:17 +0300 Subject: [PATCH] compiler: fix string/numbers equality/inequality gen again Unfortunately d58fbe0c88b7848ce4d8ef300d594b7cc39f94cc didn't really fix the problem because tinfo.Type (the expression resulting type) actually is a bool and we need to check its parameters. Also, there is need to fix the NEQ operation. --- pkg/vm/compiler/codegen.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/vm/compiler/codegen.go b/pkg/vm/compiler/codegen.go index 080f72368..471ef70af 100644 --- a/pkg/vm/compiler/codegen.go +++ b/pkg/vm/compiler/codegen.go @@ -392,11 +392,19 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } case n.Op == token.EQL: // VM has separate opcodes for number and string equality - if isStringType(tinfo.Type) { + if isStringType(c.typeInfo.Types[n.X].Type) { emitOpcode(c.prog, vm.EQUAL) } else { emitOpcode(c.prog, vm.NUMEQUAL) } + case n.Op == token.NEQ: + // VM has separate opcodes for number and string equality + if isStringType(c.typeInfo.Types[n.X].Type) { + emitOpcode(c.prog, vm.EQUAL) + emitOpcode(c.prog, vm.NOT) + } else { + emitOpcode(c.prog, vm.NUMNOTEQUAL) + } default: c.convertToken(n.Op) }