From 38a7a0f73035bc5068ac22d4d253cb5509edb0c8 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 5 May 2023 10:21:13 +0100 Subject: [PATCH] examples(allocation): ensure message outlives host call (#1436) Signed-off-by: Nuno Cruces Signed-off-by: Edoardo Vacchi Co-authored-by: Edoardo Vacchi --- examples/allocation/tinygo/testdata/greet.go | 31 +++++++----------- .../allocation/tinygo/testdata/greet.wasm | Bin 54254 -> 54105 bytes 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/examples/allocation/tinygo/testdata/greet.go b/examples/allocation/tinygo/testdata/greet.go index 2eb717d5..ee8d1e5d 100644 --- a/examples/allocation/tinygo/testdata/greet.go +++ b/examples/allocation/tinygo/testdata/greet.go @@ -5,7 +5,7 @@ import "C" import ( "fmt" - "reflect" + "runtime" "unsafe" ) @@ -21,6 +21,7 @@ func greet(name string) { func log(message string) { ptr, size := stringToPtr(message) _log(ptr, size) + runtime.KeepAlive(message) // keep message alive until ptr is no longer needed. } // _log is a WebAssembly import which prints a string (linear memory offset, @@ -30,7 +31,7 @@ func log(message string) { // //go:wasm-module env //export log -func _log(ptr uint32, size uint32) +func _log(ptr, size uint32) // greeting gets a greeting for the name. func greeting(name string) string { @@ -63,32 +64,24 @@ func _greeting(ptr, size uint32) (ptrSize uint64) { // ptrToString returns a string from WebAssembly compatible numeric types // representing its pointer and length. func ptrToString(ptr uint32, size uint32) string { - // Get a slice view of the underlying bytes in the stream. We use SliceHeader, not StringHeader - // as it allows us to fix the capacity to what was allocated. - return *(*string)(unsafe.Pointer(&reflect.SliceHeader{ - Data: uintptr(ptr), - Len: uintptr(size), // Tinygo requires these as uintptrs even if they are int fields. - Cap: uintptr(size), // ^^ See https://github.com/tinygo-org/tinygo/issues/1284 - })) + return unsafe.String((*byte)(unsafe.Pointer(uintptr(ptr))), size) } // stringToPtr returns a pointer and size pair for the given string in a way // compatible with WebAssembly numeric types. +// The returned pointer aliases the string hence the string must be kept alive +// until ptr is no longer needed. func stringToPtr(s string) (uint32, uint32) { - buf := []byte(s) - ptr := &buf[0] - unsafePtr := uintptr(unsafe.Pointer(ptr)) - return uint32(unsafePtr), uint32(len(buf)) + ptr := unsafe.Pointer(unsafe.StringData(s)) + return uint32(uintptr(ptr)), uint32(len(s)) } // stringToLeakedPtr returns a pointer and size pair for the given string in a way -// compatible with WebAssembly numeric types. The pointer is not automatically -// managed by TinyGo hence it must be freed by the host. +// compatible with WebAssembly numeric types. +// The pointer is not automatically managed by TinyGo hence it must be freed by the host. func stringToLeakedPtr(s string) (uint32, uint32) { size := C.ulong(len(s)) ptr := unsafe.Pointer(C.malloc(size)) - - copy(unsafe.Slice((*byte)(ptr), size), []byte(s)) - - return uint32(uintptr(ptr)), uint32(len(s)) + copy(unsafe.Slice((*byte)(ptr), size), s) + return uint32(uintptr(ptr)), uint32(size) } diff --git a/examples/allocation/tinygo/testdata/greet.wasm b/examples/allocation/tinygo/testdata/greet.wasm index 6a7fa97869035863d6a1e667bc231392334ce9b9..25fb8f73d59df13cb6fb3d06b03d37472dc2040d 100755 GIT binary patch delta 5324 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 D7sfV0 delta 5596 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 Zz5RiX_Gni}dwbi?_E<-QEco@%{{S{&XVCxv