From b326b76d60259717f7114d0849eaabc67257e5cf Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 6 Dec 2020 02:25:04 +0900 Subject: [PATCH] jsutil: Use a 'writable' TypedArray on go2cpp --- internal/jsutil/buf_js.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/internal/jsutil/buf_js.go b/internal/jsutil/buf_js.go index 449991bfe..ffe75d489 100644 --- a/internal/jsutil/buf_js.go +++ b/internal/jsutil/buf_js.go @@ -18,11 +18,18 @@ import ( "syscall/js" ) +// isTypedArrayWritable represents whether TypedArray is writable or not. +// TypedArray's properties are not writable in the Web standard, but are writable with go2cpp. +// This enables to avoid unnecessary allocations of js.Value. +var isTypedArrayWritable = js.Global().Get("go2cpp").Truthy() + // temporaryBuffer is a temporary buffer used at gl.readPixels or gl.texSubImage2D. // The read data is converted to Go's byte slice as soon as possible. // To avoid often allocating ArrayBuffer, reuse the buffer whenever possible. var temporaryBuffer = js.Global().Get("ArrayBuffer").New(16) +var uint8ArrayObj js.Value + func TemporaryUint8Array(byteLength int) js.Value { if bufl := temporaryBuffer.Get("byteLength").Int(); bufl < byteLength { for bufl < byteLength { @@ -30,5 +37,15 @@ func TemporaryUint8Array(byteLength int) js.Value { } temporaryBuffer = js.Global().Get("ArrayBuffer").New(bufl) } + if isTypedArrayWritable { + if uint8ArrayObj.IsUndefined() { + uint8ArrayObj = js.Global().Get("Uint8Array").New() + println("h") + } + uint8ArrayObj.Set("buffer", temporaryBuffer) + uint8ArrayObj.Set("byteOffset", 0) + uint8ArrayObj.Set("byteLength", byteLength) + return uint8ArrayObj + } return js.Global().Get("Uint8Array").New(temporaryBuffer, 0, byteLength) }