Skip to content

util.inspect shouldn’t format objects with the [[IsHTMLDDA]] internal slot as undefined #31889

Description

@ExE-Boss
  • Version: v13.9.0
  • Platform: Windows 10 v1903 build 18362.657 64‑bit
  • Subsystem: util

What steps will reproduce the bug?

Run node --allow-natives-syntax -p 'util.inspect(%GetUndetectable())'

What is the expected behavior?

> node --allow-natives-syntax -p 'util.inspect(%GetUndetectable())'
[Function (anonymous)]

What do you see instead?

> node --allow-natives-syntax -p 'util.inspect(%GetUndetectable())'
undefined

Additional information

This is because the type check in util.inspect doesn’t account for objects with the [[IsHTMLDDA]] internal slot:

function formatValue(ctx, value, recurseTimes, typedArray) {
// Primitive types cannot have properties.
if (typeof value !== 'object' && typeof value !== 'function') {
return formatPrimitive(ctx.stylize, value, ctx);
}
if (value === null) {
return ctx.stylize('null', 'null');
}

Activity

  1. devsnek commented on Feb 20, 2020

    @devsnek
    Member

    I suppose this would matter when using electron, since you could actually do util.inspect(document.all). I can add an upstream Object::IsUndetectable and we could check it here.

    We could also hack this in as typeof v === 'undefined' && v !== undefined.

  2. added
    utilIssues and PRs related to the built-in util module.
    v8 engineIssues and PRs related to the V8 dependency.
    on Feb 20, 2020
  3. ExE-Boss commented on Feb 21, 2020

    @ExE-Boss
    ContributorAuthor

    One solution would be to add util.types.isObject(target), which would perform:

    1. If Type(target) is Object, then return true.
    2. Return false.

    That would take care of that check, as C++ code doesn’t care whether an object is undetectable, since you can pass document.all as the this value to both Function.prototype.toString, Object.prototype.toString and Object.prototype.valueOf.


    A polyfilled version is:

    function isObject(target) {
    	if (target === null || target === undefied) return false;
    	switch (typeof target) {
    		case "object":
    		case "function":
    			return true;
    		case "undefined":
    			try {
    				return Object.prototype.valueOf.call(target) === target;
    			} catch {}
    	}
    	return false;
    }
  4. added a commit that references this issue on Mar 10, 2020
  5. added a commit that references this issue on Mar 30, 2020
  6. added a commit that references this issue on Apr 22, 2020
  7. added a commit that references this issue on Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    utilIssues and PRs related to the built-in util module.v8 engineIssues and PRs related to the V8 dependency.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions