From 56ec097d76b280b333bfb83b150648c9f5f61e1d Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 12 Sep 2019 17:39:23 +0300 Subject: [PATCH] vm: fix codegen for APPEND --- pkg/vm/compiler/analysis.go | 4 ++++ pkg/vm/compiler/codegen.go | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/vm/compiler/analysis.go b/pkg/vm/compiler/analysis.go index 011901f2a..1888946de 100644 --- a/pkg/vm/compiler/analysis.go +++ b/pkg/vm/compiler/analysis.go @@ -203,6 +203,10 @@ func isSyscall(fun *funcScope) bool { return ok } +func isByteArrayType(t types.Type) bool { + return t.String() == "[]byte" +} + func isStringType(t types.Type) bool { return t.String() == "string" } diff --git a/pkg/vm/compiler/codegen.go b/pkg/vm/compiler/codegen.go index f90138616..7fe9f3db7 100644 --- a/pkg/vm/compiler/codegen.go +++ b/pkg/vm/compiler/codegen.go @@ -614,7 +614,17 @@ func (c *codegen) convertBuiltin(expr *ast.CallExpr) { emitOpcode(c.prog, vm.ARRAYSIZE) } case "append": - emitOpcode(c.prog, vm.APPEND) + arg := expr.Args[0] + typ := c.typeInfo.Types[arg].Type + if isByteArrayType(typ) { + emitOpcode(c.prog, vm.CAT) + } else { + emitOpcode(c.prog, vm.SWAP) + emitOpcode(c.prog, vm.DUP) + emitOpcode(c.prog, vm.PUSH2) + emitOpcode(c.prog, vm.XSWAP) + emitOpcode(c.prog, vm.APPEND) + } case "SHA256": emitOpcode(c.prog, vm.SHA256) case "SHA1":