summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2022-06-24 11:30:59 +0200
committerJean Boussier <jean.boussier@gmail.com>2022-06-25 00:05:00 +0200
commitd7cc380666058dab967a8b4f96782967ce3efc0d (patch)
treee27ccc40ce2d51b94a3375aa25d6e1bf49179452 /iseq.c
parent362d6d9ac8cb0909f0c3058b59a195153c9a6628 (diff)
downloadruby-d7cc380666058dab967a8b4f96782967ce3efc0d.tar.gz
iseq.c: Use ntz_intptr for faster bitmap scan
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/iseq.c b/iseq.c
index 12a1b80bf3..7f02e1b9e5 100644
--- a/iseq.c
+++ b/iseq.c
@@ -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);
}
}
}