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

ruby-changes:25001

From: shugo <ko1@a...>
Date: Sat, 29 Sep 2012 11:21:40 +0900 (JST)
Subject: [ruby-changes:25001] shugo:r37053 (trunk): * vm_insnhelper.c (rb_vm_using_modules): use using_modules before

shugo	2012-09-29 11:21:27 +0900 (Sat, 29 Sep 2012)

  New Revision: 37053

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

  Log:
    * vm_insnhelper.c (rb_vm_using_modules): use using_modules before
      klass to fix method lookup order, and use klass even if klass is
      not a module to make refinements in class_eval invoked on classes
      work.
    
    * eval.c (rb_using_module): accept a class as the second argument.
    
    * eval.c (rb_mod_using, f_using): raise a TypeError if the argument
      is not a module.
    
    * test/ruby/test_refinement.rb: add new tests for the above changes.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37052)
+++ ChangeLog	(revision 37053)
@@ -1,3 +1,17 @@
+Sat Sep 29 11:21:06 2012  Shugo Maeda  <shugo@r...>
+
+	* vm_insnhelper.c (rb_vm_using_modules): use using_modules before
+	  klass to fix method lookup order, and use klass even if klass is
+	  not a module to make refinements in class_eval invoked on classes
+	  work.
+
+	* eval.c (rb_using_module): accept a class as the second argument.
+
+	* eval.c (rb_mod_using, f_using): raise a TypeError if the argument
+	  is not a module.
+
+	* test/ruby/test_refinement.rb: add new tests for the above changes.
+
 Sat Sep 29 02:18:57 2012  Hiroshi Shirosaki  <h.shirosaki@g...>
 
 	* test/ruby/test_unicode_escape.rb (TestUnicodeEscape#test_basic):
Index: eval.c
===================================================================
--- eval.c	(revision 37052)
+++ eval.c	(revision 37053)
@@ -1096,7 +1096,7 @@
     ID id_overlaid_modules;
     VALUE overlaid_modules;
 
-    Check_Type(module, T_MODULE);
+    check_class_or_module(module);
     CONST_ID(id_overlaid_modules, "__overlaid_modules__");
     overlaid_modules = rb_attr_get(module, id_overlaid_modules);
     if (NIL_P(overlaid_modules)) return;
@@ -1117,6 +1117,7 @@
     ID id_using_modules;
     VALUE using_modules;
 
+    Check_Type(module, T_MODULE);
     CONST_ID(id_using_modules, "__using_modules__");
     using_modules = rb_attr_get(self, id_using_modules);
     if (NIL_P(using_modules)) {
@@ -1345,6 +1346,7 @@
 {
     NODE *cref = rb_vm_cref();
 
+    Check_Type(module, T_MODULE);
     rb_using_module(cref, module);
     return self;
 }
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 37052)
+++ vm_insnhelper.c	(revision 37053)
@@ -1830,27 +1830,22 @@
     ID id_using_modules;
     VALUE using_modules;
 
+    if (NIL_P(klass)) return;
     CONST_ID(id_using_modules, "__using_modules__");
     using_modules = rb_attr_get(klass, id_using_modules);
-    switch (TYPE(klass)) {
-    case T_CLASS:
-	if (NIL_P(using_modules)) {
-	    VALUE super = rb_class_real(RCLASS_SUPER(klass));
-	    using_modules = rb_attr_get(super, id_using_modules);
-	    if (!NIL_P(using_modules)) {
-		using_modules = rb_hash_dup(using_modules);
-		rb_ivar_set(klass, id_using_modules, using_modules);
-	    }
+    if (NIL_P(using_modules) && BUILTIN_TYPE(klass) == T_CLASS) {
+	VALUE super = rb_class_real(RCLASS_SUPER(klass));
+	using_modules = rb_attr_get(super, id_using_modules);
+	if (!NIL_P(using_modules)) {
+	    using_modules = rb_hash_dup(using_modules);
+	    rb_ivar_set(klass, id_using_modules, using_modules);
 	}
-	break;
-    case T_MODULE:
-	rb_using_module(cref, klass);
-	break;
     }
     if (!NIL_P(using_modules)) {
 	rb_hash_foreach(using_modules, vm_using_module_i,
 			(VALUE) cref);
     }
+    rb_using_module(cref, klass);
 }
 
 static VALUE
Index: test/ruby/test_refinement.rb
===================================================================
--- test/ruby/test_refinement.rb	(revision 37052)
+++ test/ruby/test_refinement.rb	(revision 37053)
@@ -361,6 +361,34 @@
     assert_equal([:m1, :m2], m2.module_eval { obj.foo })
   end
 
+  def test_refine_module_with_double_overriding
+    m1 = Module.new {
+      def foo
+        [:m1]
+      end
+    }
+    c = Class.new {
+      include m1
+    }
+    m2 = Module.new {
+      refine m1 do
+        def foo
+          super << :m2
+        end
+      end
+    }
+    m3 = Module.new {
+      using m2
+      refine m1 do
+        def foo
+          super << :m3
+        end
+      end
+    }
+    obj = c.new
+    assert_equal([:m1, :m2, :m3], m3.module_eval { obj.foo })
+  end
+
   def test_refine_module_and_call_superclass_method
     m1 = Module.new
     c1 = Class.new {
@@ -399,4 +427,32 @@
       }
     end
   end
+
+  def test_refine_in_class_and_class_eval
+    c = Class.new {
+      refine Fixnum do
+        def foo
+          "c"
+        end
+      end
+    }
+    assert_equal("c", c.class_eval { 123.foo })
+  end
+
+  def test_kernel_using_class
+    c = Class.new
+    assert_raise(TypeError) do
+      using c
+    end
+  end
+
+  def test_module_using_class
+    c = Class.new
+    m = Module.new
+    assert_raise(TypeError) do
+      m.module_eval do
+        using c
+      end
+    end
+  end
 end

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

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