perf(webidl): optimize createRecordConverter() (#12286)

Cuts self-time by ~6x, 172ns/iter => 22ns/iter benched on 1M Response builds / HeadersInit calls
This commit is contained in:
Aaron O'Mullan 2021-10-04 15:39:32 +02:00 committed by GitHub
parent ea7a63cd5a
commit 5f41f822e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,6 +9,7 @@
"use strict";
((window) => {
const core = window.Deno.core;
const {
ArrayBuffer,
ArrayBufferIsView,
@ -48,6 +49,7 @@
ObjectGetOwnPropertyDescriptor,
ObjectGetOwnPropertyDescriptors,
ObjectGetPrototypeOf,
ObjectPrototypeHasOwnProperty,
ObjectIs,
PromisePrototypeThen,
PromiseReject,
@ -844,8 +846,21 @@
opts,
);
}
const keys = ReflectOwnKeys(V);
const result = {};
// Fast path for common case (not a Proxy)
if (!core.isProxy(V)) {
for (const key in V) {
if (!ObjectPrototypeHasOwnProperty(V, key)) {
continue;
}
const typedKey = keyConverter(key, opts);
const value = V[key];
const typedValue = valueConverter(value, opts);
result[typedKey] = typedValue;
}
}
// Slow path if Proxy (e.g: in WPT tests)
const keys = ReflectOwnKeys(V);
for (const key of keys) {
const desc = ObjectGetOwnPropertyDescriptor(V, key);
if (desc !== undefined && desc.enumerable === true) {