mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 12:19:12 +00:00
fix(napi): buffer finalizer is nullable (#30514)
Some checks are pending
ci / build libs (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions
Some checks are pending
ci / build libs (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions
Fixes: https://github.com/denoland/deno/issues/30512
This commit is contained in:
parent
55f43d0373
commit
9450d0798f
5 changed files with 37 additions and 6 deletions
|
@ -2938,7 +2938,7 @@ fn napi_create_external_arraybuffer<'s>(
|
|||
env: &'s mut Env,
|
||||
data: *mut c_void,
|
||||
byte_length: usize,
|
||||
finalize_cb: napi_finalize,
|
||||
finalize_cb: Option<napi_finalize>,
|
||||
finalize_hint: *mut c_void,
|
||||
result: *mut napi_value<'s>,
|
||||
) -> napi_status {
|
||||
|
|
|
@ -319,7 +319,7 @@ fn napi_create_external_buffer<'s>(
|
|||
env: &'s mut Env,
|
||||
length: usize,
|
||||
data: *mut c_void,
|
||||
finalize_cb: napi_finalize,
|
||||
finalize_cb: Option<napi_finalize>,
|
||||
finalize_hint: *mut c_void,
|
||||
result: *mut napi_value<'s>,
|
||||
) -> napi_status {
|
||||
|
|
|
@ -25,15 +25,17 @@ pub fn get_array_buffer_ptr(ab: v8::Local<v8::ArrayBuffer>) -> *mut c_void {
|
|||
|
||||
struct BufferFinalizer {
|
||||
env: *mut Env,
|
||||
finalize_cb: napi_finalize,
|
||||
finalize_cb: Option<napi_finalize>,
|
||||
finalize_data: *mut c_void,
|
||||
finalize_hint: *mut c_void,
|
||||
}
|
||||
|
||||
impl Drop for BufferFinalizer {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
(self.finalize_cb)(self.env as _, self.finalize_data, self.finalize_hint);
|
||||
if let Some(finalize_cb) = self.finalize_cb {
|
||||
unsafe {
|
||||
finalize_cb(self.env as _, self.finalize_data, self.finalize_hint);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +58,7 @@ pub(crate) fn make_external_backing_store(
|
|||
data: *mut c_void,
|
||||
byte_length: usize,
|
||||
finalize_data: *mut c_void,
|
||||
finalize_cb: napi_finalize,
|
||||
finalize_cb: Option<napi_finalize>,
|
||||
finalize_hint: *mut c_void,
|
||||
) -> v8::UniqueRef<v8::BackingStore> {
|
||||
let finalizer = Box::new(BufferFinalizer {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// Copyright 2018-2025 the Deno authors. MIT license.
|
||||
|
||||
import { assert, assertEquals, loadTestLibrary } from "./common.js";
|
||||
import { Buffer } from "node:buffer";
|
||||
|
||||
const typedarray = loadTestLibrary();
|
||||
|
||||
|
@ -22,3 +23,8 @@ Deno.test("napi arraybuffer is detached", function () {
|
|||
assert(!typedarray.is_detached(value));
|
||||
});
|
||||
});
|
||||
|
||||
Deno.test("napi buffer finalizer may be null", () => {
|
||||
const buf = typedarray.test_static_external_buffer();
|
||||
assertEquals(buf, Buffer.from([1, 2, 3]));
|
||||
});
|
||||
|
|
|
@ -107,6 +107,24 @@ extern "C" fn test_external_buffer(
|
|||
result
|
||||
}
|
||||
|
||||
extern "C" fn test_static_external_buffer(
|
||||
env: napi_env,
|
||||
_: napi_callback_info,
|
||||
) -> napi_value {
|
||||
let mut result = ptr::null_mut();
|
||||
static BUF: &[u8] = &[1, 2, 3];
|
||||
assert_napi_ok!(napi_create_external_buffer(
|
||||
env,
|
||||
BUF.len(),
|
||||
BUF.as_ptr() as _,
|
||||
None,
|
||||
ptr::null_mut(),
|
||||
&mut result
|
||||
));
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
extern "C" fn test_external_arraybuffer(
|
||||
env: napi_env,
|
||||
_: napi_callback_info,
|
||||
|
@ -136,6 +154,11 @@ pub fn init(env: napi_env, exports: napi_value) {
|
|||
"test_external_arraybuffer",
|
||||
test_external_arraybuffer
|
||||
),
|
||||
napi_new_property!(
|
||||
env,
|
||||
"test_static_external_buffer",
|
||||
test_static_external_buffer
|
||||
),
|
||||
];
|
||||
|
||||
assert_napi_ok!(napi_define_properties(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue