1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-26 09:10:40 -05:00

fix(core): Use primordials for methods (#18839)

I would like to get this change into Deno before merging
https://github.com/denoland/deno_lint/pull/1152
This commit is contained in:
Kenta Moriuchi 2023-05-01 22:30:02 +09:00 committed by Levente Kurusa
parent 0ddad2486c
commit 3d0b879c0d
No known key found for this signature in database
GPG key ID: 9F72F3C05BA137C4
17 changed files with 378 additions and 270 deletions

View file

@ -28,13 +28,13 @@
SafeArrayIterator,
SafeMap,
SafePromisePrototypeFinally,
setQueueMicrotask,
StringPrototypeSlice,
StringPrototypeSplit,
SymbolFor,
SyntaxError,
TypeError,
URIError,
setQueueMicrotask,
} = window.__bootstrap.primordials;
const { ops, asyncOps } = window.Deno.core;

11
ext/cache/01_cache.js vendored
View file

@ -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.

View file

@ -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("<uninitialized>", "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");

View file

@ -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

View file

@ -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 {

View file

@ -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;

View file

@ -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",

View file

@ -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)) {

View file

@ -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),
);
}
}

View file

@ -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,
);

View file

@ -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} */

View file

@ -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;
}

View file

@ -259,7 +259,7 @@ function serializeJsMessageData(data, transferables) {
);
}
j++;
transferredArrayBuffers.push(ab);
ArrayPrototypePush(transferredArrayBuffers, ab);
}
}

View file

@ -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) => {

View file

@ -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);

View file

@ -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,
);

View file

@ -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),
),
});