summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorh2so5 <[email protected]>2013-12-19 17:29:31 +0900
committerh2so5 <[email protected]>2013-12-19 17:40:47 +0900
commit38a0a604120a42c15267d8ce9afb7a6b72f2b18f (patch)
tree3c3b2407ac95c5ee7c7cfa07c2826ba1d33e7624 /src
parent8cd42f64665b08fb35ee7fb5e69057be07dc7c76 (diff)
downloadmruby-38a0a604120a42c15267d8ce9afb7a6b72f2b18f.tar.gz
mruby-38a0a604120a42c15267d8ce9afb7a6b72f2b18f.zip
fix TypeError message
Diffstat (limited to 'src')
-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;
}