diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | array.c | 11 | ||||
-rw-r--r-- | hash.c | 6 |
3 files changed, 19 insertions, 6 deletions
@@ -1,3 +1,11 @@ +Sat May 8 13:48:31 2010 Marc-Andre Lafortune <ruby-core@marc-andre.ca> + + * array.c (rb_ary_fetch, rb_ary_splice, rb_ary_store): Improve + IndexError + messages [ruby-core:28394] + + * hash.c (rb_hash_fetch_m): Improve KeyError message + Sat May 8 13:11:28 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/rubygems/user_interaction.rb (Gem::StreamUI#ask_for_password): @@ -616,8 +616,8 @@ rb_ary_store(VALUE ary, long idx, VALUE val) if (idx < 0) { idx += RARRAY_LEN(ary); if (idx < 0) { - rb_raise(rb_eIndexError, "index %ld out of array", - idx - RARRAY_LEN(ary)); + rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld", + idx - RARRAY_LEN(ary), -RARRAY_LEN(ary)); } } else if (idx >= ARY_MAX_SIZE) { @@ -1133,7 +1133,8 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary) if (idx < 0 || RARRAY_LEN(ary) <= idx) { if (block_given) return rb_yield(pos); if (argc == 1) { - rb_raise(rb_eIndexError, "index %ld out of array", idx); + rb_raise(rb_eIndexError, "index %ld outside of array bounds: %ld...%ld", + idx - (idx < 0 ? RARRAY_LEN(ary) : 0), -RARRAY_LEN(ary), RARRAY_LEN(ary)); } return ifnone; } @@ -1246,8 +1247,8 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl) if (beg < 0) { beg += RARRAY_LEN(ary); if (beg < 0) { - beg -= RARRAY_LEN(ary); - rb_raise(rb_eIndexError, "index %ld out of array", beg); + rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld", + beg - RARRAY_LEN(ary), -RARRAY_LEN(ary)); } } if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) { @@ -570,7 +570,11 @@ rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash) if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) { if (block_given) return rb_yield(key); if (argc == 1) { - rb_raise(rb_eKeyError, "key not found"); + VALUE desc = rb_protect(rb_inspect, key, 0); + if (NIL_P(desc) || RSTRING_LEN(desc) > 65) { + desc = rb_any_to_s(key); + } + rb_raise(rb_eKeyError, "key not found: %s", RSTRING_PTR(desc)); } return if_none; } |