initial commit
commit
d528eeada8
|
@ -0,0 +1,168 @@
|
|||
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
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package main
|
||||
|
||||
import "C"
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
wasmgo "github.com/vedhavyas/wasm"
|
||||
wasm "github.com/wasmerio/go-ext-wasm/wasmer"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Reads the WebAssembly module as bytes.
|
||||
bytes, err := wasm.ReadBytes("./simple/prog/main.wasm")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
imports, err := wasmgo.Imports()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Instantiates the WebAssembly module.
|
||||
instance, err := wasm.NewInstanceWithImports(bytes, imports)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer instance.Close()
|
||||
|
||||
fmt.Println(instance.Exports)
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
// +build js,wasm
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall/js"
|
||||
)
|
||||
|
||||
func printWasm(v []js.Value) {
|
||||
fmt.Println("Hello from WASM", v)
|
||||
}
|
||||
|
||||
func main() {
|
||||
js.Global().Set("printWasm", js.NewCallback(printWasm))
|
||||
fmt.Println("Done...")
|
||||
<-make(chan struct{})
|
||||
}
|
Binary file not shown.
Loading…
Reference in New Issue