| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- // +build wasm
- // +build go1.13
- package wasm
- import (
- "reflect"
- "runtime"
- "syscall/js"
- "unsafe"
- )
- func sliceToByteSlice(s interface{}) []byte {
- switch s := s.(type) {
- case []int8:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- return *(*[]byte)(unsafe.Pointer(h))
- case []int16:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 2
- h.Cap *= 2
- return *(*[]byte)(unsafe.Pointer(h))
- case []int32:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 4
- h.Cap *= 4
- return *(*[]byte)(unsafe.Pointer(h))
- case []int64:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 8
- h.Cap *= 8
- return *(*[]byte)(unsafe.Pointer(h))
- case []uint8:
- return s
- case []uint16:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 2
- h.Cap *= 2
- return *(*[]byte)(unsafe.Pointer(h))
- case []uint32:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 4
- h.Cap *= 4
- return *(*[]byte)(unsafe.Pointer(h))
- case []uint64:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 8
- h.Cap *= 8
- return *(*[]byte)(unsafe.Pointer(h))
- case []float32:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 4
- h.Cap *= 4
- return *(*[]byte)(unsafe.Pointer(h))
- case []float64:
- h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
- h.Len *= 8
- h.Cap *= 8
- return *(*[]byte)(unsafe.Pointer(h))
- default:
- panic("jsutil: unexpected value at sliceToBytesSlice()")
- }
- }
- func SliceToTypedArray(s interface{}) (val js.Value, free func()) {
- free = func() {}
- switch s := s.(type) {
- case []int8:
- a := js.Global().Get("Uint8Array").New(len(s))
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Int8Array").New(buf, a.Get("byteOffset"), a.Get("byteLength")), free
- case []int16:
- a := js.Global().Get("Uint8Array").New(len(s) * 2)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Int16Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/2), free
- case []int32:
- a := js.Global().Get("Uint8Array").New(len(s) * 4)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Int32Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/4), free
- case []uint8:
- a := js.Global().Get("Uint8Array").New(len(s))
- js.CopyBytesToJS(a, s)
- runtime.KeepAlive(s)
- return a, free
- case []uint16:
- a := js.Global().Get("Uint8Array").New(len(s) * 2)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Uint16Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/2), free
- case []uint32:
- a := js.Global().Get("Uint8Array").New(len(s) * 4)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Uint32Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/4), free
- case []float32:
- a := js.Global().Get("Uint8Array").New(len(s) * 4)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Float32Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/4), free
- case []float64:
- a := js.Global().Get("Uint8Array").New(len(s) * 8)
- js.CopyBytesToJS(a, sliceToByteSlice(s))
- runtime.KeepAlive(s)
- buf := a.Get("buffer")
- return js.Global().Get("Float64Array").New(buf, a.Get("byteOffset"), a.Get("byteLength").Int()/8), free
- default:
- panic("jsutil: unexpected value at SliceToTypedArray()")
- }
- }
- func Equal(a, b js.Value) bool {
- return a.Equal(b)
- }
|