From 2f0f236d5656fa2d89a8e1571d03c4bda5f10d38 Mon Sep 17 00:00:00 2001 From: "Kevin (Kun) \"Kassimo\" Qian" Date: Mon, 28 Oct 2019 15:29:15 -0700 Subject: [PATCH] Prevent customInspect error from crashing console (#3226) --- cli/js/console.ts | 7 +++++-- cli/js/console_test.ts | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cli/js/console.ts b/cli/js/console.ts index 9f0ce4bd6e..e6b54d8c12 100644 --- a/cli/js/console.ts +++ b/cli/js/console.ts @@ -327,8 +327,11 @@ function createObjectString( ...args: [ConsoleContext, number, number] ): string { if (customInspect in value && typeof value[customInspect] === "function") { - return String(value[customInspect]!()); - } else if (value instanceof Error) { + try { + return String(value[customInspect]!()); + } catch {} + } + if (value instanceof Error) { return String(value.stack); } else if (Array.isArray(value)) { return createArrayString(value, ...args); diff --git a/cli/js/console_test.ts b/cli/js/console_test.ts index 903e65a82e..50fe1d66a0 100644 --- a/cli/js/console_test.ts +++ b/cli/js/console_test.ts @@ -190,6 +190,27 @@ test(function consoleTestWithCustomInspector(): void { assertEquals(stringify(new A()), "b"); }); +test(function consoleTestWithCustomInspectorError(): void { + class A { + [customInspect](): string { + throw new Error("BOOM"); + return "b"; + } + } + + assertEquals(stringify(new A()), "A {}"); + + class B { + constructor(public field: { a: string }) {} + [customInspect](): string { + return this.field.a; + } + } + + assertEquals(stringify(new B({ a: "a" })), "a"); + assertEquals(stringify(B.prototype), "{}"); +}); + test(function consoleTestWithIntegerFormatSpecifier(): void { assertEquals(stringify("%i"), "%i"); assertEquals(stringify("%i", 42.0), "42");