0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-04 01:44:26 -05:00

perf(http): cache webidl.converters lookups in ext/fetch/23_response.js (#26256)

This commit is contained in:
David Sherret 2024-10-14 23:25:18 -04:00 committed by GitHub
parent 9f0a447f7c
commit 4c9eee3ebe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -61,6 +61,15 @@ const _mimeType = Symbol("mime type");
const _body = Symbol("body"); const _body = Symbol("body");
const _brand = webidl.brand; const _brand = webidl.brand;
// it's slightly faster to cache these
const webidlConvertersBodyInitDomString =
webidl.converters["BodyInit_DOMString?"];
const webidlConvertersUSVString = webidl.converters["USVString"];
const webidlConvertersUnsignedShort = webidl.converters["unsigned short"];
const webidlConvertersAny = webidl.converters["any"];
const webidlConvertersByteString = webidl.converters["ByteString"];
const webidlConvertersHeadersInit = webidl.converters["HeadersInit"];
/** /**
* @typedef InnerResponse * @typedef InnerResponse
* @property {"basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect"} type * @property {"basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect"} type
@ -259,8 +268,8 @@ class Response {
*/ */
static redirect(url, status = 302) { static redirect(url, status = 302) {
const prefix = "Failed to execute 'Response.redirect'"; const prefix = "Failed to execute 'Response.redirect'";
url = webidl.converters["USVString"](url, prefix, "Argument 1"); url = webidlConvertersUSVString(url, prefix, "Argument 1");
status = webidl.converters["unsigned short"](status, prefix, "Argument 2"); status = webidlConvertersUnsignedShort(status, prefix, "Argument 2");
const baseURL = getLocationHref(); const baseURL = getLocationHref();
const parsedURL = new URL(url, baseURL); const parsedURL = new URL(url, baseURL);
@ -286,8 +295,8 @@ class Response {
*/ */
static json(data = undefined, init = { __proto__: null }) { static json(data = undefined, init = { __proto__: null }) {
const prefix = "Failed to execute 'Response.json'"; const prefix = "Failed to execute 'Response.json'";
data = webidl.converters.any(data); data = webidlConvertersAny(data);
init = webidl.converters["ResponseInit_fast"](init, prefix, "Argument 2"); init = webidlConvertersResponseInitFast(init, prefix, "Argument 2");
const str = serializeJSValueToJSONString(data); const str = serializeJSValueToJSONString(data);
const res = extractBody(str); const res = extractBody(str);
@ -313,8 +322,8 @@ class Response {
} }
const prefix = "Failed to construct 'Response'"; const prefix = "Failed to construct 'Response'";
body = webidl.converters["BodyInit_DOMString?"](body, prefix, "Argument 1"); body = webidlConvertersBodyInitDomString(body, prefix, "Argument 1");
init = webidl.converters["ResponseInit_fast"](init, prefix, "Argument 2"); init = webidlConvertersResponseInitFast(init, prefix, "Argument 2");
this[_response] = newInnerResponse(); this[_response] = newInnerResponse();
this[_headers] = headersFromHeaderList( this[_headers] = headersFromHeaderList(
@ -443,22 +452,24 @@ webidl.converters["Response"] = webidl.createInterfaceConverter(
"Response", "Response",
ResponsePrototype, ResponsePrototype,
); );
webidl.converters["ResponseInit"] = webidl.createDictionaryConverter( const webidlConvertersResponseInit = webidl.converters["ResponseInit"] = webidl
.createDictionaryConverter(
"ResponseInit", "ResponseInit",
[{ [{
key: "status", key: "status",
defaultValue: 200, defaultValue: 200,
converter: webidl.converters["unsigned short"], converter: webidlConvertersUnsignedShort,
}, { }, {
key: "statusText", key: "statusText",
defaultValue: "", defaultValue: "",
converter: webidl.converters["ByteString"], converter: webidlConvertersByteString,
}, { }, {
key: "headers", key: "headers",
converter: webidl.converters["HeadersInit"], converter: webidlConvertersHeadersInit,
}], }],
); );
webidl.converters["ResponseInit_fast"] = function ( const webidlConvertersResponseInitFast = webidl
.converters["ResponseInit_fast"] = function (
init, init,
prefix, prefix,
context, context,
@ -471,18 +482,18 @@ webidl.converters["ResponseInit_fast"] = function (
if (typeof init === "object" && !core.isProxy(init)) { if (typeof init === "object" && !core.isProxy(init)) {
// Not a proxy fast path // Not a proxy fast path
const status = init.status !== undefined const status = init.status !== undefined
? webidl.converters["unsigned short"](init.status) ? webidlConvertersUnsignedShort(init.status)
: 200; : 200;
const statusText = init.statusText !== undefined const statusText = init.statusText !== undefined
? webidl.converters["ByteString"](init.statusText) ? webidlConvertersByteString(init.statusText)
: ""; : "";
const headers = init.headers !== undefined const headers = init.headers !== undefined
? webidl.converters["HeadersInit"](init.headers) ? webidlConvertersHeadersInit(init.headers)
: undefined; : undefined;
return { status, statusText, headers }; return { status, statusText, headers };
} }
// Slow default path // Slow default path
return webidl.converters["ResponseInit"](init, prefix, context, opts); return webidlConvertersResponseInit(init, prefix, context, opts);
}; };
/** /**