diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-19 06:03:20 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-19 06:03:20 -0800 |
| commit | d7a34b625bbcb954b38e24e78958b93a2cc1e249 (patch) | |
| tree | 39bdf5a6632fbee398c4eea08df6f13ed54a4c09 | |
| parent | c514b3697db145aad65bcb261b3edb20fcc39523 (diff) | |
| parent | 38a0a604120a42c15267d8ce9afb7a6b72f2b18f (diff) | |
| download | mruby-d7a34b625bbcb954b38e24e78958b93a2cc1e249.tar.gz mruby-d7a34b625bbcb954b38e24e78958b93a2cc1e249.zip | |
Merge pull request #1611 from h2so5/inspect-type
fix TypeError message
| -rw-r--r-- | src/object.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/object.c b/src/object.c index 56d5e65cd..529c168ee 100644 --- a/src/object.c +++ b/src/object.c @@ -293,6 +293,17 @@ mrb_init_object(mrb_state *mrb) } static mrb_value +inspect_type(mrb_state *mrb, mrb_value val) +{ + if (mrb_type(val) == MRB_TT_FALSE || mrb_type(val) == MRB_TT_TRUE) { + return mrb_inspect(mrb, val); + } + else { + return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, val)); + } +} + +static mrb_value convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *method, int raise) { mrb_sym m = 0; @@ -300,7 +311,7 @@ convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *metho m = mrb_intern_cstr(mrb, method); if (!mrb_respond_to(mrb, val, m)) { if (raise) { - mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S", val, mrb_str_new_cstr(mrb, tname)); + mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S", inspect_type(mrb, val), mrb_str_new_cstr(mrb, tname)); return mrb_nil_value(); } else { @@ -499,8 +510,9 @@ mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method) if (mrb_fixnum_p(val)) return val; v = convert_type(mrb, val, "Integer", method, TRUE); if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) { + mrb_value type = inspect_type(mrb, val); mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)", - val, val, mrb_str_new_cstr(mrb, method), v); + type, type, mrb_str_new_cstr(mrb, method), inspect_type(mrb, v)); } return v; } |
