Object#hash: use the object address for T_OBJECT by casperisfine · Pull Request #13765 · ruby/ruby · GitHub | Latest TMZ Celebrity News & Gossip | Watch TMZ Live
Skip to content

Object#hash: use the object address for T_OBJECT #13765

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

casperisfine
Copy link
Contributor

Updated attempt at: #13290

Rather than to generate an object_id, we can use the object address. However we have to record that we did, so that if the object is later moved, we know to record its original address inline, so that it keeps a stable hash.

We can't use the same strategy for other objects because they delegate their fields to another IMEMO/fields object. So if they don't yet have fields or if the fields object is full, during compaction we'd need to allocate another one but that not allowed during GC.

*
* @internal
*/
RUBY_FL_ADDRESS_SEEN = (1<<6),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If only T_OBJECT can use this strategy, we can use a FL_USER flag instead of a global flag.

This comment has been minimized.

#else
#error "Unexpected VALUE size"
#endif
rb_obj_field_set(obj, rb_shape_transition_old_address(shape_id), 0, old_address);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually this doesn't work well. rb_shape_transition_old_address will lookup or insert into a managed_id_table which may be a T_MOVED.

So it's currently not possible to make any shape transition (other than shape_id flags) as part of compaction.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another reason it doesn't work, is that if the shape currently has a single child, creating a second child need to allocate a managed_id_table.

So for this whole PR to work, the compaction rb_gc_update_moved_object would need to be invoked once it's now OK to allocate objects (or the transition being created before allocations are disallowed).

Rather than to generate an object_id, we can use the object address.
However we have to record that we did, so that if the object is
later moved, we know to record its original address inline, so
that it keeps a stable hash.

We can't use the same strategy for other objects because they
delegate their fields to another IMEMO/fields object.
So if they don't yet have fields or if the fields object is
full, during compaction we'd need to allocate another one but
that not allowed during GC.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants

TMZ Celebrity News – Breaking Stories, Videos & Gossip

Looking for the latest TMZ celebrity news? You've come to the right place. From shocking Hollywood scandals to exclusive videos, TMZ delivers it all in real time.

Whether it’s a red carpet slip-up, a viral paparazzi moment, or a legal drama involving your favorite stars, TMZ news is always first to break the story. Stay in the loop with daily updates, insider tips, and jaw-dropping photos.

🎥 Watch TMZ Live

TMZ Live brings you daily celebrity news and interviews straight from the TMZ newsroom. Don’t miss a beat—watch now and see what’s trending in Hollywood.