summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/js/ops/dispatch_json.ts11
-rw-r--r--cli/js/ops/dispatch_minimal.ts12
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;