diff --git a/core/01_core.js b/core/01_core.js index 3972dec333..72cbe31f71 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -28,13 +28,13 @@ SafeArrayIterator, SafeMap, SafePromisePrototypeFinally, - setQueueMicrotask, StringPrototypeSlice, StringPrototypeSplit, SymbolFor, SyntaxError, TypeError, URIError, + setQueueMicrotask, } = window.__bootstrap.primordials; const { ops, asyncOps } = window.Deno.core; diff --git a/ext/cache/01_cache.js b/ext/cache/01_cache.js index 8cbf540fa7..9b5404acbb 100644 --- a/ext/cache/01_cache.js +++ b/ext/cache/01_cache.js @@ -4,9 +4,12 @@ const core = globalThis.Deno.core; import * as webidl from "ext:deno_webidl/00_webidl.js"; const primordials = globalThis.__bootstrap.primordials; const { + ArrayPrototypePush, + ObjectPrototypeIsPrototypeOf, + StringPrototypeSplit, + StringPrototypeTrim, Symbol, TypeError, - ObjectPrototypeIsPrototypeOf, } = primordials; import { Request, @@ -101,10 +104,10 @@ class Cache { // Step 7. const varyHeader = getHeader(innerResponse.headerList, "vary"); if (varyHeader) { - const fieldValues = varyHeader.split(","); + const fieldValues = StringPrototypeSplit(varyHeader, ","); for (let i = 0; i < fieldValues.length; ++i) { const field = fieldValues[i]; - if (field.trim() === "*") { + if (StringPrototypeTrim(field) === "*") { throw new TypeError("Vary header must not contain '*'"); } } @@ -258,7 +261,7 @@ class Cache { statusText: meta.responseStatusText, }, ); - responses.push(response); + ArrayPrototypePush(responses, response); } } // Step 5.4-5.5: don't apply in this context. diff --git a/ext/console/01_console.js b/ext/console/01_console.js index 318cf9cb42..3b2f449178 100644 --- a/ext/console/01_console.js +++ b/ext/console/01_console.js @@ -6,118 +6,134 @@ const core = globalThis.Deno.core; const internals = globalThis.__bootstrap.internals; const primordials = globalThis.__bootstrap.primordials; const { - DateNow, - Boolean, - ObjectKeys, - ObjectAssign, - ObjectCreate, - ObjectFreeze, - ObjectValues, - ObjectFromEntries, - ObjectPrototypeHasOwnProperty, - ObjectPrototypeIsPrototypeOf, - ObjectDefineProperty, - String, - SafeStringIterator, - DatePrototype, - MapPrototypeEntries, - SetPrototypeGetSize, - StringPrototypeRepeat, - StringPrototypeEndsWith, - StringPrototypeIndexOf, - RegExpPrototypeExec, - RegExpPrototypeSymbolReplace, - StringPrototypeReplace, - StringPrototypeReplaceAll, - ObjectPrototype, - FunctionPrototypeCall, - StringPrototypeSplit, - StringPrototypeSlice, - StringPrototypeCharCodeAt, - MathFloor, - StringPrototypePadEnd, - ObjectGetOwnPropertySymbols, - ObjectGetOwnPropertyNames, - SymbolPrototypeGetDescription, - SymbolPrototypeToString, - ArrayPrototypePushApply, - ObjectPrototypePropertyIsEnumerable, - StringPrototypeMatch, - StringPrototypePadStart, - StringPrototypeTrim, - StringPrototypeIncludes, - NumberIsInteger, - NumberParseInt, - SafeArrayIterator, - SafeMap, - ArrayPrototypeShift, AggregateErrorPrototype, - RegExpPrototypeTest, - ObjectPrototypeToString, - ArrayPrototypeSort, - ArrayPrototypeUnshift, - DatePrototypeGetTime, - DatePrototypeToISOString, - SafeRegExp, - SetPrototype, - Symbol, - SymbolToStringTag, - SymbolHasInstance, - SymbolFor, - ObjectGetOwnPropertyDescriptor, - ObjectIs, - Uint8Array, - isNaN, - TypedArrayPrototypeGetSymbolToStringTag, - TypedArrayPrototypeGetLength, - ReflectOwnKeys, Array, - RegExpPrototypeToString, - ArrayIsArray, - SymbolIterator, ArrayBufferIsView, - ArrayPrototypeJoin, - ArrayPrototypeMap, - ArrayPrototypeReduce, - ObjectSetPrototypeOf, - ArrayPrototypePush, - ArrayPrototypeIncludes, + ArrayBufferPrototypeGetByteLength, + ArrayIsArray, ArrayPrototypeFill, ArrayPrototypeFilter, ArrayPrototypeFind, - FunctionPrototypeBind, - MapPrototype, - MapPrototypeHas, - MapPrototypeGet, - MapPrototypeSet, - MapPrototypeDelete, - MapPrototypeForEach, - MapPrototypeGetSize, + ArrayPrototypeForEach, + ArrayPrototypeIncludes, + ArrayPrototypeJoin, + ArrayPrototypeMap, + ArrayPrototypePop, + ArrayPrototypePush, + ArrayPrototypePushApply, + ArrayPrototypeReduce, + ArrayPrototypeShift, + ArrayPrototypeSlice, + ArrayPrototypeSort, + ArrayPrototypeSplice, + ArrayPrototypeUnshift, + BigIntPrototypeValueOf, + Boolean, + BooleanPrototypeValueOf, + DateNow, + DatePrototype, + DatePrototypeGetTime, + DatePrototypeToISOString, Error, - ErrorPrototype, ErrorCaptureStackTrace, - MathSqrt, + ErrorPrototype, + FunctionPrototypeBind, + FunctionPrototypeCall, + FunctionPrototypeToString, + MapPrototype, + MapPrototypeDelete, + MapPrototypeEntries, + MapPrototypeForEach, + MapPrototypeGet, + MapPrototypeGetSize, + MapPrototypeHas, + MapPrototypeSet, MathAbs, + MathFloor, MathMax, MathMin, MathRound, + MathSqrt, Number, + NumberIsInteger, + NumberParseInt, NumberPrototypeToString, + NumberPrototypeValueOf, + ObjectAssign, + ObjectCreate, + ObjectDefineProperty, + ObjectFreeze, + ObjectFromEntries, + ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyNames, + ObjectGetOwnPropertySymbols, + ObjectGetPrototypeOf, + ObjectIs, + ObjectKeys, + ObjectPrototype, + ObjectPrototypeHasOwnProperty, + ObjectPrototypeIsPrototypeOf, + ObjectPrototypePropertyIsEnumerable, + ObjectPrototypeToString, + ObjectSetPrototypeOf, + ObjectValues, Proxy, ReflectGet, ReflectGetOwnPropertyDescriptor, ReflectGetPrototypeOf, ReflectHas, - BigIntPrototypeValueOf, - ObjectGetPrototypeOf, - FunctionPrototypeToString, - StringPrototypeStartsWith, - SetPrototypeValues, + ReflectOwnKeys, + RegExpPrototypeExec, + RegExpPrototypeSymbolReplace, + RegExpPrototypeTest, + RegExpPrototypeToString, + SafeArrayIterator, + SafeMap, + SafeMapIterator, + SafeRegExp, SafeSet, SafeSetIterator, + SafeStringIterator, + SetPrototype, + SetPrototypeAdd, + SetPrototypeHas, + SetPrototypeGetSize, + SetPrototypeValues, + String, + StringPrototypeCharCodeAt, + StringPrototypeCodePointAt, + StringPrototypeEndsWith, + StringPrototypeIncludes, + StringPrototypeIndexOf, + StringPrototypeLastIndexOf, + StringPrototypeMatch, + StringPrototypeNormalize, + StringPrototypePadEnd, + StringPrototypePadStart, + StringPrototypeRepeat, + StringPrototypeReplace, + StringPrototypeReplaceAll, + StringPrototypeSlice, + StringPrototypeSplit, + StringPrototypeStartsWith, + StringPrototypeToLowerCase, + StringPrototypeTrim, + StringPrototypeValueOf, + Symbol, + SymbolFor, + SymbolHasInstance, + SymbolIterator, + SymbolPrototypeGetDescription, + SymbolPrototypeToString, + SymbolPrototypeValueOf, + SymbolToStringTag, TypedArrayPrototypeGetByteLength, - SafeMapIterator, - ArrayBufferPrototype, + TypedArrayPrototypeGetLength, + TypedArrayPrototypeGetSymbolToStringTag, + Uint8Array, + WeakMapPrototypeHas, + WeakSetPrototypeHas, + isNaN, } = primordials; let noColor = false; @@ -227,45 +243,9 @@ defineColorAlias("inverse", "swapColors"); defineColorAlias("inverse", "swapcolors"); defineColorAlias("doubleunderline", "doubleUnderline"); -// https://tc39.es/ecma262/#sec-boolean.prototype.valueof -const _booleanValueOf = Boolean.prototype.valueOf; - -// https://tc39.es/ecma262/#sec-number.prototype.valueof -const _numberValueOf = Number.prototype.valueOf; - -// https://tc39.es/ecma262/#sec-string.prototype.valueof -const _stringValueOf = String.prototype.valueOf; - -// https://tc39.es/ecma262/#sec-symbol.prototype.valueof -const _symbolValueOf = Symbol.prototype.valueOf; - -// https://tc39.es/ecma262/#sec-weakmap.prototype.has -const _weakMapHas = WeakMap.prototype.has; - -// https://tc39.es/ecma262/#sec-weakset.prototype.has -const _weakSetHas = WeakSet.prototype.has; - -// https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.bytelength -const _getArrayBufferByteLength = ObjectGetOwnPropertyDescriptor( - ArrayBufferPrototype, - "byteLength", -).get; - // https://tc39.es/ecma262/#sec-get-sharedarraybuffer.prototype.bytelength let _getSharedArrayBufferByteLength; -// https://tc39.es/ecma262/#sec-get-set.prototype.size -const _getSetSize = ObjectGetOwnPropertyDescriptor( - SetPrototype, - "size", -).get; - -// https://tc39.es/ecma262/#sec-get-map.prototype.size -const _getMapSize = ObjectGetOwnPropertyDescriptor( - MapPrototype, - "size", -).get; - function isObjectLike(value) { return value !== null && typeof value === "object"; } @@ -284,7 +264,7 @@ export function isArgumentsObject(value) { export function isArrayBuffer(value) { try { - _getArrayBufferByteLength.call(value); + ArrayBufferPrototypeGetByteLength(value); return true; } catch { return false; @@ -311,7 +291,7 @@ export function isBooleanObject(value) { } try { - _booleanValueOf.call(value); + BooleanPrototypeValueOf(value); return true; } catch { return false; @@ -352,7 +332,7 @@ export function isGeneratorFunction( export function isMap(value) { try { - _getMapSize.call(value); + MapPrototypeGetSize(value); return true; } catch { return false; @@ -391,7 +371,7 @@ export function isNumberObject(value) { } try { - _numberValueOf.call(value); + NumberPrototypeValueOf(value); return true; } catch { return false; @@ -427,7 +407,7 @@ export function isRegExp(value) { export function isSet(value) { try { - _getSetSize.call(value); + SetPrototypeGetSize(value); return true; } catch { return false; @@ -454,7 +434,7 @@ export function isSharedArrayBuffer( ).get; try { - _getSharedArrayBufferByteLength.call(value); + FunctionPrototypeCall(_getSharedArrayBufferByteLength, value); return true; } catch { return false; @@ -467,7 +447,7 @@ export function isStringObject(value) { } try { - _stringValueOf.call(value); + StringPrototypeValueOf(value); return true; } catch { return false; @@ -480,7 +460,7 @@ export function isSymbolObject(value) { } try { - _symbolValueOf.call(value); + SymbolPrototypeValueOf(value); return true; } catch { return false; @@ -491,7 +471,7 @@ export function isWeakMap( value, ) { try { - _weakMapHas.call(value, null); + WeakMapPrototypeHas(value, null); return true; } catch { return false; @@ -502,7 +482,7 @@ export function isWeakSet( value, ) { try { - _weakSetHas.call(value, null); + WeakSetPrototypeHas(value, null); return true; } catch { return false; @@ -552,7 +532,7 @@ const keyStrRegExp = new SafeRegExp("^[a-zA-Z_][a-zA-Z_0-9]*$"); const numberRegExp = new SafeRegExp("^(0|[1-9][0-9]*)$"); // TODO(wafuwafu13): Figure out -const escapeFn = (str) => meta[str.charCodeAt(0)]; +const escapeFn = (str) => meta[StringPrototypeCharCodeAt(str, 0)]; function stylizeNoColor(str) { return str; @@ -711,16 +691,16 @@ function formatValue( // Using an array here is actually better for the average case than using // a Set. `seen` will only check for the depth and will never grow too large. - if (ctx.seen.includes(value)) { + if (ArrayPrototypeIncludes(ctx.seen, value)) { let index = 1; if (ctx.circular === undefined) { ctx.circular = new SafeMap(); - ctx.circular.set(value, index); + MapPrototypeSet(ctx.circular, value, index); } else { index = ctx.circular.get(value); if (index === undefined) { index = ctx.circular.size + 1; - ctx.circular.set(value, index); + MapPrototypeSet(ctx.circular, value, index); } } return ctx.stylize(`[Circular *${index}]`, "special"); @@ -1006,7 +986,7 @@ function formatRaw(ctx, value, recurseTimes, typedArray, proxyDetails) { } else if (isModuleNamespaceObject(value)) { braces[0] = `${getPrefix(constructor, tag, "Module")}{`; // Special handle keys for namespace objects. - formatter = formatNamespaceObject.bind(null, keys); + formatter = FunctionPrototypeBind(formatNamespaceObject, null, keys); } else if (isBoxedPrimitive(value)) { base = getBoxedBase(value, ctx, keys, constructor, tag); if (keys.length === 0 && protoProps === undefined) { @@ -1039,7 +1019,7 @@ function formatRaw(ctx, value, recurseTimes, typedArray, proxyDetails) { } recurseTimes += 1; - ctx.seen.push(value); + ArrayPrototypePush(ctx.seen, value); ctx.currentDepth = recurseTimes; let output; const indentationLvl = ctx.indentationLvl; @@ -1075,15 +1055,19 @@ function formatRaw(ctx, value, recurseTimes, typedArray, proxyDetails) { } } } - ctx.seen.pop(); + ArrayPrototypePop(ctx.seen); if (ctx.sorted) { const comparator = ctx.sorted === true ? undefined : ctx.sorted; if (extrasType === kObjectType) { output = ArrayPrototypeSort(output, comparator); } else if (keys.length > 1) { - const sorted = output.slice(output.length - keys.length).sort(comparator); - output.splice( + const sorted = ArrayPrototypeSort( + ArrayPrototypeSlice(output, output.length - keys.length), + comparator, + ); + ArrayPrototypeSplice( + output, output.length - keys.length, keys.length, ...new SafeArrayIterator(sorted), @@ -1118,8 +1102,9 @@ function formatRaw(ctx, value, recurseTimes, typedArray, proxyDetails) { const builtInObjectsRegExp = new SafeRegExp("^[A-Z][a-zA-Z0-9]+$"); const builtInObjects = new SafeSet( - ObjectGetOwnPropertyNames(globalThis).filter((e) => - builtInObjectsRegExp.test(e) + ArrayPrototypeFilter( + ObjectGetOwnPropertyNames(globalThis), + (e) => RegExpPrototypeTest(builtInObjectsRegExp, e), ), ); @@ -1145,7 +1130,7 @@ function addPrototypeProperties( if ( descriptor !== undefined && typeof descriptor.value === "function" && - builtInObjects.has(descriptor.value.name) + SetPrototypeHas(builtInObjects, descriptor.value.name) ) { return; } @@ -1154,18 +1139,17 @@ function addPrototypeProperties( if (depth === 0) { keySet = new SafeSet(); } else { - Array.prototype.forEach.call(keys, (key) => keySet.add(key)); + ArrayPrototypeForEach(keys, (key) => SetPrototypeAdd(keySet, key)); } // Get all own property names and symbols. keys = ReflectOwnKeys(obj); - Array.prototype.push.call(ctx.seen, main); + ArrayPrototypePush(ctx.seen, main); for (const key of new SafeArrayIterator(keys)) { // Ignore the `constructor` property and keys that exist on layers above. if ( key === "constructor" || - // deno-lint-ignore no-prototype-builtins - main.hasOwnProperty(key) || - (depth !== 0 && keySet.has(key)) + ObjectPrototypeHasOwnProperty(main, key) || + (depth !== 0 && SetPrototypeHas(keySet, key)) ) { continue; } @@ -1184,12 +1168,12 @@ function addPrototypeProperties( ); if (ctx.colors) { // Faint! - Array.prototype.push.call(output, `\u001b[2m${value}\u001b[22m`); + ArrayPrototypePush(output, `\u001b[2m${value}\u001b[22m`); } else { - Array.prototype.push.call(output, value); + ArrayPrototypePush(output, value); } } - Array.prototype.pop.call(ctx.seen); + ArrayPrototypePop(ctx.seen); // Limit the inspection to up to three prototype layers. Using `recurseTimes` // is not a good choice here, because it's as if the properties are declared // on the current object from the users perspective. @@ -1218,7 +1202,7 @@ function getConstructorName(obj, ctx, recurseTimes, protoProps) { if ( protoProps !== undefined && (firstProto !== obj || - !builtInObjects.has(descriptor.value.name)) + !SetPrototypeHas(builtInObjects, descriptor.value.name)) ) { addPrototypeProperties( ctx, @@ -1273,7 +1257,7 @@ function formatPrimitive(fn, value, ctx) { let trailer = ""; if (value.length > ctx.maxStringLength) { const remaining = value.length - ctx.maxStringLength; - value = value.slice(0, ctx.maxStringLength); + value = StringPrototypeSlice(value, 0, ctx.maxStringLength); trailer = `... ${remaining} more character${remaining > 1 ? "s" : ""}`; } if ( @@ -1283,10 +1267,13 @@ function formatPrimitive(fn, value, ctx) { value.length > kMinLineLength && value.length > ctx.breakLength - ctx.indentationLvl - 4 ) { - return value - .split(formatPrimitiveRegExp) - .map((line) => fn(quoteString(line, ctx), "string")) - .join(` +\n${" ".repeat(ctx.indentationLvl + 2)}`) + trailer; + return ArrayPrototypeJoin( + ArrayPrototypeMap( + StringPrototypeSplit(value, formatPrimitiveRegExp), + (line) => fn(quoteString(line, ctx), "string"), + ), + ` +\n${StringPrototypeRepeat(" ", ctx.indentationLvl + 2)}`, + ) + trailer; } return fn(quoteString(value, ctx), "string") + trailer; } @@ -1328,14 +1315,19 @@ function formatArray(ctx, value, recurseTimes) { const output = []; for (let i = 0; i < len; i++) { // Special handle sparse arrays. - // deno-lint-ignore no-prototype-builtins - if (!value.hasOwnProperty(i)) { + if (!ObjectPrototypeHasOwnProperty(value, i)) { return formatSpecialArray(ctx, value, recurseTimes, len, output, i); } - output.push(formatProperty(ctx, value, recurseTimes, i, kArrayType)); + ArrayPrototypePush( + output, + formatProperty(ctx, value, recurseTimes, i, kArrayType), + ); } if (remaining > 0) { - output.push(`... ${remaining} more item${remaining > 1 ? "s" : ""}`); + ArrayPrototypePush( + output, + `... ${remaining} more item${remaining > 1 ? "s" : ""}`, + ); } return output; } @@ -1393,10 +1385,13 @@ function formatSet(value, ctx, _ignored, recurseTimes) { const remaining = valLen - len; const output = []; for (let i = 0; i < len; i++) { - output.push(formatValue(ctx, values[i], recurseTimes)); + ArrayPrototypePush(output, formatValue(ctx, values[i], recurseTimes)); } if (remaining > 0) { - output.push(`... ${remaining} more item${remaining > 1 ? "s" : ""}`); + ArrayPrototypePush( + output, + `... ${remaining} more item${remaining > 1 ? "s" : ""}`, + ); } ctx.indentationLvl -= 2; @@ -1413,14 +1408,18 @@ function formatMap(value, ctx, _gnored, recurseTimes) { const remaining = valLen - len; const output = []; for (let i = 0; i < len; i++) { - output.push( + ArrayPrototypePush( + output, `${formatValue(ctx, values[i][0], recurseTimes)} => ${ formatValue(ctx, values[i][1], recurseTimes) }`, ); } if (remaining > 0) { - output.push(`... ${remaining} more item${remaining > 1 ? "s" : ""}`); + ArrayPrototypePush( + output, + `... ${remaining} more item${remaining > 1 ? "s" : ""}`, + ); } ctx.indentationLvl -= 2; @@ -1460,7 +1459,7 @@ function formatTypedArray( ]) ) { const str = formatValue(ctx, value[key], recurseTimes, true); - Array.prototype.push.call(output, `[${key}]: ${str}`); + ArrayPrototypePush(output, `[${key}]: ${str}`); } ctx.indentationLvl -= 2; } @@ -1484,7 +1483,11 @@ function formatIterator(braces, ctx, value, recurseTimes) { const { 0: entries, 1: isKeyValue } = value; if (isKeyValue) { // Mark entry iterators as such. - braces[0] = braces[0].replace(iteratorRegExp, " Entries] {"); + braces[0] = StringPrototypeReplace( + braces[0], + iteratorRegExp, + " Entries] {", + ); return formatMapIterInner(ctx, recurseTimes, entries, kMapEntries); } @@ -1627,8 +1630,13 @@ function formatArrayBuffer(ctx, value) { } catch { return [ctx.stylize("(detached)", "special")]; } - let str = hexSlice(buffer, 0, MathMin(ctx.maxArrayLength, buffer.length)) - .replace(arrayBufferRegExp, "$1 ").trim(); + let str = StringPrototypeTrim( + StringPrototypeReplace( + hexSlice(buffer, 0, MathMin(ctx.maxArrayLength, buffer.length)), + arrayBufferRegExp, + "$1 ", + ), + ); const remaining = buffer.length - ctx.maxArrayLength; if (remaining > 0) { @@ -1703,7 +1711,7 @@ function formatProperty( ctx.indentationLvl += diff; str = formatValue(ctx, desc.value, recurseTimes); if (diff === 3 && ctx.breakLength < getStringWidth(str, ctx.colors)) { - extra = `\n${" ".repeat(ctx.indentationLvl)}`; + extra = `\n${StringPrototypeRepeat(" ", ctx.indentationLvl)}`; } ctx.indentationLvl -= diff; } else if (desc.get !== undefined) { @@ -1716,7 +1724,7 @@ function formatProperty( (ctx.getters === "set" && desc.set !== undefined)) ) { try { - const tmp = desc.get.call(original); + const tmp = FunctionPrototypeCall(desc.get, original); ctx.indentationLvl += 2; if (tmp === null) { str = `${s(`[${label}:`, sp)} ${s("null", "null")}${s("]", sp)}`; @@ -1747,7 +1755,11 @@ function formatProperty( } else if (key === "__proto__") { name = "['__proto__']"; } else if (desc.enumerable === false) { - const tmp = key.replace(strEscapeSequencesReplacer, escapeFn); + const tmp = StringPrototypeReplace( + key, + strEscapeSequencesReplacer, + escapeFn, + ); name = `[${tmp}]`; } else if (keyStrRegExp.test(key)) { @@ -1780,7 +1792,7 @@ function handleMaxCallStackSize( const colorRegExp = new SafeRegExp("\u001b\\[\\d\\d?m", "g"); function removeColors(str) { - return str.replace(colorRegExp, ""); + return StringPrototypeReplace(str, colorRegExp, ""); } function isBelowBreakLength(ctx, output, start, base) { @@ -1836,10 +1848,10 @@ function formatNamespaceObject( // this aligned, even though this is a hacky way of dealing with this. const tmp = { [keys[i]]: "" }; output[i] = formatProperty(ctx, tmp, recurseTimes, keys[i], kObjectType); - const pos = output[i].lastIndexOf(" "); + const pos = StringPrototypeLastIndexOf(output[i], " "); // We have to find the last whitespace and have to replace that value as // it will be visualized as a regular string. - output[i] = output[i].slice(0, pos + 1) + + output[i] = StringPrototypeSlice(output[i], 0, pos + 1) + ctx.stylize("", "special"); } } @@ -1873,13 +1885,16 @@ function formatSpecialArray( const emptyItems = tmp - index; const ending = emptyItems > 1 ? "s" : ""; const message = `<${emptyItems} empty item${ending}>`; - output.push(ctx.stylize(message, "undefined")); + ArrayPrototypePush(output, ctx.stylize(message, "undefined")); index = tmp; if (output.length === maxLength) { break; } } - output.push(formatProperty(ctx, value, recurseTimes, key, kArrayType)); + ArrayPrototypePush( + output, + formatProperty(ctx, value, recurseTimes, key, kArrayType), + ); index++; } const remaining = value.length - index; @@ -1887,10 +1902,13 @@ function formatSpecialArray( if (remaining > 0) { const ending = remaining > 1 ? "s" : ""; const message = `<${remaining} empty item${ending}>`; - output.push(ctx.stylize(message, "undefined")); + ArrayPrototypePush(output, ctx.stylize(message, "undefined")); } } else if (remaining > 0) { - output.push(`... ${remaining} more item${remaining > 1 ? "s" : ""}`); + ArrayPrototypePush( + output, + `... ${remaining} more item${remaining > 1 ? "s" : ""}`, + ); } return output; } @@ -1902,22 +1920,28 @@ function getBoxedBase( constructor, tag, ) { - let type; + let type, primitive; if (isNumberObject(value)) { type = "Number"; + primitive = NumberPrototypeValueOf(value); } else if (isStringObject(value)) { type = "String"; + primitive = StringPrototypeValueOf(value); // For boxed Strings, we have to remove the 0-n indexed entries, // since they just noisy up the output and are redundant // Make boxed primitive Strings look like such - keys.splice(0, value.length); + ArrayPrototypeSplice(keys, 0, value.length); } else if (isBooleanObject(value)) { type = "Boolean"; + primitive = BooleanPrototypeValueOf(value); } else if (isBigIntObject(value)) { type = "BigInt"; + primitive = BigIntPrototypeValueOf(value); } else { type = "Symbol"; + primitive = SymbolPrototypeValueOf(value); } + let base = `[${type}`; if (type !== constructor) { if (constructor === null) { @@ -1926,15 +1950,14 @@ function getBoxedBase( base += ` (${constructor})`; } } - - base += `: ${formatPrimitive(stylizeNoColor, value.valueOf(), ctx)}]`; + base += `: ${formatPrimitive(stylizeNoColor, primitive, ctx)}]`; if (tag !== "" && tag !== constructor) { base += ` [${tag}]`; } if (keys.length !== 0 || ctx.stylize === stylizeNoColor) { return base; } - return ctx.stylize(base, type.toLowerCase()); + return ctx.stylize(base, StringPrototypeToLowerCase(type)); } function reduceToSingleString( @@ -2140,7 +2163,7 @@ function formatMapIterInner( const len = entries.length / 2; const remaining = len - maxArrayLength; const maxLength = MathMin(maxArrayLength, len); - let output = new Array(maxLength); + const output = new Array(maxLength); let i = 0; ctx.indentationLvl += 2; if (state === kWeak) { @@ -2154,7 +2177,7 @@ function formatMapIterInner( // retrieved ones exist, we can not reliably return the same output) if the // output is not sorted anyway. if (!ctx.sorted) { - output = output.sort(); + ArrayPrototypeSort(output); } } else { for (; i < maxLength; i++) { @@ -2175,7 +2198,10 @@ function formatMapIterInner( } ctx.indentationLvl -= 2; if (remaining > 0) { - output.push(`... ${remaining} more item${remaining > 1 ? "s" : ""}`); + ArrayPrototypePush( + output, + `... ${remaining} more item${remaining > 1 ? "s" : ""}`, + ); } return output; } @@ -2198,11 +2224,11 @@ function formatSetIterInner( // Sort all entries to have a halfway reliable output (if more entries than // retrieved ones exist, we can not reliably return the same output) if the // output is not sorted anyway. - output.sort(); + ArrayPrototypeSort(output); } const remaining = entries.length - maxLength; if (remaining > 0) { - Array.prototype.push.call( + ArrayPrototypePush( output, `... ${remaining} more item${remaining > 1 ? "s" : ""}`, ); @@ -2229,9 +2255,9 @@ export function getStringWidth(str, removeControlChars = true) { if (removeControlChars) { str = stripVTControlCharacters(str); } - str = str.normalize("NFC"); + str = StringPrototypeNormalize(str, "NFC"); for (const char of new SafeStringIterator(str)) { - const code = char.codePointAt(0); + const code = StringPrototypeCodePointAt(char, 0); if (isFullWidthCodePoint(code)) { width += 2; } else if (!isZeroWidthCodePoint(code)) { @@ -2258,7 +2284,7 @@ const isZeroWidthCodePoint = (code) => { * Remove all VT control characters. Use to estimate displayed string width. */ export function stripVTControlCharacters(str) { - return str.replace(ansi, ""); + return StringPrototypeReplace(str, ansi, ""); } function hasOwnProperty(obj, v) { @@ -2353,7 +2379,10 @@ function cliTable(head, columns) { (n, a) => MathMax(n, a.length), 0, ); - const columnRightAlign = new Array(columnWidths.length).fill(true); + const columnRightAlign = ArrayPrototypeFill( + new Array(columnWidths.length), + true, + ); for (let i = 0; i < head.length; i++) { const column = columns[i]; @@ -3349,7 +3378,7 @@ class Console { const values = []; let hasPrimitives = false; - keys.forEach((k, idx) => { + ArrayPrototypeForEach(keys, (k, idx) => { const value = resultData[k]; const primitive = value === null || (typeof value !== "function" && typeof value !== "object"); diff --git a/ext/crypto/00_crypto.js b/ext/crypto/00_crypto.js index 2208124f6b..5be2e0c1c2 100644 --- a/ext/crypto/00_crypto.js +++ b/ext/crypto/00_crypto.js @@ -12,11 +12,12 @@ const primordials = globalThis.__bootstrap.primordials; import * as webidl from "ext:deno_webidl/00_webidl.js"; import DOMException from "ext:deno_web/01_dom_exception.js"; const { - ArrayBufferPrototype, - ArrayBufferPrototypeSlice, - ArrayBufferPrototypeGetByteLength, ArrayBufferIsView, + ArrayBufferPrototype, + ArrayBufferPrototypeGetByteLength, + ArrayBufferPrototypeSlice, ArrayPrototypeEvery, + ArrayPrototypeFilter, ArrayPrototypeFind, ArrayPrototypeIncludes, DataViewPrototypeGetBuffer, @@ -28,21 +29,21 @@ const { ObjectAssign, ObjectPrototypeHasOwnProperty, ObjectPrototypeIsPrototypeOf, - StringPrototypeToLowerCase, - StringPrototypeToUpperCase, - StringPrototypeCharCodeAt, - StringFromCharCode, SafeArrayIterator, SafeWeakMap, + StringFromCharCode, + StringPrototypeCharCodeAt, + StringPrototypeToLowerCase, + StringPrototypeToUpperCase, Symbol, SymbolFor, SyntaxError, - TypedArrayPrototypeSlice, + TypeError, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeGetByteLength, TypedArrayPrototypeGetByteOffset, TypedArrayPrototypeGetSymbolToStringTag, - TypeError, + TypedArrayPrototypeSlice, Uint8Array, WeakMapPrototypeGet, WeakMapPrototypeSet, @@ -388,7 +389,10 @@ function constructKey(type, extractable, usages, algorithm, handle) { * @returns */ function usageIntersection(a, b) { - return a.filter((i) => b.includes(i)); + return ArrayPrototypeFilter( + a, + (i) => ArrayPrototypeIncludes(b, i), + ); } // TODO(lucacasonato): this should be moved to rust diff --git a/ext/fetch/23_request.js b/ext/fetch/23_request.js index d3132dc625..4c46ebe750 100644 --- a/ext/fetch/23_request.js +++ b/ext/fetch/23_request.js @@ -37,6 +37,7 @@ const { ObjectKeys, ObjectPrototypeIsPrototypeOf, RegExpPrototypeTest, + StringPrototypeStartsWith, Symbol, SymbolFor, TypeError, @@ -90,7 +91,11 @@ function processUrlList(urlList, urlListProcessed) { */ function newInnerRequest(method, url, headerList, body, maybeBlob) { let blobUrlEntry = null; - if (maybeBlob && typeof url === "string" && url.startsWith("blob:")) { + if ( + maybeBlob && + typeof url === "string" && + StringPrototypeStartsWith(url, "blob:") + ) { blobUrlEntry = blobFromObjectUrl(url); } return { diff --git a/ext/fs/30_fs.js b/ext/fs/30_fs.js index bddafb09ee..8766d32fff 100644 --- a/ext/fs/30_fs.js +++ b/ext/fs/30_fs.js @@ -7,12 +7,15 @@ const { ArrayPrototypeFilter, Date, DatePrototype, + DatePrototypeGetTime, Error, Function, MathTrunc, ObjectEntries, ObjectPrototypeIsPrototypeOf, ObjectValues, + StringPrototypeSlice, + StringPrototypeStartsWith, SymbolAsyncIterator, SymbolIterator, Uint32Array, @@ -232,8 +235,8 @@ function createByteStruct(types) { for (let i = 0; i < typeEntries.length; ++i) { let { 0: name, 1: type } = typeEntries[i]; - const optional = type.startsWith("?"); - if (optional) type = type.slice(1); + const optional = StringPrototypeStartsWith(type, "?"); + if (optional) type = StringPrototypeSlice(type, 1); if (type == "u64") { if (!optional) { @@ -369,7 +372,7 @@ async function link(oldpath, newpath) { function toUnixTimeFromEpoch(value) { if (ObjectPrototypeIsPrototypeOf(DatePrototype, value)) { - const time = value.valueOf(); + const time = DatePrototypeGetTime(value); const seconds = MathTrunc(time / 1e3); const nanoseconds = MathTrunc(time - (seconds * 1e3)) * 1e6; diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js index 33742e122c..6aed08bddb 100644 --- a/ext/http/00_serve.js +++ b/ext/http/00_serve.js @@ -37,14 +37,15 @@ import { import { TcpConn } from "ext:deno_net/01_net.js"; const { ObjectPrototypeIsPrototypeOf, + PromisePrototypeCatch, SafeSet, SafeSetIterator, SetPrototypeAdd, SetPrototypeDelete, Symbol, TypeError, - Uint8ArrayPrototype, Uint8Array, + Uint8ArrayPrototype, } = primordials; const { @@ -667,7 +668,7 @@ async function serve(arg1, arg2) { if (req === 0xffffffff) { break; } - callback(req).catch((error) => { + PromisePrototypeCatch(callback(req), (error) => { // Abnormal exit console.error( "Terminating Deno.serve loop due to unexpected error", diff --git a/ext/http/01_http.js b/ext/http/01_http.js index 0048eedebb..f41a2beed6 100644 --- a/ext/http/01_http.js +++ b/ext/http/01_http.js @@ -54,8 +54,9 @@ const { SetPrototypeDelete, StringPrototypeCharCodeAt, StringPrototypeIncludes, - StringPrototypeToLowerCase, StringPrototypeSplit, + StringPrototypeToLowerCase, + StringPrototypeToUpperCase, Symbol, SymbolAsyncIterator, TypeError, @@ -497,17 +498,20 @@ function buildCaseInsensitiveCommaValueFinder(checkText) { StringPrototypeToLowerCase(checkText), "", ), - (c) => [c.charCodeAt(0), c.toUpperCase().charCodeAt(0)], + (c) => [ + StringPrototypeCharCodeAt(c, 0), + StringPrototypeCharCodeAt(StringPrototypeToUpperCase(c), 0), + ], ); /** @type {number} */ let i; /** @type {number} */ let char; - /** @param value {string} */ + /** @param {string} value */ return function (value) { for (i = 0; i < value.length; i++) { - char = value.charCodeAt(i); + char = StringPrototypeCharCodeAt(value, i); skipWhitespace(value); if (hasWord(value)) { diff --git a/ext/net/01_net.js b/ext/net/01_net.js index 81e13f0945..e8ce3a3001 100644 --- a/ext/net/01_net.js +++ b/ext/net/01_net.js @@ -11,13 +11,16 @@ import { import * as abortSignal from "ext:deno_web/03_abort_signal.js"; const primordials = globalThis.__bootstrap.primordials; const { + ArrayPrototypeFilter, + ArrayPrototypeForEach, + ArrayPrototypePush, Error, ObjectPrototypeIsPrototypeOf, PromiseResolve, SymbolAsyncIterator, SymbolFor, - TypedArrayPrototypeSubarray, TypeError, + TypedArrayPrototypeSubarray, Uint8Array, } = primordials; @@ -97,15 +100,16 @@ class Conn { const promise = core.read(this.rid, buffer); const promiseId = promise[promiseIdSymbol]; if (this.#unref) core.unrefOp(promiseId); - this.#pendingReadPromiseIds.push(promiseId); + ArrayPrototypePush(this.#pendingReadPromiseIds, promiseId); let nread; try { nread = await promise; } catch (e) { throw e; } finally { - this.#pendingReadPromiseIds = this.#pendingReadPromiseIds.filter((id) => - id !== promiseId + this.#pendingReadPromiseIds = ArrayPrototypeFilter( + this.#pendingReadPromiseIds, + (id) => id !== promiseId, ); } return nread === 0 ? null : nread; @@ -141,7 +145,7 @@ class Conn { if (this.#readable) { readableStreamForRidUnrefableRef(this.#readable); } - this.#pendingReadPromiseIds.forEach((id) => core.refOp(id)); + ArrayPrototypeForEach(this.#pendingReadPromiseIds, (id) => core.refOp(id)); } unref() { @@ -149,7 +153,10 @@ class Conn { if (this.#readable) { readableStreamForRidUnrefableUnref(this.#readable); } - this.#pendingReadPromiseIds.forEach((id) => core.unrefOp(id)); + ArrayPrototypeForEach( + this.#pendingReadPromiseIds, + (id) => core.unrefOp(id), + ); } } diff --git a/ext/url/00_url.js b/ext/url/00_url.js index 169cbe3a51..b4bc34b927 100644 --- a/ext/url/00_url.js +++ b/ext/url/00_url.js @@ -17,13 +17,14 @@ const { ArrayPrototypeSort, ArrayPrototypeSplice, ObjectKeys, - Uint32Array, SafeArrayIterator, StringPrototypeSlice, + StringPrototypeStartsWith, Symbol, SymbolFor, SymbolIterator, TypeError, + Uint32Array, } = primordials; const _list = Symbol("list"); @@ -421,7 +422,10 @@ class URL { #hasAuthority() { // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/lib.rs#L824 - return this.#serialization.slice(this.#schemeEnd).startsWith("://"); + return StringPrototypeStartsWith( + StringPrototypeSlice(this.#serialization, this.#schemeEnd), + "://", + ); } /** @return {string} */ @@ -429,7 +433,7 @@ class URL { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/quirks.rs#L263 return this.#fragmentStart - ? trim(this.#serialization.slice(this.#fragmentStart)) + ? trim(StringPrototypeSlice(this.#serialization, this.#fragmentStart)) : ""; } @@ -455,7 +459,11 @@ class URL { get host() { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/quirks.rs#L101 - return this.#serialization.slice(this.#hostStart, this.#pathStart); + return StringPrototypeSlice( + this.#serialization, + this.#hostStart, + this.#pathStart, + ); } /** @param {string} value */ @@ -480,7 +488,11 @@ class URL { get hostname() { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/lib.rs#L988 - return this.#serialization.slice(this.#hostStart, this.#hostEnd); + return StringPrototypeSlice( + this.#serialization, + this.#hostStart, + this.#hostEnd, + ); } /** @param {string} value */ @@ -523,7 +535,11 @@ class URL { get origin() { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/origin.rs#L14 - const scheme = this.#serialization.slice(0, this.#schemeEnd); + const scheme = StringPrototypeSlice( + this.#serialization, + 0, + this.#schemeEnd, + ); if ( scheme === "http" || scheme === "https" || scheme === "ftp" || scheme === "ws" || scheme === "wss" @@ -552,7 +568,8 @@ class URL { this.#usernameEnd !== this.#serialization.length && this.#serialization[this.#usernameEnd] === ":" ) { - return this.#serialization.slice( + return StringPrototypeSlice( + this.#serialization, this.#usernameEnd + 1, this.#hostStart - 1, ); @@ -583,11 +600,15 @@ class URL { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/lib.rs#L1203 if (!this.#queryStart && !this.#fragmentStart) { - return this.#serialization.slice(this.#pathStart); + return StringPrototypeSlice(this.#serialization, this.#pathStart); } const nextComponentStart = this.#queryStart || this.#fragmentStart; - return this.#serialization.slice(this.#pathStart, nextComponentStart); + return StringPrototypeSlice( + this.#serialization, + this.#pathStart, + nextComponentStart, + ); } /** @param {string} value */ @@ -613,9 +634,14 @@ class URL { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/quirks.rs#L196 if (this.#port === NO_PORT) { - return this.#serialization.slice(this.#hostEnd, this.#pathStart); + return StringPrototypeSlice( + this.#serialization, + this.#hostEnd, + this.#pathStart, + ); } else { - return this.#serialization.slice( + return StringPrototypeSlice( + this.#serialization, this.#hostEnd + 1, /* : */ this.#pathStart, ); @@ -644,7 +670,11 @@ class URL { get protocol() { webidl.assertBranded(this, URLPrototype); // https://github.com/servo/rust-url/blob/1d307ae51a28fecc630ecec03380788bfb03a643/url/src/quirks.rs#L56 - return this.#serialization.slice(0, this.#schemeEnd + 1 /* : */); + return StringPrototypeSlice( + this.#serialization, + 0, + this.#schemeEnd + 1, /* : */ + ); } /** @param {string} value */ @@ -672,7 +702,9 @@ class URL { const afterPath = this.#queryStart || this.#fragmentStart || this.#serialization.length; const afterQuery = this.#fragmentStart || this.#serialization.length; - return trim(this.#serialization.slice(afterPath, afterQuery)); + return trim( + StringPrototypeSlice(this.#serialization, afterPath, afterQuery), + ); } /** @param {string} value */ @@ -703,7 +735,8 @@ class URL { this.#hasAuthority() && this.#usernameEnd > this.#schemeEnd + schemeSeperatorLen ) { - return this.#serialization.slice( + return StringPrototypeSlice( + this.#serialization, this.#schemeEnd + schemeSeperatorLen, this.#usernameEnd, ); diff --git a/ext/url/01_urlpattern.js b/ext/url/01_urlpattern.js index 3c08bc1b89..04bb50fd7f 100644 --- a/ext/url/01_urlpattern.js +++ b/ext/url/01_urlpattern.js @@ -13,8 +13,9 @@ import * as webidl from "ext:deno_webidl/00_webidl.js"; const primordials = globalThis.__bootstrap.primordials; const { ArrayPrototypeMap, - ObjectKeys, + ArrayPrototypePop, ObjectFromEntries, + ObjectKeys, RegExpPrototypeExec, RegExpPrototypeTest, SafeRegExp, @@ -178,7 +179,7 @@ class URLPattern { const { 0: values, 1: inputs } = res; if (inputs[1] === null) { - inputs.pop(); + ArrayPrototypePop(inputs); } /** @type {URLPatternResult} */ diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js index 6d390308d4..c0cbb30498 100644 --- a/ext/web/06_streams.js +++ b/ext/web/06_streams.js @@ -19,9 +19,10 @@ import { const primordials = globalThis.__bootstrap.primordials; const { ArrayBuffer, + ArrayBufferIsView, ArrayBufferPrototype, ArrayBufferPrototypeGetByteLength, - ArrayBufferIsView, + ArrayBufferPrototypeSlice, ArrayPrototypeMap, ArrayPrototypePush, ArrayPrototypeShift, @@ -34,12 +35,12 @@ const { DataViewPrototypeGetByteOffset, Float32Array, Float64Array, - Int8Array, Int16Array, Int32Array, + Int8Array, + MathMin, NumberIsInteger, NumberIsNaN, - MathMin, ObjectCreate, ObjectDefineProperties, ObjectDefineProperty, @@ -52,14 +53,13 @@ const { PromisePrototypeThen, PromiseReject, PromiseResolve, - queueMicrotask, RangeError, ReflectHas, SafeFinalizationRegistry, SafePromiseAll, SafeWeakMap, // TODO(lucacasonato): add SharedArrayBuffer to primordials - // SharedArrayBufferPrototype + // SharedArrayBufferPrototype, Symbol, SymbolAsyncIterator, SymbolFor, @@ -70,13 +70,14 @@ const { TypedArrayPrototypeGetSymbolToStringTag, TypedArrayPrototypeSet, TypedArrayPrototypeSlice, - Uint8Array, Uint16Array, Uint32Array, + Uint8Array, Uint8ClampedArray, WeakMapPrototypeGet, WeakMapPrototypeHas, WeakMapPrototypeSet, + queueMicrotask, } = primordials; import { createFilteredInspectProxy } from "ext:deno_console/01_console.js"; import { assert, AssertionError } from "ext:deno_web/00_infra.js"; @@ -1252,7 +1253,16 @@ function readableByteStreamControllerEnqueueClonedChunkToQueue( ) { let cloneResult; try { - cloneResult = buffer.slice(byteOffset, byteOffset + byteLength); + if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, buffer)) { + cloneResult = ArrayBufferPrototypeSlice( + buffer, + byteOffset, + byteOffset + byteLength, + ); + } else { + // TODO(lucacasonato): add SharedArrayBuffer to primordials + cloneResult = buffer.slice(byteOffset, byteOffset + byteLength); + } } catch (e) { readableByteStreamControllerError(controller, e); } @@ -1864,7 +1874,7 @@ function readableByteStreamControllerPullInto( return; } } - controller[_pendingPullIntos].push(pullIntoDescriptor); + ArrayPrototypePush(controller[_pendingPullIntos], pullIntoDescriptor); readableStreamAddReadIntoRequest(stream, readIntoRequest); readableByteStreamControllerCallPullIfNeeded(controller); } @@ -4481,7 +4491,7 @@ function writableStreamMarkCloseRequestInFlight(stream) { function writableStreamMarkFirstWriteRequestInFlight(stream) { assert(stream[_inFlightWriteRequest] === undefined); assert(stream[_writeRequests].length); - const writeRequest = stream[_writeRequests].shift(); + const writeRequest = ArrayPrototypeShift(stream[_writeRequests]); stream[_inFlightWriteRequest] = writeRequest; } diff --git a/ext/web/13_message_port.js b/ext/web/13_message_port.js index fdc678a4f9..6d9a2c01f2 100644 --- a/ext/web/13_message_port.js +++ b/ext/web/13_message_port.js @@ -259,7 +259,7 @@ function serializeJsMessageData(data, transferables) { ); } j++; - transferredArrayBuffers.push(ab); + ArrayPrototypePush(transferredArrayBuffers, ab); } } diff --git a/ext/websocket/02_websocketstream.js b/ext/websocket/02_websocketstream.js index fef17b7018..06f4b50d96 100644 --- a/ext/websocket/02_websocketstream.js +++ b/ext/websocket/02_websocketstream.js @@ -17,6 +17,7 @@ const primordials = globalThis.__bootstrap.primordials; const { ArrayPrototypeJoin, ArrayPrototypeMap, + DateNow, Error, ObjectPrototypeIsPrototypeOf, PromisePrototypeCatch, @@ -27,8 +28,8 @@ const { StringPrototypeToLowerCase, Symbol, SymbolFor, - TypedArrayPrototypeGetByteLength, TypeError, + TypedArrayPrototypeGetByteLength, Uint8ArrayPrototype, } = primordials; @@ -281,7 +282,7 @@ class WebSocketStream { this[_closed].state === "pending" ) { if ( - new Date().getTime() - await this[_closeSent].promise <= + DateNow() - await this[_closeSent].promise <= CLOSE_RESPONSE_TIMEOUT ) { return pull(controller); @@ -404,7 +405,7 @@ class WebSocketStream { core.opAsync("op_ws_close", this[_rid], code, closeInfo.reason), () => { setTimeout(() => { - this[_closeSent].resolve(new Date().getTime()); + this[_closeSent].resolve(DateNow()); }, 0); }, (err) => { diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index b08a5737e5..e046900053 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -4,10 +4,11 @@ const core = globalThis.Deno.core; const ops = core.ops; const primordials = globalThis.__bootstrap.primordials; const { + ArrayPrototypeFilter, Error, ObjectPrototypeIsPrototypeOf, - StringPrototypeStartsWith, String, + StringPrototypeStartsWith, SymbolIterator, SymbolToStringTag, } = primordials; @@ -192,8 +193,9 @@ class Worker extends EventTarget { const event = new MessageEvent("message", { cancelable: false, data: message, - ports: transferables.filter((t) => - ObjectPrototypeIsPrototypeOf(MessagePortPrototype, t) + ports: ArrayPrototypeFilter( + transferables, + (t) => ObjectPrototypeIsPrototypeOf(MessagePortPrototype, t), ), }); this.dispatchEvent(event); diff --git a/runtime/js/30_os.js b/runtime/js/30_os.js index 3af5803ad6..a5a55e19bd 100644 --- a/runtime/js/30_os.js +++ b/runtime/js/30_os.js @@ -6,10 +6,12 @@ import { Event, EventTarget } from "ext:deno_web/02_event.js"; const primordials = globalThis.__bootstrap.primordials; const { Error, + FunctionPrototypeBind, SymbolFor, } = primordials; -const windowDispatchEvent = EventTarget.prototype.dispatchEvent.bind( +const windowDispatchEvent = FunctionPrototypeBind( + EventTarget.prototype.dispatchEvent, globalThis, ); diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 01cf2973c8..854a0029ec 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -12,27 +12,28 @@ const ops = core.ops; const internals = globalThis.__bootstrap.internals; const primordials = globalThis.__bootstrap.primordials; const { + ArrayPrototypeFilter, ArrayPrototypeIndexOf, + ArrayPrototypeMap, ArrayPrototypePush, ArrayPrototypeShift, ArrayPrototypeSplice, - ArrayPrototypeMap, DateNow, Error, ErrorPrototype, - FunctionPrototypeCall, FunctionPrototypeBind, + FunctionPrototypeCall, ObjectAssign, - ObjectDefineProperty, ObjectDefineProperties, + ObjectDefineProperty, ObjectFreeze, ObjectPrototypeIsPrototypeOf, ObjectSetPrototypeOf, + PromisePrototypeThen, PromiseResolve, + SafeWeakMap, Symbol, SymbolIterator, - PromisePrototypeThen, - SafeWeakMap, TypeError, WeakMapPrototypeDelete, WeakMapPrototypeGet, @@ -147,8 +148,10 @@ async function pollForMessages() { const msgEvent = new event.MessageEvent("message", { cancelable: false, data: message, - ports: transferables.filter((t) => - ObjectPrototypeIsPrototypeOf(messagePort.MessagePortPrototype, t) + ports: ArrayPrototypeFilter( + transferables, + (t) => + ObjectPrototypeIsPrototypeOf(messagePort.MessagePortPrototype, t), ), });