diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-08-19 10:51:12 -0400 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2024-08-23 10:49:27 -0400 |
| commit | 3f6be01bfc34e13d9fd1f3fa4c4023735d631428 (patch) | |
| tree | f00baa8577e40c99c5264fede681ad64a57f4e48 | |
| parent | b51e1c07d84af189885f10a947e75497481c958d (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.c | 14 |
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; |
