summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-12-19 06:03:20 -0800
committerYukihiro "Matz" Matsumoto <[email protected]>2013-12-19 06:03:20 -0800
commitd7a34b625bbcb954b38e24e78958b93a2cc1e249 (patch)
tree39bdf5a6632fbee398c4eea08df6f13ed54a4c09
parentc514b3697db145aad65bcb261b3edb20fcc39523 (diff)
parent38a0a604120a42c15267d8ce9afb7a6b72f2b18f (diff)
downloadmruby-d7a34b625bbcb954b38e24e78958b93a2cc1e249.tar.gz
mruby-d7a34b625bbcb954b38e24e78958b93a2cc1e249.zip
Merge pull request #1611 from h2so5/inspect-type
fix TypeError message
-rw-r--r--src/object.c16
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;
}