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

ruby-changes:32698

From: naruse <ko1@a...>
Date: Fri, 31 Jan 2014 17:59:04 +0900 (JST)
Subject: [ruby-changes:32698] naruse:r44777 (ruby_2_1): merge revision(s) 44455, 44458, 44510: [Backport #9349]

naruse	2014-01-31 17:58:59 +0900 (Fri, 31 Jan 2014)

  New Revision: 44777

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

  Log:
    merge revision(s) 44455,44458,44510: [Backport #9349]
    
    * vm_insnhelper.c (vm_search_super_method): direct superclass of a
      module is found when super called in a Method object generated a
      method defined in a module, call method_missing in that case.
      [ruby-core:59358] [Bug #9315]
    
    * proc.c (mnew_from_me): keep iclass as-is, to make inheritance
      chain consistent.  [ruby-core:59358] [Bug #9315]
    
    * proc.c (method_owner): return the original defined_class from
      prepended iclass, instead.

  Modified directories:
    branches/ruby_2_1/
  Modified files:
    branches/ruby_2_1/ChangeLog
    branches/ruby_2_1/proc.c
    branches/ruby_2_1/test/ruby/test_super.rb
    branches/ruby_2_1/version.h
Index: ruby_2_1/ChangeLog
===================================================================
--- ruby_2_1/ChangeLog	(revision 44776)
+++ ruby_2_1/ChangeLog	(revision 44777)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/ChangeLog#L1
+Fri Jan 31 12:10:16 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* proc.c (mnew_from_me): keep iclass as-is, to make inheritance
+	  chain consistent.  [ruby-core:59358] [Bug #9315]
+
+	* proc.c (method_owner): return the original defined_class from
+	  prepended iclass, instead.
+
 Fri Jan 31 12:05:59 2014  Nobuyoshi Nakada  <nobu@r...>
 
 	* configure.in: let mingw do something black-magic, and check if
Index: ruby_2_1/proc.c
===================================================================
--- ruby_2_1/proc.c	(revision 44776)
+++ ruby_2_1/proc.c	(revision 44777)
@@ -1171,10 +1171,6 @@ mnew_from_me(rb_method_entry_t *me, VALU https://github.com/ruby/ruby/blob/trunk/ruby_2_1/proc.c#L1171
 	goto again;
     }
 
-    if (RB_TYPE_P(defined_class, T_ICLASS)) {
-	defined_class = RBASIC_CLASS(defined_class);
-    }
-
     klass = defined_class;
 
     while (rclass != klass &&
@@ -1396,9 +1392,16 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_1/proc.c#L1392
 method_owner(VALUE obj)
 {
     struct METHOD *data;
+    VALUE defined_class;
 
     TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
-    return data->defined_class;
+    defined_class = data->defined_class;
+
+    if (RB_TYPE_P(defined_class, T_ICLASS)) {
+	defined_class = RBASIC_CLASS(defined_class);
+    }
+
+    return defined_class;
 }
 
 void
Index: ruby_2_1/version.h
===================================================================
--- ruby_2_1/version.h	(revision 44776)
+++ ruby_2_1/version.h	(revision 44777)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/version.h#L1
 #define RUBY_VERSION "2.1.1"
 #define RUBY_RELEASE_DATE "2014-01-31"
-#define RUBY_PATCHLEVEL 12
+#define RUBY_PATCHLEVEL 13
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 1
Index: ruby_2_1/test/ruby/test_super.rb
===================================================================
--- ruby_2_1/test/ruby/test_super.rb	(revision 44776)
+++ ruby_2_1/test/ruby/test_super.rb	(revision 44777)
@@ -407,4 +407,37 @@ class TestSuper < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_1/test/ruby/test_super.rb#L407
     assert_equal([false, false], y.foo(false, false))
     assert_equal([1, 2, 3, false, 5], y.foo(1, 2, 3, false, 5))
   end
+
+  def test_missing_super_in_method_module
+    bug9315 = '[ruby-core:59358] [Bug #9315]'
+    a = Module.new do
+      def foo
+        super
+      end
+    end
+    b = Class.new do
+      include a
+    end
+    assert_raise(NoMethodError, bug9315) do
+      b.new.method(:foo).call
+    end
+  end
+
+  def test_module_super_in_method_module
+    bug9315 = '[ruby-core:59589] [Bug #9315]'
+    a = Module.new do
+      def foo
+        super
+      end
+    end
+    c = Class.new do
+      def foo
+        :ok
+      end
+    end
+    o = c.new.extend(a)
+    assert_nothing_raised(NoMethodError, bug9315) do
+      assert_equal(:ok, o.method(:foo).call, bug9315)
+    end
+  end
 end

Property changes on: ruby_2_1
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r44455,44458,44510


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

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