Skip to content

Better handling of accessing an object's __dict__ attribute. #651

@markshannon

Description

@markshannon

Currently when the __dict__ attribute of an object is accessed we transfer ownership of the values array from the object to the dict.

Accessing the __dict__ of an object is fairly uncommon, but not that uncommon, but it is highly disruptive to optimizations.
We currently attempt to mitigate this by dematerializing the __dict__, but that has a few failings:

  • It bulks out a common and performance critical uop, _CHECK_MANAGED_OBJECT_HAS_VALUES
  • It isn't that effective
  • It is not thread safe

Rather than attempting to get rid of the dictionary, lets change the object and values so that the presence of a __dict__ doesn't impact the fast path.

What that means is that an object would still retain a pointer to the values, even if the dict were present.
Inlining the values would help here. Otherwise we need an extra pointer, bulking out the pre-header even more.

Memory management becomes a little more complex, as we need to make sure that we don't free the values when there is a still a reference to it. We can use reference counting, but we will only need a single bit as the values can only be referred to by the object and/or the dict.

@brandtbucher thoughts?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions