From e1a0d39ea8c856ec50fa9ad6c8b6525f1ffa40d1 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 11 Jun 2022 20:29:34 +0700 Subject: [PATCH] prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation one more case of #679 --- CHANGELOG.md | 1 + packages/core-js/internals/engine-is-deno.js | 2 ++ packages/core-js/modules/web.structured-clone.js | 7 +++++++ 3 files changed, 10 insertions(+) create mode 100644 packages/core-js/internals/engine-is-deno.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 45aa7f6b9b60..3555d8afdfbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Added `Array.prototype.unshift` polyfill with some fixes for modern engines - Fixed a bug in the order of getting flags in `RegExp.prototype.flags` in the actual version of V8 - Fixed property descriptors of some `Math` and `Number` constants +- Added a workaround of V8 `ArrayBufferDetaching` protector cell invalidation and performance degradation on `structuredClone` feature detection, one more case of [#679](https://github.com/zloirock/core-js/issues/679) - Added detection of NodeJS [bug](https://github.com/nodejs/node/issues/41038) in `structuredClone` that can not clone `DOMException` (just in case for future versions that will fix other issues) - Compat data: - Added NodeJS 18.3 compat data mapping diff --git a/packages/core-js/internals/engine-is-deno.js b/packages/core-js/internals/engine-is-deno.js new file mode 100644 index 000000000000..9ec08ce9574a --- /dev/null +++ b/packages/core-js/internals/engine-is-deno.js @@ -0,0 +1,2 @@ +/* global Deno -- Deno case */ +module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; diff --git a/packages/core-js/modules/web.structured-clone.js b/packages/core-js/modules/web.structured-clone.js index 9157a020a4ed..babe1eadb110 100644 --- a/packages/core-js/modules/web.structured-clone.js +++ b/packages/core-js/modules/web.structured-clone.js @@ -19,6 +19,10 @@ var lengthOfArrayLike = require('../internals/length-of-array-like'); var validateArgumentsLength = require('../internals/validate-arguments-length'); var getRegExpFlags = require('../internals/regexp-get-flags'); var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable'); +var V8 = require('../internals/engine-v8-version'); +var IS_BROWSER = require('../internals/engine-is-browser'); +var IS_DENO = require('../internals/engine-is-deno'); +var IS_NODE = require('../internals/engine-is-node'); var Object = global.Object; var Date = global.Date; @@ -402,6 +406,9 @@ var structuredCloneInternal = function (value, map) { }; var PROPER_TRANSFER = nativeStructuredClone && !fails(function () { + // prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if ((IS_DENO && V8 > 92) || (IS_NODE && V8 > 94) || (IS_BROWSER && V8 > 97)) return false; var buffer = new ArrayBuffer(8); var clone = nativeStructuredClone(buffer, { transfer: [buffer] }); return buffer.byteLength != 0 || clone.byteLength != 8;