initial commit

pull/2/head
vedhavyas 2019-08-06 15:03:11 +02:00
commit d528eeada8
No known key found for this signature in database
GPG Key ID: 317BF0923E3EB7E5
4 changed files with 218 additions and 0 deletions

168
imports.go 100644
View File

@ -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
}

View File

@ -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)
}

View File

@ -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.