Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: use class instead of object literals with getters #3138

Merged
merged 12 commits into from
Apr 21, 2024
8 changes: 8 additions & 0 deletions benchmarks/fetch/request-creation.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { bench, run } from 'mitata'
import { Request } from '../../lib/web/fetch/request.js'

const input = 'https://example.com/post'

bench('new Request(input)', () => new Request(input, undefined))

await run()
31 changes: 17 additions & 14 deletions lib/web/fetch/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,20 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {

let patchMethodWarning = false

class EnvironmentSettingsObjectBase {
baseUrl = getGlobalOrigin()

get origin () {
return this.baseUrl?.origin
}

policyContainer = makePolicyContainer()
}

class EnvironmentSettingsObject {
settingsObject = new EnvironmentSettingsObjectBase()
}

// https://fetch.spec.whatwg.org/#request-class
class Request {
// https://fetch.spec.whatwg.org/#dom-request
Expand All @@ -55,16 +69,9 @@ class Request {
init = webidl.converters.RequestInit(init)

// https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
this[kRealm] = {
settingsObject: {
baseUrl: getGlobalOrigin(),
get origin () {
return this.baseUrl?.origin
},
policyContainer: makePolicyContainer()
}
}

// Note: Slow initialization of object literals with getters.
// TODO: Remove workaround.
tsctx marked this conversation as resolved.
Show resolved Hide resolved
this[kRealm] = new EnvironmentSettingsObject()
// 1. Let request be null.
let request = null

Expand Down Expand Up @@ -366,7 +373,6 @@ class Request {
// (https://dom.spec.whatwg.org/#dom-abortsignal-any)
const ac = new AbortController()
this[kSignal] = ac.signal
this[kSignal][kRealm] = this[kRealm]

// 29. If signal is not null, then make this’s signal follow signal.
if (signal != null) {
Expand Down Expand Up @@ -436,7 +442,6 @@ class Request {
this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kHeadersList] = request.headersList
this[kHeaders][kGuard] = 'request'
this[kHeaders][kRealm] = this[kRealm]

// 31. If this’s request’s mode is "no-cors", then:
if (mode === 'no-cors') {
Expand Down Expand Up @@ -881,11 +886,9 @@ function fromInnerRequest (innerRequest, signal, guard, realm) {
request[kState] = innerRequest
request[kRealm] = realm
request[kSignal] = signal
request[kSignal][kRealm] = realm
request[kHeaders] = new Headers(kConstruct)
request[kHeaders][kHeadersList] = innerRequest.headersList
request[kHeaders][kGuard] = guard
request[kHeaders][kRealm] = realm
return request
}

Expand Down
14 changes: 8 additions & 6 deletions lib/web/fetch/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ const { types } = require('node:util')

const textEncoder = new TextEncoder('utf-8')

class EnvironmentSettingsObject {
settingsObject = {}
}

// https://fetch.spec.whatwg.org/#response-class
class Response {
// Creates network error Response.
static error () {
// TODO
const relevantRealm = { settingsObject: {} }
const relevantRealm = new EnvironmentSettingsObject()

// The static error() method steps are to return the result of creating a
// Response object, given a new network error, "immutable", and this’s
Expand Down Expand Up @@ -62,7 +66,7 @@ class Response {

// 3. Let responseObject be the result of creating a Response object, given a new response,
// "response", and this’s relevant Realm.
const relevantRealm = { settingsObject: {} }
const relevantRealm = new EnvironmentSettingsObject()
const responseObject = fromInnerResponse(makeResponse({}), 'response', relevantRealm)

// 4. Perform initialize a response given responseObject, init, and (body, "application/json").
Expand All @@ -74,7 +78,7 @@ class Response {

// Creates a redirect Response that redirects to url with status status.
static redirect (url, status = 302) {
const relevantRealm = { settingsObject: {} }
const relevantRealm = new EnvironmentSettingsObject()

webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' })

Expand Down Expand Up @@ -127,7 +131,7 @@ class Response {
init = webidl.converters.ResponseInit(init)

// TODO
this[kRealm] = { settingsObject: {} }
this[kRealm] = new EnvironmentSettingsObject()

// 1. Set this’s response to a new response.
this[kState] = makeResponse({})
Expand All @@ -138,7 +142,6 @@ class Response {
this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kGuard] = 'response'
this[kHeaders][kHeadersList] = this[kState].headersList
this[kHeaders][kRealm] = this[kRealm]

// 3. Let bodyWithType be null.
let bodyWithType = null
Expand Down Expand Up @@ -522,7 +525,6 @@ function fromInnerResponse (innerResponse, guard, realm) {
response[kHeaders] = new Headers(kConstruct)
response[kHeaders][kHeadersList] = innerResponse.headersList
response[kHeaders][kGuard] = guard
response[kHeaders][kRealm] = realm
return response
}

Expand Down
2 changes: 0 additions & 2 deletions test/fetch/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -499,8 +499,6 @@ test('fromInnerRequest', () => {
assert.strictEqual(request[kState], innerRequest)
assert.strictEqual(request[kRealm], realm)
assert.strictEqual(request[kSignal], signal)
assert.strictEqual(request[kSignal][kRealm], realm)
assert.strictEqual(request[kHeaders][kHeadersList], innerRequest.headersList)
assert.strictEqual(request[kHeaders][kGuard], 'immutable')
assert.strictEqual(request[kHeaders][kRealm], realm)
})
1 change: 0 additions & 1 deletion test/fetch/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -286,5 +286,4 @@ test('fromInnerResponse', () => {
assert.strictEqual(response[kRealm], realm)
assert.strictEqual(response[kHeaders][kHeadersList], innerResponse.headersList)
assert.strictEqual(response[kHeaders][kGuard], 'immutable')
assert.strictEqual(response[kHeaders][kRealm], realm)
})
Loading