// run //go:build !wasm // +build !wasm // Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "fmt" ) var sink *string var y int //go:registerparams //go:noinline func F(a, b, c *int) (x int) { x = *a G(&x) x += *b G(&x) x += *c G(&x) return } //go:registerparams //go:noinline func G(x *int) { y += *x fmt.Println("y = ", y) } //go:registerparams //go:noinline func X() { *sink += " !!!!!!!!!!!!!!!" } //go:registerparams //go:noinline func H(s, t string) (result string) { // result leaks to heap result = "Aloha! " + s + " " + t sink = &result r := "" if len(s) <= len(t) { r = "OKAY! " X() } return r + result } //go:registerparams //go:noinline func K(s, t string) (result string) { // result spills result = "Aloha! " + s + " " + t r := "" if len(s) <= len(t) { r = "OKAY! " X() } return r + result } func main() { a, b, c := 1, 4, 16 x := F(&a, &b, &c) fmt.Printf("x = %d\n", x) y := H("Hello", "World!") fmt.Println("len(y) =", len(y)) fmt.Println("y =", y) z := H("Hello", "Pal!") fmt.Println("len(z) =", len(z)) fmt.Println("z =", z) fmt.Println() y = K("Hello", "World!") fmt.Println("len(y) =", len(y)) fmt.Println("y =", y) z = K("Hello", "Pal!") fmt.Println("len(z) =", len(z)) fmt.Println("z =", z) }