Skip to content

Commit

Permalink
bootstrap: stop delaying instantiation of maps in per-context scripts
Browse files Browse the repository at this point in the history
The linked issue, https://bugs.chromium.org/p/v8/issues/detail?id=6593,
is marked as "Fixed", so I think we can revert this now.

This reverts commit 08a9c4a.

Signed-off-by: Darshan Sen <raisinten@gmail.com>

PR-URL: #42934
Refs: https://bugs.chromium.org/p/v8/issues/detail?id=9187
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
  • Loading branch information
RaisinTen authored and targos committed Sep 16, 2022
1 parent ab78589 commit 588f5de
Showing 1 changed file with 37 additions and 60 deletions.
97 changes: 37 additions & 60 deletions lib/internal/per_context/domexception.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,37 +38,18 @@ function throwInvalidThisError(Base, type) {
throw err;
}

let disusedNamesSet;
let internalsMap;
let nameToCodeMap;
let isInitialized = false;
const internalsMap = new SafeWeakMap();
const nameToCodeMap = new SafeMap();

// We need to instantiate the maps lazily because they render
// the snapshot non-rehashable.
// https://bugs.chromium.org/p/v8/issues/detail?id=6593
function ensureInitialized() {
if (isInitialized) {
return;
}
internalsMap = new SafeWeakMap();
nameToCodeMap = new SafeMap();
forEachCode((name, codeName, value) => {
nameToCodeMap.set(name, value);
});

// These were removed from the error names table.
// See https://github.com/heycam/webidl/pull/946.
disusedNamesSet = new SafeSet()
.add('DOMStringSizeError')
.add('NoDataAllowedError')
.add('ValidationError');

isInitialized = true;
}
// These were removed from the error names table.
// See https://github.com/heycam/webidl/pull/946.
const disusedNamesSet = new SafeSet()
.add('DOMStringSizeError')
.add('NoDataAllowedError')
.add('ValidationError');

class DOMException {
constructor(message = '', name = 'Error') {
ensureInitialized();
ErrorCaptureStackTrace(this);
internalsMap.set(this, {
message: `${message}`,
Expand All @@ -77,7 +58,6 @@ class DOMException {
}

get name() {
ensureInitialized();
const internals = internalsMap.get(this);
if (internals === undefined) {
throwInvalidThisError(TypeError, 'DOMException');
Expand All @@ -86,7 +66,6 @@ class DOMException {
}

get message() {
ensureInitialized();
const internals = internalsMap.get(this);
if (internals === undefined) {
throwInvalidThisError(TypeError, 'DOMException');
Expand All @@ -95,7 +74,6 @@ class DOMException {
}

get code() {
ensureInitialized();
const internals = internalsMap.get(this);
if (internals === undefined) {
throwInvalidThisError(TypeError, 'DOMException');
Expand All @@ -118,40 +96,39 @@ ObjectDefineProperties(DOMException.prototype, {
code: { __proto__: null, enumerable: true, configurable: true }
});

function forEachCode(fn) {
fn('IndexSizeError', 'INDEX_SIZE_ERR', 1);
fn('DOMStringSizeError', 'DOMSTRING_SIZE_ERR', 2);
fn('HierarchyRequestError', 'HIERARCHY_REQUEST_ERR', 3);
fn('WrongDocumentError', 'WRONG_DOCUMENT_ERR', 4);
fn('InvalidCharacterError', 'INVALID_CHARACTER_ERR', 5);
fn('NoDataAllowedError', 'NO_DATA_ALLOWED_ERR', 6);
fn('NoModificationAllowedError', 'NO_MODIFICATION_ALLOWED_ERR', 7);
fn('NotFoundError', 'NOT_FOUND_ERR', 8);
fn('NotSupportedError', 'NOT_SUPPORTED_ERR', 9);
fn('InUseAttributeError', 'INUSE_ATTRIBUTE_ERR', 10);
fn('InvalidStateError', 'INVALID_STATE_ERR', 11);
fn('SyntaxError', 'SYNTAX_ERR', 12);
fn('InvalidModificationError', 'INVALID_MODIFICATION_ERR', 13);
fn('NamespaceError', 'NAMESPACE_ERR', 14);
fn('InvalidAccessError', 'INVALID_ACCESS_ERR', 15);
fn('ValidationError', 'VALIDATION_ERR', 16);
fn('TypeMismatchError', 'TYPE_MISMATCH_ERR', 17);
fn('SecurityError', 'SECURITY_ERR', 18);
fn('NetworkError', 'NETWORK_ERR', 19);
fn('AbortError', 'ABORT_ERR', 20);
fn('URLMismatchError', 'URL_MISMATCH_ERR', 21);
fn('QuotaExceededError', 'QUOTA_EXCEEDED_ERR', 22);
fn('TimeoutError', 'TIMEOUT_ERR', 23);
fn('InvalidNodeTypeError', 'INVALID_NODE_TYPE_ERR', 24);
fn('DataCloneError', 'DATA_CLONE_ERR', 25);
for (const { 0: name, 1: codeName, 2: value } of [
['IndexSizeError', 'INDEX_SIZE_ERR', 1],
['DOMStringSizeError', 'DOMSTRING_SIZE_ERR', 2],
['HierarchyRequestError', 'HIERARCHY_REQUEST_ERR', 3],
['WrongDocumentError', 'WRONG_DOCUMENT_ERR', 4],
['InvalidCharacterError', 'INVALID_CHARACTER_ERR', 5],
['NoDataAllowedError', 'NO_DATA_ALLOWED_ERR', 6],
['NoModificationAllowedError', 'NO_MODIFICATION_ALLOWED_ERR', 7],
['NotFoundError', 'NOT_FOUND_ERR', 8],
['NotSupportedError', 'NOT_SUPPORTED_ERR', 9],
['InUseAttributeError', 'INUSE_ATTRIBUTE_ERR', 10],
['InvalidStateError', 'INVALID_STATE_ERR', 11],
['SyntaxError', 'SYNTAX_ERR', 12],
['InvalidModificationError', 'INVALID_MODIFICATION_ERR', 13],
['NamespaceError', 'NAMESPACE_ERR', 14],
['InvalidAccessError', 'INVALID_ACCESS_ERR', 15],
['ValidationError', 'VALIDATION_ERR', 16],
['TypeMismatchError', 'TYPE_MISMATCH_ERR', 17],
['SecurityError', 'SECURITY_ERR', 18],
['NetworkError', 'NETWORK_ERR', 19],
['AbortError', 'ABORT_ERR', 20],
['URLMismatchError', 'URL_MISMATCH_ERR', 21],
['QuotaExceededError', 'QUOTA_EXCEEDED_ERR', 22],
['TimeoutError', 'TIMEOUT_ERR', 23],
['InvalidNodeTypeError', 'INVALID_NODE_TYPE_ERR', 24],
['DataCloneError', 'DATA_CLONE_ERR', 25],
// There are some more error names, but since they don't have codes assigned,
// we don't need to care about them.
}

forEachCode((name, codeName, value) => {
]) {
const desc = { enumerable: true, value };
ObjectDefineProperty(DOMException, codeName, desc);
ObjectDefineProperty(DOMException.prototype, codeName, desc);
});
nameToCodeMap.set(name, value);
}

exports.DOMException = DOMException;

0 comments on commit 588f5de

Please sign in to comment.