mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(ext/web): use primordials of ES2024 ArrayBuffer transfer (#24396)
Ref: https://github.com/denoland/deno_core/issues/135
This commit is contained in:
parent
f78a60e882
commit
d379c0b299
3 changed files with 15 additions and 35 deletions
|
@ -14,7 +14,6 @@ const {
|
||||||
isTypedArray,
|
isTypedArray,
|
||||||
} = core;
|
} = core;
|
||||||
import {
|
import {
|
||||||
op_arraybuffer_was_detached,
|
|
||||||
// TODO(mmastrac): use readAll
|
// TODO(mmastrac): use readAll
|
||||||
op_read_all,
|
op_read_all,
|
||||||
op_readable_stream_resource_allocate,
|
op_readable_stream_resource_allocate,
|
||||||
|
@ -25,13 +24,14 @@ import {
|
||||||
op_readable_stream_resource_write_buf,
|
op_readable_stream_resource_write_buf,
|
||||||
op_readable_stream_resource_write_error,
|
op_readable_stream_resource_write_error,
|
||||||
op_readable_stream_resource_write_sync,
|
op_readable_stream_resource_write_sync,
|
||||||
op_transfer_arraybuffer,
|
|
||||||
} from "ext:core/ops";
|
} from "ext:core/ops";
|
||||||
const {
|
const {
|
||||||
ArrayBuffer,
|
ArrayBuffer,
|
||||||
ArrayBufferIsView,
|
ArrayBufferIsView,
|
||||||
ArrayBufferPrototypeGetByteLength,
|
ArrayBufferPrototypeGetByteLength,
|
||||||
|
ArrayBufferPrototypeGetDetached,
|
||||||
ArrayBufferPrototypeSlice,
|
ArrayBufferPrototypeSlice,
|
||||||
|
ArrayBufferPrototypeTransferToFixedLength,
|
||||||
ArrayPrototypeMap,
|
ArrayPrototypeMap,
|
||||||
ArrayPrototypePush,
|
ArrayPrototypePush,
|
||||||
ArrayPrototypeShift,
|
ArrayPrototypeShift,
|
||||||
|
@ -279,8 +279,7 @@ function isDetachedBuffer(O) {
|
||||||
if (isSharedArrayBuffer(O)) {
|
if (isSharedArrayBuffer(O)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ArrayBufferPrototypeGetByteLength(O) === 0 &&
|
return ArrayBufferPrototypeGetDetached(O);
|
||||||
op_arraybuffer_was_detached(O);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -297,14 +296,6 @@ function canTransferArrayBuffer(O) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {ArrayBufferLike} O
|
|
||||||
* @returns {ArrayBufferLike}
|
|
||||||
*/
|
|
||||||
function transferArrayBuffer(O) {
|
|
||||||
return op_transfer_arraybuffer(O);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ArrayBufferLike} O
|
* @param {ArrayBufferLike} O
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
|
@ -1359,7 +1350,7 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
|
||||||
"chunk's buffer is detached and so cannot be enqueued",
|
"chunk's buffer is detached and so cannot be enqueued",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const transferredBuffer = transferArrayBuffer(buffer);
|
const transferredBuffer = ArrayBufferPrototypeTransferToFixedLength(buffer);
|
||||||
if (controller[_pendingPullIntos].length !== 0) {
|
if (controller[_pendingPullIntos].length !== 0) {
|
||||||
const firstPendingPullInto = controller[_pendingPullIntos][0];
|
const firstPendingPullInto = controller[_pendingPullIntos][0];
|
||||||
// deno-lint-ignore prefer-primordials
|
// deno-lint-ignore prefer-primordials
|
||||||
|
@ -1369,7 +1360,7 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
readableByteStreamControllerInvalidateBYOBRequest(controller);
|
readableByteStreamControllerInvalidateBYOBRequest(controller);
|
||||||
firstPendingPullInto.buffer = transferArrayBuffer(
|
firstPendingPullInto.buffer = ArrayBufferPrototypeTransferToFixedLength(
|
||||||
// deno-lint-ignore prefer-primordials
|
// deno-lint-ignore prefer-primordials
|
||||||
firstPendingPullInto.buffer,
|
firstPendingPullInto.buffer,
|
||||||
);
|
);
|
||||||
|
@ -2029,7 +2020,7 @@ function readableByteStreamControllerPullInto(
|
||||||
assert(minimumFill % elementSize === 0);
|
assert(minimumFill % elementSize === 0);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
buffer = transferArrayBuffer(buffer);
|
buffer = ArrayBufferPrototypeTransferToFixedLength(buffer);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
readIntoRequest.errorSteps(e);
|
readIntoRequest.errorSteps(e);
|
||||||
return;
|
return;
|
||||||
|
@ -2122,8 +2113,10 @@ function readableByteStreamControllerRespond(controller, bytesWritten) {
|
||||||
throw new RangeError("bytesWritten out of range");
|
throw new RangeError("bytesWritten out of range");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// deno-lint-ignore prefer-primordials
|
firstDescriptor.buffer = ArrayBufferPrototypeTransferToFixedLength(
|
||||||
firstDescriptor.buffer = transferArrayBuffer(firstDescriptor.buffer);
|
// deno-lint-ignore prefer-primordials
|
||||||
|
firstDescriptor.buffer,
|
||||||
|
);
|
||||||
readableByteStreamControllerRespondInternal(controller, bytesWritten);
|
readableByteStreamControllerRespondInternal(controller, bytesWritten);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2340,7 +2333,7 @@ function readableByteStreamControllerRespondWithNewView(controller, view) {
|
||||||
"The region specified by view is larger than byobRequest",
|
"The region specified by view is larger than byobRequest",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
firstDescriptor.buffer = transferArrayBuffer(buffer);
|
firstDescriptor.buffer = ArrayBufferPrototypeTransferToFixedLength(buffer);
|
||||||
readableByteStreamControllerRespondInternal(controller, byteLength);
|
readableByteStreamControllerRespondInternal(controller, byteLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2484,8 +2477,10 @@ function readableByteStreamControllerConvertPullIntoDescriptor(
|
||||||
// deno-lint-ignore prefer-primordials
|
// deno-lint-ignore prefer-primordials
|
||||||
assert(bytesFilled <= pullIntoDescriptor.byteLength);
|
assert(bytesFilled <= pullIntoDescriptor.byteLength);
|
||||||
assert((bytesFilled % elementSize) === 0);
|
assert((bytesFilled % elementSize) === 0);
|
||||||
// deno-lint-ignore prefer-primordials
|
const buffer = ArrayBufferPrototypeTransferToFixedLength(
|
||||||
const buffer = transferArrayBuffer(pullIntoDescriptor.buffer);
|
// deno-lint-ignore prefer-primordials
|
||||||
|
pullIntoDescriptor.buffer,
|
||||||
|
);
|
||||||
return new pullIntoDescriptor.viewConstructor(
|
return new pullIntoDescriptor.viewConstructor(
|
||||||
buffer,
|
buffer,
|
||||||
// deno-lint-ignore prefer-primordials
|
// deno-lint-ignore prefer-primordials
|
||||||
|
|
|
@ -143,7 +143,6 @@ Following ops are provided, which can be accessed through `Deno.ops`:
|
||||||
- op_compression_finish
|
- op_compression_finish
|
||||||
- op_now
|
- op_now
|
||||||
- op_defer
|
- op_defer
|
||||||
- op_transfer_arraybuffer
|
|
||||||
- op_readable_stream_resource_allocate
|
- op_readable_stream_resource_allocate
|
||||||
- op_readable_stream_resource_allocate_sized
|
- op_readable_stream_resource_allocate_sized
|
||||||
- op_readable_stream_resource_get_sink
|
- op_readable_stream_resource_get_sink
|
||||||
|
|
|
@ -87,7 +87,6 @@ deno_core::extension!(deno_web,
|
||||||
compression::op_compression_finish,
|
compression::op_compression_finish,
|
||||||
op_now<P>,
|
op_now<P>,
|
||||||
op_defer,
|
op_defer,
|
||||||
op_transfer_arraybuffer,
|
|
||||||
stream_resource::op_readable_stream_resource_allocate,
|
stream_resource::op_readable_stream_resource_allocate,
|
||||||
stream_resource::op_readable_stream_resource_allocate_sized,
|
stream_resource::op_readable_stream_resource_allocate_sized,
|
||||||
stream_resource::op_readable_stream_resource_get_sink,
|
stream_resource::op_readable_stream_resource_get_sink,
|
||||||
|
@ -424,19 +423,6 @@ fn op_encoding_encode_into_fast(
|
||||||
out_buf[1] = boundary as u32;
|
out_buf[1] = boundary as u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[op2]
|
|
||||||
fn op_transfer_arraybuffer<'a>(
|
|
||||||
scope: &mut v8::HandleScope<'a>,
|
|
||||||
ab: &v8::ArrayBuffer,
|
|
||||||
) -> Result<v8::Local<'a, v8::ArrayBuffer>, AnyError> {
|
|
||||||
if !ab.is_detachable() {
|
|
||||||
return Err(type_error("ArrayBuffer is not detachable"));
|
|
||||||
}
|
|
||||||
let bs = ab.get_backing_store();
|
|
||||||
ab.detach(None);
|
|
||||||
Ok(v8::ArrayBuffer::with_backing_store(scope, &bs))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_declaration() -> PathBuf {
|
pub fn get_declaration() -> PathBuf {
|
||||||
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_web.d.ts")
|
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_web.d.ts")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue