From 77f9a2ee260ac964621c8588358bb7cd6a7f230d Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Mon, 27 Jan 2020 15:30:36 +0300 Subject: [PATCH] compiler: convert AppCall parameter from string properly --- pkg/compiler/codegen.go | 7 +++++++ pkg/compiler/interop_test.go | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index 67d728f7e..d9c0ebb41 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -672,6 +672,13 @@ func (c *codegen) getByteArray(expr ast.Expr) []byte { buf[i] = byte(val) } return buf + case *ast.CallExpr: + if tv := c.typeInfo.Types[t.Args[0]]; tv.Value != nil { + val := constant.StringVal(tv.Value) + return []byte(val) + } + + return nil default: return nil } diff --git a/pkg/compiler/interop_test.go b/pkg/compiler/interop_test.go index f1e0e1748..29831477f 100644 --- a/pkg/compiler/interop_test.go +++ b/pkg/compiler/interop_test.go @@ -100,6 +100,27 @@ func TestAppCall(t *testing.T) { _, err := compiler.Compile(strings.NewReader(src)) require.Error(t, err) }) + + t.Run("convert from string constant", func(t *testing.T) { + src := ` + package foo + import "github.com/CityOfZion/neo-go/pkg/interop/engine" + const scriptHash = ` + fmt.Sprintf("%#v", string(ih.BytesBE())) + ` + func Main() int { + x := 13 + y := 29 + result := engine.AppCall([]byte(scriptHash), []interface{}{x, y}) + return result.(int) + } + ` + + v := vmAndCompile(t, src) + v.SetScriptGetter(getScript) + + require.NoError(t, v.Run()) + + assertResult(t, v, big.NewInt(42)) + }) } func getAppCallScript(h string) string {