summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2020-10-12 05:04:26 +0900
committerGitHub <noreply@github.com>2020-10-11 22:04:26 +0200
commit265a9fb9323a11067b4b826acc7624f2e62f1102 (patch)
tree60abd5c4fd490f237db2d2c52e51ee0f95518d33
parent86dc55134ef25c1bc4f8db6c3c0dc635c1660ea4 (diff)
fix(console): fix inspection of Function (#7930)
This commit fixes the inspection of functions. The current implementation gets the name of the type of the function from "f.__proto__.constructor.name", and it throws when the prototype is set to null. This commit checks the prototype before accessing its constructor name and uses the generic name 'Function' if the prototype is not available.
-rw-r--r--cli/rt/02_console.js9
-rw-r--r--cli/tests/unit/console_test.ts15
2 files changed, 22 insertions, 2 deletions
diff --git a/cli/rt/02_console.js b/cli/rt/02_console.js
index 363a95d90..0eb7f0aac 100644
--- a/cli/rt/02_console.js
+++ b/cli/rt/02_console.js
@@ -196,8 +196,13 @@
return String(value[customInspect]());
} catch {}
}
- // Might be Function/AsyncFunction/GeneratorFunction
- const cstrName = Object.getPrototypeOf(value).constructor.name;
+ // Might be Function/AsyncFunction/GeneratorFunction/AsyncGeneratorFunction
+ let cstrName = Object.getPrototypeOf(value)?.constructor?.name;
+ if (!cstrName) {
+ // If prototype is removed or broken,
+ // use generic 'Function' instead.
+ cstrName = "Function";
+ }
if (value.name && value.name !== "anonymous") {
// from MDN spec
return `[${cstrName}: ${value.name}]`;
diff --git a/cli/tests/unit/console_test.ts b/cli/tests/unit/console_test.ts
index df1420345..00a5927b1 100644
--- a/cli/tests/unit/console_test.ts
+++ b/cli/tests/unit/console_test.ts
@@ -347,6 +347,21 @@ unitTest(function consoleTestStringifyCircular(): void {
});
/* eslint-enable @typescript-eslint/explicit-function-return-type */
+unitTest(function consoleTestStringifyFunctionWithPrototypeRemoved(): void {
+ const f = function f() {};
+ Reflect.setPrototypeOf(f, null);
+ assertEquals(stringify(f), "[Function: f]");
+ const af = async function af() {};
+ Reflect.setPrototypeOf(af, null);
+ assertEquals(stringify(af), "[Function: af]");
+ const gf = function gf() {};
+ Reflect.setPrototypeOf(gf, null);
+ assertEquals(stringify(gf), "[Function: gf]");
+ const agf = function agf() {};
+ Reflect.setPrototypeOf(agf, null);
+ assertEquals(stringify(agf), "[Function: agf]");
+});
+
unitTest(function consoleTestStringifyWithDepth(): void {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const nestedObj: any = { a: { b: { c: { d: { e: { f: 42 } } } } } };