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

ruby-changes:14078

From: nobu <ko1@a...>
Date: Tue, 24 Nov 2009 00:00:26 +0900 (JST)
Subject: [ruby-changes:14078] Ruby:r25890 (ruby_1_8): * eval.c (rb_method_missing): adjusted format and argument number.

nobu	2009-11-23 23:59:28 +0900 (Mon, 23 Nov 2009)

  New Revision: 25890

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

  Log:
    * eval.c (rb_method_missing): adjusted format and argument number.
    
    * eval.c (rb_call): fixed for super in cached method.
      [ruby-dev:39757]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/test/ruby/test_object.rb

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 25889)
+++ ruby_1_8/ChangeLog	(revision 25890)
@@ -1,3 +1,11 @@
+Mon Nov 23 23:59:26 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_method_missing): adjusted format and argument number.
+
+	* eval.c (rb_call): fixed for super in cached method.
+	  [ruby-dev:39757]
+n
+
 Mon Nov 23 11:26:45 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* dln.c (dln_find_1): removed duplication.
Index: ruby_1_8/test/ruby/test_object.rb
===================================================================
--- ruby_1_8/test/ruby/test_object.rb	(revision 25889)
+++ ruby_1_8/test/ruby/test_object.rb	(revision 25890)
@@ -283,6 +283,33 @@
     assert_raise(ArgumentError) { 1.send }
   end
 
+  def test_no_superclass_method
+    o = Object.new
+    e = assert_raise(NoMethodError) {
+      o.method(:__send__).call(:never_defined_test_no_superclass_method)
+    }
+    m1 = e.message
+    assert_no_match(/no superclass method/, m1)
+    e = assert_raise(NoMethodError) {
+      o.method(:__send__).call(:never_defined_test_no_superclass_method)
+    }
+    assert_equal(m1, e.message)
+    e = assert_raise(NoMethodError) {
+      o.never_defined_test_no_superclass_method
+    }
+    assert_equal(m1, e.message)
+  end
+
+  def test_superclass_method
+    o = Object.new
+    def o.foo; super; end
+    e = assert_raise(NoMethodError) {o.foo}
+    m1 = e.message
+    assert_match(/no superclass method/, m1)
+    e = assert_raise(NoMethodError) {o.foo}
+    assert_equal(m1, e.message)
+  end
+
   def test_specific_eval_with_wrong_arguments
     assert_raise(ArgumentError) do
       1.instance_eval("foo") { foo }
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 25889)
+++ ruby_1_8/eval.c	(revision 25890)
@@ -5770,7 +5770,7 @@
 	exc = rb_eNameError;
     }
     else if (last_call_status & CSTAT_SUPER) {
-	format = "super: no superclass method `%s'";
+	format = "super: no superclass method `%s' for %s";
     }
     if (!format) {
 	format = "undefined method `%s' for %s";
@@ -6220,13 +6220,14 @@
     ent = cache + EXPR1(klass, mid);
     if (ent->mid == mid && ent->klass == klass) {
 	if (!ent->method)
-	    return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0);
+	    goto nomethod;
 	klass = ent->origin;
 	id    = ent->mid0;
 	noex  = ent->noex;
 	body  = ent->method;
     }
     else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) {
+      nomethod:
 	if (scope == 3) {
 	    return method_missing(recv, mid, argc, argv, CSTAT_SUPER);
 	}

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

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