mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
array.c (sort_cmp): mrb_cmp() may return -2 for errors
This commit is contained in:
+8
-1
@@ -1582,6 +1582,12 @@ mrb_ary_delete(mrb_state *mrb, mrb_value self)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static mrb_noreturn void
|
||||
cmp_failed(mrb_state *mrb, mrb_int a, mrb_int b)
|
||||
{
|
||||
mrb_raisef(mrb, E_ARGUMENT_ERROR, "comparison failed (element %d and %d)", a, b);
|
||||
}
|
||||
|
||||
static mrb_bool
|
||||
sort_cmp(mrb_state *mrb, mrb_value ary, mrb_value *p, mrb_int a, mrb_int b, mrb_value blk)
|
||||
{
|
||||
@@ -1589,11 +1595,12 @@ sort_cmp(mrb_state *mrb, mrb_value ary, mrb_value *p, mrb_int a, mrb_int b, mrb_
|
||||
|
||||
if (mrb_nil_p(blk)) {
|
||||
cmp = mrb_cmp(mrb, p[a], p[b]);
|
||||
if (cmp == -2) cmp_failed(mrb, a, b);
|
||||
}
|
||||
else {
|
||||
mrb_value c = mrb_funcall_id(mrb, blk, MRB_SYM(call), 2, p[a], p[b]);
|
||||
if (mrb_nil_p(c) || !mrb_fixnum_p(c)) {
|
||||
mrb_raisef(mrb, E_ARGUMENT_ERROR, "comparison failed (element %d and %d)", a, b);
|
||||
cmp_failed(mrb, a, b);
|
||||
}
|
||||
cmp = mrb_fixnum(c);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user