镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

util.inspect fails to log getters which access this #36045

Description

@szmarczak
  • Version: v15.0.1
  • Platform: Linux solus 5.6.19-159.current #1 SMP PREEMPT Fri Oct 16 17:49:06 UTC 2020 x86_64 GNU/Linux
  • Subsystem: util

What steps will reproduce the bug?

const util = require('util');

class X {
    constructor() {
		this._y = 123;
	}

	get y() {
		return this._y;
	}
}

console.log(util.inspect(new X(), {
	colors: true,
    getters: true,
    showHidden: true
}));

How often does it reproduce? Is there a required condition?

Always.

What is the expected behavior?

X { _y: 123, [y]: [Getter: 123] }

What do you see instead?

X { _y: 123, [y]: [Getter: undefined] }

Additional information

May be related with #35956

Activity

  1. targos commented on Nov 9, 2020

    @targos
    Member

    @nodejs/util

  2. added
    utilIssues and PRs related to the built-in util module.
    on Nov 9, 2020
  3. self-assigned this
    on Nov 9, 2020
  4. BridgeAR commented on Nov 9, 2020

    @BridgeAR
    Member
    diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js
    index e6787760fe..9343b0772f 100644
    --- a/lib/internal/util/inspect.js
    +++ b/lib/internal/util/inspect.js
    @@ -628,7 +628,7 @@ function addPrototypeProperties(ctx, main, obj, recurseTimes, output) {
             continue;
           }
           const value = formatProperty(
    -        ctx, obj, recurseTimes, key, kObjectType, desc);
    +        ctx, obj, recurseTimes, key, kObjectType, desc, main);
           if (ctx.colors) {
             // Faint!
             output.push(`\u001b[2m${value}\u001b[22m`);
    @@ -1678,7 +1678,7 @@ function formatPromise(ctx, value, recurseTimes) {
       return output;
     }
     
    -function formatProperty(ctx, value, recurseTimes, key, type, desc) {
    +function formatProperty(ctx, value, recurseTimes, key, type, desc, original = value) {
       let name, str;
       let extra = ' ';
       desc = desc || ObjectGetOwnPropertyDescriptor(value, key) ||
    @@ -1699,7 +1699,7 @@ function formatProperty(ctx, value, recurseTimes, key, type, desc) {
               (ctx.getters === 'get' && desc.set === undefined) ||
               (ctx.getters === 'set' && desc.set !== undefined))) {
           try {
    -        const tmp = value[key];
    +        const tmp = desc.get.call(original);
             ctx.indentationLvl += 2;
             if (tmp === null) {
               str = `${s(`[${label}:`, sp)} ${s('null', 'null')}${s(']', sp)}`;

    This would be a functional fix. I did not yet check if this causes a performance regression due to mismatching the arguments count frequently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

utilIssues and PRs related to the built-in util module.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions