From 925fc07c4e4ced949aac40bcfb7cdbcc0e611d0b Mon Sep 17 00:00:00 2001 From: daxpedda Date: Mon, 29 Jul 2024 09:15:43 +0200 Subject: [PATCH] Faster detached buffer checks for `DataView` --- crates/cli-support/src/js/mod.rs | 35 ++++++++----------- .../tests/reference/anyref-import-catch.js | 14 ++++---- crates/cli/tests/reference/builder.js | 12 +++---- crates/cli/tests/reference/constructor.js | 12 +++---- crates/cli/tests/reference/enums.js | 12 +++---- crates/cli/tests/reference/import-catch.js | 2 +- crates/cli/tests/reference/result-string.js | 14 ++++---- crates/cli/tests/reference/string-arg.js | 18 +++++----- 8 files changed, 57 insertions(+), 62 deletions(-) diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index bd0258e1ebe..2f028d5a08c 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -1766,47 +1766,47 @@ impl<'a> Context<'a> { } fn expose_int8_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Int8", memory) + self.memview("Int8Array", memory) } fn expose_uint8_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Uint8", memory) + self.memview("Uint8Array", memory) } fn expose_clamped_uint8_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Uint8Clamped", memory) + self.memview("Uint8ClampedArray", memory) } fn expose_int16_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Int16", memory) + self.memview("Int16Array", memory) } fn expose_uint16_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Uint16", memory) + self.memview("Uint16Array", memory) } fn expose_int32_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Int32", memory) + self.memview("Int32Array", memory) } fn expose_uint32_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Uint32", memory) + self.memview("Uint32Array", memory) } fn expose_int64_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("BigInt64", memory) + self.memview("BigInt64Array", memory) } fn expose_uint64_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("BigUint64", memory) + self.memview("BigUint64Array", memory) } fn expose_f32_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Float32", memory) + self.memview("Float32Array", memory) } fn expose_f64_memory(&mut self, memory: MemoryId) -> MemView { - self.memview("Float64", memory) + self.memview("Float64Array", memory) } fn expose_dataview_memory(&mut self, memory: MemoryId) -> MemView { @@ -1820,10 +1820,8 @@ impl<'a> Context<'a> { } let mem = self.export_name_of(memory); - let is_dataview = kind == "DataView"; - let cache = format!("cached{}Memory{}", kind, view.num); - let resized_check = if self.module.memories.get(memory).shared || is_dataview { + let resized_check = if self.module.memories.get(memory).shared { // When it's backed by a `SharedArrayBuffer`, growing the wasm module's memory // doesn't detach old references; instead, it just leaves them pointing to a // slice of the up-to-date memory. So in order to check if it's been grown, we @@ -1833,6 +1831,9 @@ impl<'a> Context<'a> { cache = cache, mem = mem ) + } else if kind == "DataView" { + // `DataView`s throw when accessing detached memory, including `byteLength`. + format!("{cache}.buffer.detached === true", cache = cache) } else { // Otherwise, we can do a quicker check of whether the buffer's been detached, // which is indicated by a length of 0. @@ -1841,12 +1842,6 @@ impl<'a> Context<'a> { self.global(&format!("let {cache} = null;\n")); - let kind = if is_dataview { - kind - } else { - &format!("{}Array", kind) - }; - self.global(&format!( " function {name}() {{ diff --git a/crates/cli/tests/reference/anyref-import-catch.js b/crates/cli/tests/reference/anyref-import-catch.js index c5c8971793d..8376b16961f 100644 --- a/crates/cli/tests/reference/anyref-import-catch.js +++ b/crates/cli/tests/reference/anyref-import-catch.js @@ -10,18 +10,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } function addToExternrefTable0(obj) { @@ -42,7 +42,7 @@ function handleError(f, args) { let cachedDataViewMemory0 = null; function getDataViewMemory0() { - if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasm.memory.buffer) { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true) { cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } return cachedDataViewMemory0; diff --git a/crates/cli/tests/reference/builder.js b/crates/cli/tests/reference/builder.js index f31735af193..b491793222a 100644 --- a/crates/cli/tests/reference/builder.js +++ b/crates/cli/tests/reference/builder.js @@ -10,18 +10,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } const ClassBuilderFinalization = (typeof FinalizationRegistry === 'undefined') diff --git a/crates/cli/tests/reference/constructor.js b/crates/cli/tests/reference/constructor.js index 3f096f76657..ffac02b997a 100644 --- a/crates/cli/tests/reference/constructor.js +++ b/crates/cli/tests/reference/constructor.js @@ -10,18 +10,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } const ClassConstructorFinalization = (typeof FinalizationRegistry === 'undefined') diff --git a/crates/cli/tests/reference/enums.js b/crates/cli/tests/reference/enums.js index 4a0ea680071..c7446efaa24 100644 --- a/crates/cli/tests/reference/enums.js +++ b/crates/cli/tests/reference/enums.js @@ -10,18 +10,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } /** * @param {Color} color diff --git a/crates/cli/tests/reference/import-catch.js b/crates/cli/tests/reference/import-catch.js index 06a8e35f089..1aa6d0b0b1c 100644 --- a/crates/cli/tests/reference/import-catch.js +++ b/crates/cli/tests/reference/import-catch.js @@ -30,7 +30,7 @@ function handleError(f, args) { let cachedDataViewMemory0 = null; function getDataViewMemory0() { - if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasm.memory.buffer) { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true) { cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } return cachedDataViewMemory0; diff --git a/crates/cli/tests/reference/result-string.js b/crates/cli/tests/reference/result-string.js index aa8b200dfe8..5714764a24f 100644 --- a/crates/cli/tests/reference/result-string.js +++ b/crates/cli/tests/reference/result-string.js @@ -22,7 +22,7 @@ function addHeapObject(obj) { let cachedDataViewMemory0 = null; function getDataViewMemory0() { - if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasm.memory.buffer) { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true) { cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } return cachedDataViewMemory0; @@ -48,18 +48,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } /** * @returns {string} diff --git a/crates/cli/tests/reference/string-arg.js b/crates/cli/tests/reference/string-arg.js index 7ce1a4db2f3..62d6ce47201 100644 --- a/crates/cli/tests/reference/string-arg.js +++ b/crates/cli/tests/reference/string-arg.js @@ -10,18 +10,18 @@ let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true cachedTextDecoder.decode(); -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } let WASM_VECTOR_LEN = 0; @@ -48,7 +48,7 @@ function passStringToWasm0(arg, malloc, realloc) { if (realloc === undefined) { const buf = cachedTextEncoder.encode(arg); const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); WASM_VECTOR_LEN = buf.length; return ptr; } @@ -56,7 +56,7 @@ function passStringToWasm0(arg, malloc, realloc) { let len = arg.length; let ptr = malloc(len, 1) >>> 0; - const mem = getUint8Memory0(); + const mem = getUint8ArrayMemory0(); let offset = 0; @@ -71,7 +71,7 @@ function passStringToWasm0(arg, malloc, realloc) { arg = arg.slice(offset); } ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); const ret = encodeString(arg, view); offset += ret.written;