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.
This commit is contained in:
Yoshiya Hinosawa 2020-10-12 05:04:26 +09:00 committed by GitHub
parent 86dc55134e
commit 265a9fb932
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 2 deletions

View file

@ -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}]`;

View file

@ -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 } } } } } };