I'm looking at wasmer go-ext-wasm example code /go-ext-wasm/wasmer/test/imports.go
learning about setting context data. I want to pass a pointer as contextData, what's the best way to do this?
//export sum
func sum(context unsafe.Pointer, x int32, y int32) int32 {
instanceContext := wasm.IntoInstanceContext(context)
t := *(*int)(instanceContext.Data())
log.Print("t: ", t)
return x + y
}
func testInstanceImport(t *testing.T) {
imports, err := wasm.NewImports().Namespace("env").Append("sum", sum, C.sum)
assert.NoError(t, err)
instance, err := wasm.NewInstanceWithImports(getImportedFunctionBytes("examples", "imported_function.wasm"), imports)
defer instance.Close()
assert.NoError(t, err)
bar := int(2)
barPtr := &bar
data := unsafe.Pointer(&bar)
instance.SetContextData(data)
log.Printf("bar %v, barPtr %v", bar, barPtr)
add1, exists := instance.Exports["add1"]
assert.Equal(t, true, exists)
result, err := add1(1, 2)
log.Print("Result: ", result)
assert.Equal(t, wasm.I32(4), result)
assert.NoError(t, err)
}
Which gives me the expected value of 2 for context in the sum function. However when I change data := unsafe.Pointer(&bar)
to data := unsafe.Pointer(&barPtr)
I get a: runtime error: cgo argument has Go pointer to Go pointer
error.
It works when I run it with GODEBUG=cgocheck=0
Should I be concerned running with this flag? Is what I'm trying to do a bad idea? I have a struct that contains a pointer that I need to pass as contextData, is using the GODEBUG=cgocheck=0
a bad idea?