diff options
Diffstat (limited to 'src/array.c')
| -rw-r--r-- | src/array.c | 70 |
1 files changed, 23 insertions, 47 deletions
diff --git a/src/array.c b/src/array.c index a4a09ec0a..ceda884c0 100644 --- a/src/array.c +++ b/src/array.c @@ -19,7 +19,7 @@ #define ARY_DEFAULT_LEN 4 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) -#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX) +#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) @@ -40,7 +40,7 @@ ary_new_capa(mrb_state *mrb, mrb_int capa) if (capa > ARY_MAX_SIZE) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } - blen = capa * sizeof(mrb_value) ; + blen = capa * sizeof(mrb_value); if (blen < capa) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } @@ -926,7 +926,8 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) } if (mrb_array_p(RARRAY_PTR(ary)[i])) { s = inspect_ary(mrb, RARRAY_PTR(ary)[i], list); - } else { + } + else { s = mrb_inspect(mrb, RARRAY_PTR(ary)[i]); } mrb_str_buf_cat(mrb, arystr, RSTRING_PTR(s), RSTRING_LEN(s)); @@ -1056,39 +1057,26 @@ static mrb_value mrb_ary_equal(mrb_state *mrb, mrb_value ary1) { mrb_value ary2; - mrb_bool equal_p; + mrb_int i; mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) { - equal_p = 1; - } - else if (mrb_special_const_p(ary2)) { - equal_p = 0; - } - else if (!mrb_array_p(ary2)) { + if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); + if (mrb_special_const_p(ary2)) return mrb_false_value(); + if (!mrb_array_p(ary2)) { if (!mrb_respond_to(mrb, ary2, mrb_intern2(mrb, "to_ary", 6))) { - equal_p = 0; + return mrb_false_value(); } else { - equal_p = mrb_equal(mrb, ary2, ary1); + return mrb_bool_value(mrb_equal(mrb, ary2, ary1)); } } - else if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) { - equal_p = 0; - } - else { - mrb_int i; - - equal_p = 1; - for (i=0; i<RARRAY_LEN(ary1); i++) { - if (!mrb_equal(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { - equal_p = 0; - break; - } + if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); + for (i=0; i<RARRAY_LEN(ary1); i++) { + if (!mrb_equal(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { + return mrb_false_value(); } } - - return mrb_bool_value(equal_p); + return mrb_true_value(); } /* 15.2.12.5.34 (x) */ @@ -1104,30 +1092,18 @@ static mrb_value mrb_ary_eql(mrb_state *mrb, mrb_value ary1) { mrb_value ary2; - mrb_bool eql_p; + mrb_int i; mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) { - eql_p = 1; - } - else if (!mrb_array_p(ary2)) { - eql_p = 0; - } - else if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) { - eql_p = 0; - } - else { - mrb_int i; - eql_p = 1; - for (i=0; i<RARRAY_LEN(ary1); i++) { - if (!mrb_eql(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { - eql_p = 0; - break; - } + if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); + if (!mrb_array_p(ary2)) return mrb_false_value(); + if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); + for (i=0; i<RARRAY_LEN(ary1); i++) { + if (!mrb_eql(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { + return mrb_false_value(); } } - - return mrb_bool_value(eql_p); + return mrb_true_value(); } void |
