GitHub

@@ -2046,8 +2046,11 @@ mrb_ary_delete(mrb_state *mrb, mrb_value self)

204620462047204720482048

static 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+20512054

mrb_int cmp;

20522055

int 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

20912094

if (cmp == -2) {

20922095

mrb_raise(mrb, E_ARGUMENT_ERROR, "comparison failed");

20932096

}

2094-

if (RARRAY_PTR(ary) != p) {

2097+

if (RARRAY_PTR(ary) != p || RARRAY_LEN(ary) != n) {

20952098

mrb_raise(mrb, E_RUNTIME_ERROR, "array modified during sort");

20962099

}

20972100

return cmp > 0;

@@ -2106,10 +2109,10 @@ heapify(mrb_state *mrb, mrb_value ary, mrb_value *a, mrb_int index, mrb_int size

21062109

mrb_int left_index = 2 * index + 1;

21072110

mrb_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)) {

21102113

max = 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)) {

21132116

max = right_index;

21142117

}

21152118

@@ -2136,7 +2139,7 @@ insertion_sort(mrb_state *mrb, mrb_value ary, mrb_value *a, mrb_int size, mrb_va

21362139

mrb_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)) {

21402143

a[j + 1] = a[j];

21412144

j--;

21422145

}

Read the original on github.com ↗