diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index 337bd2e6b..4680633c2 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -79,8 +79,10 @@ ary_assoc(mrb_state *mrb, mrb_value ary) mrb_value v; mrb_value k = mrb_get_arg1(mrb); + /* Hoist pointer retrieval outside loop */ + mrb_value *ptr = RARRAY_PTR(ary); for (i = 0; i < RARRAY_LEN(ary); i++) { - v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]); + v = mrb_check_array_type(mrb, ptr[i]); if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 && mrb_equal(mrb, RARRAY_PTR(v)[0], k)) return v; @@ -109,8 +111,10 @@ ary_rassoc(mrb_state *mrb, mrb_value ary) mrb_value v; mrb_value value = mrb_get_arg1(mrb); + /* Hoist pointer retrieval outside loop */ + mrb_value *ptr = RARRAY_PTR(ary); for (i = 0; i < RARRAY_LEN(ary); i++) { - v = RARRAY_PTR(ary)[i]; + v = ptr[i]; if (mrb_array_p(v) && RARRAY_LEN(v) > 1 && mrb_equal(mrb, RARRAY_PTR(v)[1], value)) @@ -256,9 +260,11 @@ ary_compact_bang(mrb_state *mrb, mrb_value self) mrb_ary_modify(mrb, a); /* a is still valid here, as mrb_ary_modify only modifies the RArray struct, not reallocates it */ + /* Hoist pointer retrieval outside loop to avoid repeated conditionals */ + mrb_value *ptr = RARRAY_PTR(self); for (i = 0; i < len; i++) { - if (!mrb_nil_p(RARRAY_PTR(self)[i])) { - if (i != j) RARRAY_PTR(self)[j] = RARRAY_PTR(self)[i]; + if (!mrb_nil_p(ptr[i])) { + if (i != j) ptr[j] = ptr[i]; j++; } } @@ -319,8 +325,10 @@ ary_rotate(mrb_state *mrb, mrb_value self) else { idx = count % len; } + /* Hoist pointer retrieval outside loop */ + mrb_value *ptr = RARRAY_PTR(self); for (mrb_int i = 0; i