diff options
author | Jean Boussier <[email protected]> | 2022-06-24 11:30:59 +0200 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2022-06-25 00:05:00 +0200 |
commit | d7cc380666058dab967a8b4f96782967ce3efc0d (patch) | |
tree | e27ccc40ce2d51b94a3375aa25d6e1bf49179452 /iseq.c | |
parent | 362d6d9ac8cb0909f0c3058b59a195153c9a6628 (diff) |
iseq.c: Use ntz_intptr for faster bitmap scan
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6059
Diffstat (limited to 'iseq.c')
-rw-r--r-- | iseq.c | 28 |
1 files changed, 12 insertions, 16 deletions
@@ -316,21 +316,17 @@ iseq_extract_values(VALUE *code, size_t pos, iseq_value_itr_t * func, void *data } static inline void -iseq_scan_bits(unsigned int i, iseq_bits_t bits, VALUE *code, iseq_value_itr_t *func, void *data) -{ - unsigned int count = 0; - - while(bits) { - if (bits & 0x1) { - unsigned int index = (i * ISEQ_MBITS_BITLENGTH) + count; - VALUE op = code[index]; - VALUE newop = func(data, op); - if (newop != op) { - code[index] = newop; - } +iseq_scan_bits(iseq_bits_t bits, VALUE *code, iseq_value_itr_t *func, void *data) +{ + unsigned int offset; + while (bits) { + offset = ntz_intptr(bits); + VALUE op = code[offset]; + VALUE newop = func(data, op); + if (newop != op) { + code[offset] = newop; } - bits >>= 1; - count++; + bits ^= bits & -bits; // Reset Lowest Set Bit (BLSR) } } @@ -385,13 +381,13 @@ rb_iseq_each_value(const rb_iseq_t *iseq, iseq_value_itr_t * func, void *data) // Embedded VALUEs if (ISEQ_MBITS_BUFLEN(size) == 1) { - iseq_scan_bits(0, body->mark_bits.single, code, func, data); + iseq_scan_bits(body->mark_bits.single, code, func, data); } else { if (body->mark_bits.list) { for (unsigned int i = 0; i < ISEQ_MBITS_BUFLEN(size); i++) { iseq_bits_t bits = body->mark_bits.list[i]; - iseq_scan_bits(i, bits, code, func, data); + iseq_scan_bits(bits, &code[i * ISEQ_MBITS_BITLENGTH], func, data); } } } |