From cb8cea4ca34de0a418e9ee3e6b027d462359f64b Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 28 Sep 2023 05:46:11 +0700 Subject: [PATCH] avoid ArrayBufferDetaching protector cell invalidating in modern V8 --- packages/core-js/internals/array-buffer-transfer.js | 6 +++--- ...tach-via-message-channel.js => detach-transferable.js} | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) rename packages/core-js/internals/{detach-via-message-channel.js => detach-transferable.js} (71%) diff --git a/packages/core-js/internals/array-buffer-transfer.js b/packages/core-js/internals/array-buffer-transfer.js index dd9edb368e16..e4a93f51a152 100644 --- a/packages/core-js/internals/array-buffer-transfer.js +++ b/packages/core-js/internals/array-buffer-transfer.js @@ -5,7 +5,7 @@ var uncurryThisAccessor = require('../internals/function-uncurry-this-accessor') var toIndex = require('../internals/to-index'); var isDetached = require('../internals/array-buffer-is-detached'); var arrayBufferByteLength = require('../internals/array-buffer-byte-length'); -var detachViaMessageChannel = require('../internals/detach-via-message-channel'); +var detachTransferable = require('../internals/detach-transferable'); var PROPER_STRUCTURED_CLONE_TRANSFER = require('../internals/structured-clone-proper-transfer'); var structuredClone = global.structuredClone; @@ -21,7 +21,7 @@ var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', ' var getInt8 = uncurryThis(DataViewPrototype.getInt8); var setInt8 = uncurryThis(DataViewPrototype.setInt8); -module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachViaMessageChannel) && function (arrayBuffer, newLength, preserveResizability) { +module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) { var byteLength = arrayBufferByteLength(arrayBuffer); var newByteLength = newLength === undefined ? byteLength : toIndex(newLength); var fixedLength = !isResizable || !isResizable(arrayBuffer); @@ -41,6 +41,6 @@ module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachViaMessageChannel) & var copyLength = min(newByteLength, byteLength); for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i)); } - if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachViaMessageChannel(arrayBuffer); + if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer); return newBuffer; }; diff --git a/packages/core-js/internals/detach-via-message-channel.js b/packages/core-js/internals/detach-transferable.js similarity index 71% rename from packages/core-js/internals/detach-via-message-channel.js rename to packages/core-js/internals/detach-transferable.js index 6f76f38d89e6..ea392e42c2e0 100644 --- a/packages/core-js/internals/detach-via-message-channel.js +++ b/packages/core-js/internals/detach-transferable.js @@ -1,13 +1,19 @@ 'use strict'; var global = require('../internals/global'); var tryNodeRequire = require('../internals/try-node-require'); +var PROPER_STRUCTURED_CLONE_TRANSFER = require('../internals/structured-clone-proper-transfer'); +var structuredClone = global.structuredClone; var $ArrayBuffer = global.ArrayBuffer; var $MessageChannel = global.MessageChannel; var detach = false; var WorkerThreads, channel, buffer, $detach; -if ($ArrayBuffer) try { +if (PROPER_STRUCTURED_CLONE_TRANSFER) { + detach = function (transferable) { + structuredClone(transferable, { transfer: [transferable] }); + }; +} else if ($ArrayBuffer) try { if (!$MessageChannel) { WorkerThreads = tryNodeRequire('worker_threads'); if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel;