summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAapo Alasuutari <aapo.alasuutari@gmail.com>2023-03-05 10:01:23 +0200
committerGitHub <noreply@github.com>2023-03-05 08:01:23 +0000
commitda201d9ea5e00f7fd2aefc3222759f3c253c1882 (patch)
tree2c1289a43454f6d804295d160601d849c5015468
parent0910be4d64272be6774b8b3d44852737e8c53ad4 (diff)
feat(ext/ffi): Make External pointers keep reference to V8 buffer (#17955)
-rw-r--r--ext/ffi/00_ffi.js8
-rw-r--r--test_ffi/tests/bench.js6
2 files changed, 7 insertions, 7 deletions
diff --git a/ext/ffi/00_ffi.js b/ext/ffi/00_ffi.js
index d107e89fa..a63a027e8 100644
--- a/ext/ffi/00_ffi.js
+++ b/ext/ffi/00_ffi.js
@@ -26,6 +26,7 @@ const {
SafeMap,
SafeArrayIterator,
SymbolFor,
+ WeakMap,
} = primordials;
const promiseIdSymbol = SymbolFor("Deno.core.internalPromiseId");
@@ -179,6 +180,7 @@ class UnsafePointerView {
const OUT_BUFFER = new Uint32Array(2);
const OUT_BUFFER_64 = new BigInt64Array(OUT_BUFFER.buffer);
+const POINTER_TO_BUFFER_WEAK_MAP = new WeakMap();
class UnsafePointer {
static create(value) {
return ops.op_ffi_ptr_create(value);
@@ -195,7 +197,11 @@ class UnsafePointer {
if (ObjectPrototypeIsPrototypeOf(UnsafeCallbackPrototype, value)) {
return value.pointer;
}
- return ops.op_ffi_ptr_of(value);
+ const pointer = ops.op_ffi_ptr_of(value);
+ if (pointer) {
+ POINTER_TO_BUFFER_WEAK_MAP.set(pointer, value);
+ }
+ return pointer;
}
static offset(value, offset) {
diff --git a/test_ffi/tests/bench.js b/test_ffi/tests/bench.js
index b70b41e8f..a3983fb2b 100644
--- a/test_ffi/tests/bench.js
+++ b/test_ffi/tests/bench.js
@@ -354,8 +354,6 @@ Deno.bench("nop_f64()", () => {
const { nop_buffer } = dylib.symbols;
const buffer = new Uint8Array(8).fill(5);
-// Make sure the buffer does not get collected
-globalThis.buffer = buffer;
Deno.bench("nop_buffer()", () => {
nop_buffer(buffer);
});
@@ -565,8 +563,6 @@ Deno.bench("return_buffer_nonblocking()", async () => {
const { nop_many_parameters } = dylib.symbols;
const buffer2 = new Uint8Array(8).fill(25);
-// Make sure the buffer does not get collected
-globalThis.buffer2 = buffer2;
Deno.bench("nop_many_parameters()", () => {
nop_many_parameters(
135,
@@ -635,8 +631,6 @@ Deno.bench("Deno.UnsafePointer.of", () => {
});
const cstringBuffer = new TextEncoder().encode("Best believe it!\0");
-// Make sure the buffer does not get collected
-globalThis.cstringBuffer = cstringBuffer;
const cstringPointerView = new Deno.UnsafePointerView(
Deno.UnsafePointer.of(cstringBuffer),
);