forked from mattn/gowasmer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wasmutil.go
40 lines (38 loc) · 1.05 KB
/
wasmutil.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package wasmutil
import (
"reflect"
"syscall/js"
)
// Wrap make function for friendly to js/wasm.
func Wrap(f interface{}) func(js.Value, []js.Value) interface{} {
return func(this js.Value, args []js.Value) interface{} {
rf := reflect.ValueOf(f)
rt := rf.Type()
rargs := []reflect.Value{}
for i := 0; i < rt.NumIn(); i++ {
var arg reflect.Value
switch args[i].Type() {
case js.TypeUndefined:
arg = reflect.Zero(reflect.TypeOf(nil)).Convert(rt.In(i))
case js.TypeNull:
arg = reflect.Zero(reflect.TypeOf(nil)).Convert(rt.In(i))
case js.TypeBoolean:
arg = reflect.ValueOf(args[i].Bool()).Convert(rt.In(i))
case js.TypeNumber:
arg = reflect.ValueOf(args[i].Float()).Convert(rt.In(i))
case js.TypeString:
arg = reflect.ValueOf(args[i].String()).Convert(rt.In(i))
case js.TypeSymbol:
arg = reflect.ValueOf(args[i].String()).Convert(rt.In(i))
default:
panic("type not supported")
}
rargs = append(rargs, arg)
}
ret := rf.Call(rargs)
if len(ret) > 0 {
return ret[0].Interface()
}
return nil
}
}