[前][次][番号順一覧][スレッド一覧]

ruby-changes:32908

From: nagachika <ko1@a...>
Date: Sun, 16 Feb 2014 01:29:15 +0900 (JST)
Subject: [ruby-changes:32908] nagachika:r44987 (ruby_2_0_0): merge revision(s) r44758, r44759, r44760: [Backport #9466]

nagachika	2014-02-16 01:29:10 +0900 (Sun, 16 Feb 2014)

  New Revision: 44987

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=44987

  Log:
    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.

  Modified directories:
    branches/ruby_2_0_0/
  Modified files:
    branches/ruby_2_0_0/object.c
    branches/ruby_2_0_0/test/ruby/test_exception.rb
    branches/ruby_2_0_0/version.h
    branches/ruby_2_0_0/vm_eval.c
Index: ruby_2_0_0/object.c
===================================================================
--- ruby_2_0_0/object.c	(revision 44986)
+++ ruby_2_0_0/object.c	(revision 44987)
@@ -2350,13 +2350,16 @@ convert_type(VALUE val, const char *tnam https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/object.c#L2350
     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 *tnam https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/object.c#L2367
     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, con https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/object.c#L2385
     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 typ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/object.c#L2400
     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 *met https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/object.c#L2415
     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;
 }
Index: ruby_2_0_0/vm_eval.c
===================================================================
--- ruby_2_0_0/vm_eval.c	(revision 44986)
+++ ruby_2_0_0/vm_eval.c	(revision 44987)
@@ -486,38 +486,37 @@ rb_search_method_entry(VALUE recv, ID mi https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/vm_eval.c#L486
     VALUE klass = CLASS_OF(recv);
 
     if (!klass) {
-        VALUE flags, klass;
-        if (IMMEDIATE_P(recv)) {
+        VALUE flags;
+        if (SPECIAL_CONST_P(recv)) {
             rb_raise(rb_eNotImpError,
-                     "method `%s' called on unexpected immediate object (%p)",
-                     rb_id2name(mid), (void *)recv);
+                     "method `%"PRIsVALUE"' called on unexpected immediate object (%p)",
+                     rb_id2str(mid), (void *)recv);
         }
         flags = RBASIC(recv)->flags;
-        klass = RBASIC(recv)->klass;
         if (flags == 0) {
             rb_raise(rb_eNotImpError,
-                     "method `%s' called on terminated object"
-                     " (%p flags=0x%"PRIxVALUE" klass=0x%"PRIxVALUE")",
-                     rb_id2name(mid), (void *)recv, flags, klass);
+                     "method `%"PRIsVALUE"' called on terminated object"
+                     " (%p flags=0x%"PRIxVALUE")",
+                     rb_id2str(mid), (void *)recv, flags);
         }
         else {
             int type = BUILTIN_TYPE(recv);
             const char *typestr = rb_type_str(type);
             if (typestr && T_OBJECT <= type && type < T_NIL)
                 rb_raise(rb_eNotImpError,
-                         "method `%s' called on hidden %s object"
-                         " (%p flags=0x%"PRIxVALUE" klass=0x%"PRIxVALUE")",
-                         rb_id2name(mid), typestr, (void *)recv, flags, klass);
+                         "method `%"PRIsVALUE"' called on hidden %s object"
+                         " (%p flags=0x%"PRIxVALUE")",
+                         rb_id2str(mid), typestr, (void *)recv, flags);
             if (typestr)
                 rb_raise(rb_eNotImpError,
-                         "method `%s' called on unexpected %s object"
-                         " (%p flags=0x%"PRIxVALUE" klass=0x%"PRIxVALUE")",
-                         rb_id2name(mid), typestr, (void *)recv, flags, klass);
+                         "method `%"PRIsVALUE"' called on unexpected %s object"
+                         " (%p flags=0x%"PRIxVALUE")",
+                         rb_id2str(mid), typestr, (void *)recv, flags);
             else
                 rb_raise(rb_eNotImpError,
-                         "method `%s' called on broken T_???" "(0x%02x) object"
-                         " (%p flags=0x%"PRIxVALUE" klass=0x%"PRIxVALUE")",
-                         rb_id2name(mid), type, (void *)recv, flags, klass);
+                         "method `%"PRIsVALUE"' called on broken T_???" "(0x%02x) object"
+                         " (%p flags=0x%"PRIxVALUE")",
+                         rb_id2str(mid), type, (void *)recv, flags);
         }
     }
     return rb_method_entry(klass, mid, defined_class_ptr);
Index: ruby_2_0_0/version.h
===================================================================
--- ruby_2_0_0/version.h	(revision 44986)
+++ ruby_2_0_0/version.h	(revision 44987)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/version.h#L1
 #define RUBY_VERSION "2.0.0"
 #define RUBY_RELEASE_DATE "2014-02-16"
-#define RUBY_PATCHLEVEL 421
+#define RUBY_PATCHLEVEL 422
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 2
Index: ruby_2_0_0/test/ruby/test_exception.rb
===================================================================
--- ruby_2_0_0/test/ruby/test_exception.rb	(revision 44986)
+++ ruby_2_0_0/test/ruby/test_exception.rb	(revision 44987)
@@ -224,6 +224,25 @@ class TestException < Test::Unit::TestCa https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_exception.rb#L224
     assert_raise(ArgumentError) { raise 1, 1, 1, 1 }
   end
 
+  def test_type_error_message_encoding
+    c = eval("Module.new do break class C\u{4032}; self; end; end")
+    o = c.new
+    e = assert_raise(TypeError) do
+      ""[o]
+    end
+    assert_match(/C\u{4032}/, e.message)
+    c.class_eval {def to_int; self; end}
+    e = assert_raise(TypeError) do
+      ""[o]
+    end
+    assert_match(/C\u{4032}/, e.message)
+    c.class_eval {def to_a; self; end}
+    assert_raise(TypeError) do
+      [*o]
+    end
+    assert_match(/C\u{4032}/, e.message)
+  end
+
   def test_errat
     assert_in_out_err([], "p $@", %w(nil), [])
 

Property changes on: ruby_2_0_0
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r44758-44760


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]