diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-03-10 03:04:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-09 22:04:49 -0400 |
commit | dca00211abf311de9fec4f73f8365e430787e3f9 (patch) | |
tree | 594fc4cb7fb0a3bc9dba0af69a1b37b4d7f087d5 /cli/js | |
parent | 68119e1d7ed23421ccdcba20532ebe9ae3df9f18 (diff) |
use Object instead of Map for promise table (#4309)
Diffstat (limited to 'cli/js')
-rw-r--r-- | cli/js/ops/dispatch_json.ts | 11 | ||||
-rw-r--r-- | cli/js/ops/dispatch_minimal.ts | 12 |
2 files changed, 15 insertions, 8 deletions
diff --git a/cli/js/ops/dispatch_json.ts b/cli/js/ops/dispatch_json.ts index 6fb9007df..4aa1f6b8b 100644 --- a/cli/js/ops/dispatch_json.ts +++ b/cli/js/ops/dispatch_json.ts @@ -19,7 +19,10 @@ interface JsonResponse { promiseId?: number; // Only present in async messages. } -const promiseTable = new Map<number, util.Resolvable<JsonResponse>>(); +// Using an object without a prototype because `Map` was causing GC problems. +const promiseTable: { + [key: number]: util.Resolvable<JsonResponse>; +} = Object.create(null); let _nextPromiseId = 1; function nextPromiseId(): number { @@ -48,9 +51,9 @@ export function asyncMsgFromRust(resUi8: Uint8Array): void { const res = decode(resUi8); util.assert(res.promiseId != null); - const promise = promiseTable.get(res.promiseId!); + const promise = promiseTable[res.promiseId!]; util.assert(promise != null); - promiseTable.delete(res.promiseId!); + delete promiseTable[res.promiseId!]; promise.resolve(res); } @@ -89,7 +92,7 @@ export async function sendAsync( promise.resolve(res); } else { // Async result. - promiseTable.set(promiseId, promise); + promiseTable[promiseId] = promise; } const res = await promise; diff --git a/cli/js/ops/dispatch_minimal.ts b/cli/js/ops/dispatch_minimal.ts index 7aec4683c..61d630240 100644 --- a/cli/js/ops/dispatch_minimal.ts +++ b/cli/js/ops/dispatch_minimal.ts @@ -4,7 +4,11 @@ import { core } from "../core.ts"; import { TextDecoder } from "../web/text_encoding.ts"; import { ErrorKind, errors, getErrorClass } from "../errors.ts"; -const promiseTableMin = new Map<number, util.Resolvable<RecordMinimal>>(); +// Using an object without a prototype because `Map` was causing GC problems. +const promiseTableMin: { + [key: number]: util.Resolvable<RecordMinimal>; +} = Object.create(null); + // Note it's important that promiseId starts at 1 instead of 0, because sync // messages are indicated with promiseId 0. If we ever add wrap around logic for // overflows, this should be taken into account. @@ -72,8 +76,8 @@ util.assert(scratchBytes.byteLength === scratch32.length * 4); export function asyncMsgFromRust(ui8: Uint8Array): void { const record = recordFromBufMinimal(ui8); const { promiseId } = record; - const promise = promiseTableMin.get(promiseId); - promiseTableMin.delete(promiseId); + const promise = promiseTableMin[promiseId]; + delete promiseTableMin[promiseId]; util.assert(promise); promise.resolve(record); } @@ -95,7 +99,7 @@ export async function sendAsyncMinimal( promise.resolve(record); } else { // Async result. - promiseTableMin.set(promiseId, promise); + promiseTableMin[promiseId] = promise; } const res = await promise; |