diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-15 16:29:10 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-15 16:29:10 +0000 |
commit | e68cf6f561560b624ea7a74eda0bd9d58f7020b1 (patch) | |
tree | b180422d43c56733bf0f2c35c677864577f52753 /object.c | |
parent | 257ec8c9afd3cfc6e191a582d42390ce83f53c1e (diff) |
merge revision(s) r44758,r44759,r44760: [Backport #9466]
object.c: error message encoding
* object.c (convert_type, rb_convert_type, rb_check_convert_type),
(rb_to_integer): preserve class name encoding error messages.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@44987 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 39 |
1 files changed, 23 insertions, 16 deletions
@@ -2350,13 +2350,16 @@ convert_type(VALUE val, const char *tname, const char *method, int raise) r = rb_check_funcall(val, m, 0, 0); if (r == Qundef) { if (raise) { - rb_raise(rb_eTypeError, i < IMPLICIT_CONVERSIONS - ? "no implicit conversion of %s into %s" - : "can't convert %s into %s", - NIL_P(val) ? "nil" : - val == Qtrue ? "true" : - val == Qfalse ? "false" : - rb_obj_classname(val), + const char *msg = i < IMPLICIT_CONVERSIONS ? + "no implicit conversion of" : "can't convert"; + const char *cname = NIL_P(val) ? "nil" : + val == Qtrue ? "true" : + val == Qfalse ? "false" : + NULL; + if (cname) + rb_raise(rb_eTypeError, "%s %s into %s", msg, cname, tname); + rb_raise(rb_eTypeError, "%s %"PRIsVALUE" into %s", msg, + rb_obj_class(val), tname); } return Qnil; @@ -2364,6 +2367,16 @@ convert_type(VALUE val, const char *tname, const char *method, int raise) return r; } +NORETURN(static void conversion_mismatch(VALUE, const char *, const char *, VALUE)); +static void +conversion_mismatch(VALUE val, const char *tname, const char *method, VALUE result) +{ + VALUE cname = rb_obj_class(val); + rb_raise(rb_eTypeError, + "can't convert %"PRIsVALUE" to %s (%"PRIsVALUE"#%s gives %"PRIsVALUE")", + cname, tname, cname, method, rb_obj_class(result)); +} + VALUE rb_convert_type(VALUE val, int type, const char *tname, const char *method) { @@ -2372,9 +2385,7 @@ rb_convert_type(VALUE val, int type, const char *tname, const char *method) if (TYPE(val) == type) return val; v = convert_type(val, tname, method, TRUE); if (TYPE(v) != type) { - const char *cname = rb_obj_classname(val); - rb_raise(rb_eTypeError, "can't convert %s to %s (%s#%s gives %s)", - cname, tname, cname, method, rb_obj_classname(v)); + conversion_mismatch(val, tname, method, v); } return v; } @@ -2389,9 +2400,7 @@ rb_check_convert_type(VALUE val, int type, const char *tname, const char *method v = convert_type(val, tname, method, FALSE); if (NIL_P(v)) return Qnil; if (TYPE(v) != type) { - const char *cname = rb_obj_classname(val); - rb_raise(rb_eTypeError, "can't convert %s to %s (%s#%s gives %s)", - cname, tname, cname, method, rb_obj_classname(v)); + conversion_mismatch(val, tname, method, v); } return v; } @@ -2406,9 +2415,7 @@ rb_to_integer(VALUE val, const char *method) if (RB_TYPE_P(val, T_BIGNUM)) return val; v = convert_type(val, "Integer", method, TRUE); if (!rb_obj_is_kind_of(v, rb_cInteger)) { - const char *cname = rb_obj_classname(val); - rb_raise(rb_eTypeError, "can't convert %s to Integer (%s#%s gives %s)", - cname, cname, method, rb_obj_classname(v)); + conversion_mismatch(val, "Integer", method, v); } return v; } |