@@ -2046,8 +2046,11 @@ mrb_ary_delete(mrb_state *mrb, mrb_value self)
204620462047204720482048static mrb_bool
2049-sort_cmp(mrb_state *mrb, mrb_value ary, mrb_value *p, mrb_value a_val, mrb_value b_val, mrb_value blk)
2049+sort_cmp(mrb_state *mrb, mrb_value ary, mrb_value a_val, mrb_value b_val, mrb_value blk)
20502050{
2051+mrb_value *p = RARRAY_PTR(ary);
2052+mrb_int n = RARRAY_LEN(ary);
2053+20512054mrb_int cmp;
20522055int ai = mrb_gc_arena_save(mrb);
20532056@@ -2091,7 +2094,7 @@ sort_cmp(mrb_state *mrb, mrb_value ary, mrb_value *p, mrb_value a_val, mrb_value
20912094if (cmp == -2) {
20922095mrb_raise(mrb, E_ARGUMENT_ERROR, "comparison failed");
20932096 }
2094-if (RARRAY_PTR(ary) != p) {
2097+if (RARRAY_PTR(ary) != p || RARRAY_LEN(ary) != n) {
20952098mrb_raise(mrb, E_RUNTIME_ERROR, "array modified during sort");
20962099 }
20972100return cmp > 0;
@@ -2106,10 +2109,10 @@ heapify(mrb_state *mrb, mrb_value ary, mrb_value *a, mrb_int index, mrb_int size
21062109mrb_int left_index = 2 * index + 1;
21072110mrb_int right_index = left_index + 1;
210821112109-if (left_index < size && sort_cmp(mrb, ary, a, a[left_index], a[max], blk)) {
2112+if (left_index < size && sort_cmp(mrb, ary, a[left_index], a[max], blk)) {
21102113max = left_index;
21112114 }
2112-if (right_index < size && sort_cmp(mrb, ary, a, a[right_index], a[max], blk)) {
2115+if (right_index < size && sort_cmp(mrb, ary, a[right_index], a[max], blk)) {
21132116max = right_index;
21142117 }
21152118@@ -2136,7 +2139,7 @@ insertion_sort(mrb_state *mrb, mrb_value ary, mrb_value *a, mrb_int size, mrb_va
21362139mrb_int j = i - 1;
2137214021382141/* Move elements that are greater than key to one position ahead */
2139-while (j >= 0 && sort_cmp(mrb, ary, a, a[j], key, blk)) {
2142+while (j >= 0 && sort_cmp(mrb, ary, a[j], key, blk)) {
21402143a[j + 1] = a[j];
21412144j--;
21422145 }