1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-28 16:20:57 -05:00

perf(webidl): inline ResponseInit converter (#12285)

This commit is contained in:
Aaron O'Mullan 2021-10-11 23:43:52 +02:00 committed by GitHub
parent 5508a0f45e
commit 5bad8e1773
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 3 deletions

View file

@ -3,6 +3,7 @@ import {
assert,
assertEquals,
assertStringIncludes,
assertThrows,
unitTest,
} from "./test_util.ts";
@ -56,6 +57,23 @@ unitTest(async function responseFormData() {
assertEquals([...formData], [...input]);
});
unitTest(function responseInvalidInit() {
// deno-lint-ignore ban-ts-comment
// @ts-expect-error
assertThrows(() => new Response("", 0));
assertThrows(() => new Response("", { status: 0 }));
// deno-lint-ignore ban-ts-comment
// @ts-expect-error
assertThrows(() => new Response("", { status: null }));
});
unitTest(function responseNullInit() {
// deno-lint-ignore ban-ts-comment
// @ts-expect-error
const response = new Response("", null);
assertEquals(response.status, 200);
});
unitTest(function customInspectFunction() {
const response = new Response();
assertEquals(

View file

@ -12,6 +12,7 @@
"use strict";
((window) => {
const { isProxy } = Deno.core;
const webidl = window.__bootstrap.webidl;
const consoleInternal = window.__bootstrap.console;
const { HTTP_TAB_OR_SPACE, regexMatcher } = window.__bootstrap.infra;
@ -249,7 +250,7 @@
prefix,
context: "Argument 1",
});
init = webidl.converters["ResponseInit"](init, {
init = webidl.converters["ResponseInit_fast"](init, {
prefix,
context: "Argument 2",
});
@ -260,7 +261,10 @@
);
}
if (!RegExpPrototypeTest(REASON_PHRASE_RE, init.statusText)) {
if (
init.statusText &&
!RegExpPrototypeTest(REASON_PHRASE_RE, init.statusText)
) {
throw new TypeError("Status text is not valid.");
}
@ -270,7 +274,7 @@
this[_response] = response;
/** @type {Headers} */
this[_headers] = headersFromHeaderList(response.headerList, "response");
if (init.headers !== undefined) {
if (init.headers) {
fillHeaders(this[_headers], init.headers);
}
if (body !== null) {
@ -407,6 +411,27 @@
converter: webidl.converters["HeadersInit"],
}],
);
webidl.converters["ResponseInit_fast"] = function (init, opts) {
if (init === undefined || init === null) {
return { status: 200, statusText: "", headers: undefined };
}
// Fast path, if not a proxy
if (typeof init === "object" && !isProxy(init)) {
// Not a proxy fast path
const status = init.status !== undefined
? webidl.converters["unsigned short"](init.status)
: 200;
const statusText = init.statusText !== undefined
? webidl.converters["ByteString"](init.statusText)
: "";
const headers = init.headers !== undefined
? webidl.converters["HeadersInit"](init.headers)
: undefined;
return { status, statusText, headers };
}
// Slow default path
return webidl.converters["ResponseInit"](init, opts);
};
/**
* @param {Response} response