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

ruby-changes:25347

From: shugo <ko1@a...>
Date: Thu, 1 Nov 2012 14:45:40 +0900 (JST)
Subject: [ruby-changes:25347] shugo:r37399 (trunk): * eval.c (rb_using_module): using should be used indirectly.

shugo	2012-11-01 14:45:28 +0900 (Thu, 01 Nov 2012)

  New Revision: 37399

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

  Log:
    * eval.c (rb_using_module): using should be used indirectly.
      [ruby-dev:46326] [Feature #7251]

  Modified files:
    trunk/ChangeLog
    trunk/eval.c
    trunk/test/ruby/test_refinement.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37398)
+++ ChangeLog	(revision 37399)
@@ -1,3 +1,8 @@
+Thu Nov  1 14:41:47 2012  Shugo Maeda  <shugo@r...>
+
+	* eval.c (rb_using_module): using should be used indirectly.
+	  [ruby-dev:46326] [Feature #7251]
+
 Wed Oct 31 18:17:38 2012  Narihiro Nakamura  <authornari@g...>
 
 	* gc.c (gc_profile_record): don't define unused variables when
Index: eval.c
===================================================================
--- eval.c	(revision 37398)
+++ eval.c	(revision 37399)
@@ -1090,11 +1090,22 @@
     rb_clear_cache_by_class(klass);
 }
 
+void rb_using_module(NODE *cref, VALUE module);
+
 static int
-using_module_i(VALUE klass, VALUE module, VALUE arg)
+using_module_i(VALUE module, VALUE val, VALUE arg)
 {
     NODE *cref = (NODE *) arg;
 
+    rb_using_module(cref, module);
+    return ST_CONTINUE;
+}
+
+static int
+using_refinement(VALUE klass, VALUE module, VALUE arg)
+{
+    NODE *cref = (NODE *) arg;
+
     rb_using_refinement(cref, klass, module);
     return ST_CONTINUE;
 }
@@ -1104,12 +1115,19 @@
 {
     ID id_refinements;
     VALUE refinements;
+    ID id_using_modules;
+    VALUE using_modules;
 
     check_class_or_module(module);
+    CONST_ID(id_using_modules, "__using_modules__");
+    using_modules = rb_attr_get(module, id_using_modules);
+    if (!NIL_P(using_modules)) {
+	rb_hash_foreach(using_modules, using_module_i, (VALUE) cref);
+    }
     CONST_ID(id_refinements, "__refinements__");
     refinements = rb_attr_get(module, id_refinements);
     if (NIL_P(refinements)) return;
-    rb_hash_foreach(refinements, using_module_i, (VALUE) cref);
+    rb_hash_foreach(refinements, using_refinement, (VALUE) cref);
 }
 
 /*
Index: test/ruby/test_refinement.rb
===================================================================
--- test/ruby/test_refinement.rb	(revision 37398)
+++ test/ruby/test_refinement.rb	(revision 37399)
@@ -530,4 +530,74 @@
     }
     assert_equal("no block given", e.message)
   end
+
+  module IndirectUsing
+    class C
+    end
+
+    module M1
+      refine C do
+        def m1
+          :m1
+        end
+      end
+    end
+
+    module M2
+      refine C do
+        def m2
+          :m2
+        end
+      end
+    end
+
+    module M3
+      using M1
+      using M2
+    end
+
+    module M
+      using M3
+
+      def self.call_m1
+        C.new.m1
+      end
+
+      def self.call_m2
+        C.new.m2
+      end
+    end
+  end
+
+  def test_indirect_using
+    assert_equal(:m1, IndirectUsing::M.call_m1)
+    assert_equal(:m2, IndirectUsing::M.call_m2)
+  end
+
+  def test_indirect_using_module_eval
+    c = Class.new
+    m1 = Module.new {
+      refine c do
+        def m1
+          :m1
+        end
+      end
+    }
+    m2 = Module.new {
+      refine c do
+        def m2
+          :m2
+        end
+      end
+    }
+    m3 = Module.new {
+      using m1
+      using m2
+    }
+    m = Module.new {
+      using m3
+    }
+    assert_equal(:m1, m.module_eval { c.new.m1 })
+    assert_equal(:m2, m.module_eval { c.new.m2 })
+  end
 end

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

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