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/