diff --git a/pkg/compiler/byte_conversion_test.go b/pkg/compiler/byte_conversion_test.go index 1bbacade5..e896b4022 100644 --- a/pkg/compiler/byte_conversion_test.go +++ b/pkg/compiler/byte_conversion_test.go @@ -54,3 +54,28 @@ func TestByteConversionDirectlyInFunctionCall(t *testing.T) { ` eval(t, src, []byte("foo")) } + +func TestByteConversionOfConstant(t *testing.T) { + src := ` + package foo + const foo = "foo" + func Main() []byte { + b := []byte(foo) + return b + } + ` + eval(t, src, []byte("foo")) +} + +func TestByteConversionOfVariable(t *testing.T) { + src := ` + package foo + func Main() []byte { + a := "fo" + a = a + "o" + b := []byte(a) + return b + } + ` + eval(t, src, []byte("foo")) +} diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index 1023bd142..67d728f7e 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -349,6 +349,8 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { return nil } c.emitLoadConst(value) + } else if tv := c.typeInfo.Types[n]; tv.Value != nil { + c.emitLoadConst(tv) } else { c.emitLoadLocal(n.Name) } @@ -481,11 +483,9 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { return nil } case *ast.ArrayType: - // For now we will assume that there is only 1 argument passed which - // will be a basic literal (string kind). This only to handle string - // to byte slice conversions. E.G. []byte("foobar") - arg := n.Args[0].(*ast.BasicLit) - c.emitLoadConst(c.typeInfo.Types[arg]) + // For now we will assume that there are only byte slice conversions. + // E.g. []byte("foobar") or []byte(scriptHash). + ast.Walk(c, n.Args[0]) return nil }