From 4396978d4bebc23b6bf72a8f57fc9bc51a2d78fe Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Mon, 17 Jun 2019 10:48:36 +0900 Subject: [PATCH] jsutil: Refactoring --- internal/jsutil/go113_js.go | 38 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/internal/jsutil/go113_js.go b/internal/jsutil/go113_js.go index bacd81cdd..40bb339f4 100644 --- a/internal/jsutil/go113_js.go +++ b/internal/jsutil/go113_js.go @@ -34,56 +34,66 @@ func ArrayBufferToSlice(value js.Value) []byte { return Uint8ArrayToSlice(js.Global().Get("Uint8Array").New(value)) } -func sliceToByteSlice(s interface{}) []byte { +func sliceToByteSlice(s interface{}) (bs []byte) { switch s := s.(type) { case []int8: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []int16: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 2 h.Cap *= 2 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []int32: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 4 h.Cap *= 4 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []int64: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 8 h.Cap *= 8 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []uint8: return s case []uint16: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 2 h.Cap *= 2 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []uint32: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 4 h.Cap *= 4 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []uint64: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 8 h.Cap *= 8 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []float32: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 4 h.Cap *= 4 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) case []float64: h := (*reflect.SliceHeader)(unsafe.Pointer(&s)) h.Len *= 8 h.Cap *= 8 - return *(*[]byte)(unsafe.Pointer(h)) + bs = *(*[]byte)(unsafe.Pointer(h)) + runtime.KeepAlive(s) default: panic(fmt.Sprintf("jsutil: unexpected value at sliceToBytesSlice: %T", s)) } + return } func SliceToTypedArray(s interface{}) (js.Value, func()) { @@ -91,48 +101,40 @@ func SliceToTypedArray(s interface{}) (js.Value, func()) { 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")), func() {} 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), func() {} 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), func() {} case []uint8: a := js.Global().Get("Uint8Array").New(len(s)) js.CopyBytesToJS(a, s) - runtime.KeepAlive(s) return a, func() {} 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), func() {} 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), func() {} 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), func() {} 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), func() {} default: