169 lines
4.3 KiB
Go
169 lines
4.3 KiB
Go
|
package wasm
|
||
|
|
||
|
/*
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
extern void debug(void *context, int32_t a);
|
||
|
extern void wexit(void *context, int32_t a);
|
||
|
extern void wwrite(void *context, int32_t a);
|
||
|
extern void nanotime(void *context, int32_t a);
|
||
|
extern void walltime(void *context, int32_t a);
|
||
|
extern void scheduleCallback(void *context, int32_t a);
|
||
|
extern void clearScheduledCallback(void *context, int32_t a);
|
||
|
extern void getRandomData(void *context, int32_t a);
|
||
|
extern void stringVal(void *context, int32_t a);
|
||
|
extern void valueGet(void *context, int32_t a);
|
||
|
extern void valueSet(void *context, int32_t a);
|
||
|
extern void valueIndex(void *context, int32_t a);
|
||
|
extern void valueSetIndex(void *context, int32_t a);
|
||
|
extern void valueCall(void *context, int32_t a);
|
||
|
extern void valueInvoke(void *context, int32_t a);
|
||
|
extern void valueNew(void *context, int32_t a);
|
||
|
extern void valueLength(void *context, int32_t a);
|
||
|
extern void valuePrepareString(void *context, int32_t a);
|
||
|
extern void valueLoadString(void *context, int32_t a);
|
||
|
*/
|
||
|
import "C"
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"unsafe"
|
||
|
|
||
|
"github.com/wasmerio/go-ext-wasm/wasmer"
|
||
|
)
|
||
|
|
||
|
//export debug
|
||
|
func debug(ctx unsafe.Pointer, a int32) {
|
||
|
log.Println(a)
|
||
|
}
|
||
|
|
||
|
//export wexit
|
||
|
func wexit(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("wasm exit")
|
||
|
}
|
||
|
|
||
|
//export wwrite
|
||
|
func wwrite(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("wasm write")
|
||
|
}
|
||
|
|
||
|
//export nanotime
|
||
|
func nanotime(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("nano time")
|
||
|
}
|
||
|
|
||
|
//export walltime
|
||
|
func walltime(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("wall time")
|
||
|
}
|
||
|
|
||
|
//export scheduleCallback
|
||
|
func scheduleCallback(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("schedule callback")
|
||
|
}
|
||
|
|
||
|
//export clearScheduledCallback
|
||
|
func clearScheduledCallback(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("clear scheduled callback")
|
||
|
}
|
||
|
|
||
|
//export getRandomData
|
||
|
func getRandomData(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("getRandomData")
|
||
|
}
|
||
|
|
||
|
//export stringVal
|
||
|
func stringVal(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("stringVal")
|
||
|
}
|
||
|
|
||
|
//export valueGet
|
||
|
func valueGet(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueGet")
|
||
|
}
|
||
|
|
||
|
//export valueSet
|
||
|
func valueSet(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueSet")
|
||
|
}
|
||
|
|
||
|
//export valueIndex
|
||
|
func valueIndex(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueIndex")
|
||
|
}
|
||
|
|
||
|
//export valueSetIndex
|
||
|
func valueSetIndex(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueSetIndex")
|
||
|
}
|
||
|
|
||
|
//export valueCall
|
||
|
func valueCall(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueCall")
|
||
|
}
|
||
|
|
||
|
//export valueInvoke
|
||
|
func valueInvoke(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueInvoke")
|
||
|
}
|
||
|
|
||
|
//export valueNew
|
||
|
func valueNew(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueNew")
|
||
|
}
|
||
|
|
||
|
//export valueLength
|
||
|
func valueLength(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueLength")
|
||
|
}
|
||
|
|
||
|
//export valuePrepareString
|
||
|
func valuePrepareString(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valuePrepareString")
|
||
|
}
|
||
|
|
||
|
//export valueLoadString
|
||
|
func valueLoadString(ctx unsafe.Pointer, a int32) {
|
||
|
fmt.Println("valueLoadString")
|
||
|
}
|
||
|
|
||
|
// Imports returns wasm go specific imports
|
||
|
func Imports() (*wasmer.Imports, error) {
|
||
|
imps := wasmer.NewImports().Namespace("go")
|
||
|
var is = []struct {
|
||
|
name string
|
||
|
imp interface{}
|
||
|
cgo unsafe.Pointer
|
||
|
}{
|
||
|
{"debug", debug, C.debug},
|
||
|
{"runtime.wasmExit", wexit, C.wexit},
|
||
|
{"runtime.wasmWrite", wwrite, C.wwrite},
|
||
|
{"runtime.nanotime", nanotime, C.nanotime},
|
||
|
{"runtime.walltime", walltime, C.walltime},
|
||
|
{"runtime.scheduleCallback", scheduleCallback, C.scheduleCallback},
|
||
|
{"runtime.clearScheduledCallback", clearScheduledCallback, C.clearScheduledCallback},
|
||
|
{"runtime.getRandomData", getRandomData, C.getRandomData},
|
||
|
{"syscall/js.stringVal", stringVal, C.stringVal},
|
||
|
{"syscall/js.valueGet", valueGet, C.valueGet},
|
||
|
{"syscall/js.valueSet", valueSet, C.valueSet},
|
||
|
{"syscall/js.valueIndex", valueIndex, C.valueIndex},
|
||
|
{"syscall/js.valueSetIndex", valueSetIndex, C.valueSetIndex},
|
||
|
{"syscall/js.valueCall", valueCall, C.valueCall},
|
||
|
{"syscall/js.valueInvoke", valueInvoke, C.valueInvoke},
|
||
|
{"syscall/js.valueNew", valueNew, C.valueNew},
|
||
|
{"syscall/js.valueLength", valueLength, C.valueLength},
|
||
|
{"syscall/js.valuePrepareString", valuePrepareString, C.valuePrepareString},
|
||
|
{"syscall/js.valueLoadString", valueLoadString, C.valueLoadString},
|
||
|
}
|
||
|
|
||
|
var err error
|
||
|
for _, imp := range is {
|
||
|
imps, err = imps.Append(imp.name, imp.imp, imp.cgo)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return imps, nil
|
||
|
}
|