diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb index bcfdc1ddc..524d01658 100644 --- a/mrbgems/mruby-array-ext/mrblib/array.rb +++ b/mrbgems/mruby-array-ext/mrblib/array.rb @@ -689,14 +689,7 @@ class Array if n > 0 # Use C iterator for complex cases state = __combination_init(n, permutation) - while (indices = __combination_next(state)) - # Convert indices to elements in Ruby - tmp = [nil] * n - i = 0 - while i < n - tmp[i] = self[indices[i]] - i += 1 - end + while tmp = __combination_next(state) yield tmp end end diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index 97ea11e11..100dce030 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -1600,10 +1600,11 @@ ary_combination_next(mrb_state *mrb, mrb_value self) } } - /* Build current combination indices */ + /* Build current combination */ mrb_value result = mrb_ary_new_capa(mrb, state->n); + const mrb_value *p = RARRAY_PTR(self); for (mrb_int i = 0; i < state->n; i++) { - mrb_ary_push(mrb, result, mrb_fixnum_value(state->indices[i])); + mrb_ary_push(mrb, result, p[state->indices[i]]); } mrb_int pos = state->n - 1;