Use FL_TEST_RAW in rb_hash_default_value

We should always have a T_HASH here, so we can use FL_TEST_RAW to avoid
checking whether we may have an immediate value.

I expect this to be a very small performance improvement (perf stat
./miniruby benchmark/hash_aref_miss.rb shows a ~1% improvement). It also
removes 9 instructions from rb_hash_default_value on x86_64.
This commit is contained in:
John Hawthorn 2022-12-16 17:00:13 -08:00
Родитель fbaa5db44a
Коммит ea3d3c4552
1 изменённых файлов: 3 добавлений и 1 удалений

4
hash.c
Просмотреть файл

@ -2088,9 +2088,11 @@ rb_hash_default_unredefined(VALUE hash)
VALUE
rb_hash_default_value(VALUE hash, VALUE key)
{
RUBY_ASSERT(RB_TYPE_P(hash, T_HASH));
if (LIKELY(rb_hash_default_unredefined(hash))) {
VALUE ifnone = RHASH_IFNONE(hash);
if (!FL_TEST(hash, RHASH_PROC_DEFAULT)) return ifnone;
if (LIKELY(!FL_TEST_RAW(hash, RHASH_PROC_DEFAULT))) return ifnone;
if (UNDEF_P(key)) return Qnil;
return call_default_proc(ifnone, hash, key);
}