summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-08-19 10:51:12 -0400
committerPeter Zhu <peter@peterzhu.ca>2024-08-23 10:49:27 -0400
commit3f6be01bfc34e13d9fd1f3fa4c4023735d631428 (patch)
treef00baa8577e40c99c5264fede681ad64a57f4e48
parentb51e1c07d84af189885f10a947e75497481c958d (diff)
Make object ID faster by checking flags
We can improve object ID performance by checking the FL_SEEN_OBJ_ID flag instead of looking up in the table.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11407
-rw-r--r--gc/default.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gc/default.c b/gc/default.c
index ebf8d0ef26..e40c27c6cf 100644
--- a/gc/default.c
+++ b/gc/default.c
@@ -1683,13 +1683,17 @@ rb_gc_impl_object_id(void *objspace_ptr, VALUE obj)
rb_objspace_t *objspace = objspace_ptr;
unsigned int lev = rb_gc_vm_lock();
- st_data_t val;
- if (st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, &val)) {
- GC_ASSERT(FL_TEST(obj, FL_SEEN_OBJ_ID));
- id = (VALUE)val;
+ if (FL_TEST(obj, FL_SEEN_OBJ_ID)) {
+ st_data_t val;
+ if (st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, &val)) {
+ id = (VALUE)val;
+ }
+ else {
+ rb_bug("rb_gc_impl_object_id: FL_SEEN_OBJ_ID flag set but not found in table");
+ }
}
else {
- GC_ASSERT(!FL_TEST(obj, FL_SEEN_OBJ_ID));
+ GC_ASSERT(!st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, NULL));
id = ULL2NUM(objspace->next_object_id);
objspace->next_object_id += OBJ_ID_INCREMENT;