ruby-changes:25066
From: shugo <ko1@a...>
Date: Mon, 8 Oct 2012 23:56:20 +0900 (JST)
Subject: [ruby-changes:25066] shugo:r37118 (trunk): * eval.c (rb_mod_refinements): new method Module#refinements.
shugo 2012-10-08 23:56:08 +0900 (Mon, 08 Oct 2012) New Revision: 37118 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37118 Log: * eval.c (rb_mod_refinements): new method Module#refinements. * 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 Index: ChangeLog =================================================================== --- ChangeLog (revision 37117) +++ ChangeLog (revision 37118) @@ -1,3 +1,9 @@ +Mon Oct 8 23:55:41 2012 Shugo Maeda <shugo@r...> + + * eval.c (rb_mod_refinements): new method Module#refinements. + + * test/ruby/test_refinement.rb: add new tests for the above changes. + Mon Oct 8 23:02:19 2012 Shugo Maeda <shugo@r...> * eval.c, gc.c, iseq.c, node.h, vm_insnhelper.c, vm_insnhelper.h, Index: eval.c =================================================================== --- eval.c (revision 37117) +++ eval.c (revision 37118) @@ -1226,6 +1226,37 @@ return mod; } +static int +refinements_i(VALUE key, VALUE value, VALUE arg) +{ + rb_hash_aset(arg, key, value); + return ST_CONTINUE; +} + +/* + * call-seq: + * refinements -> hash + * + * Returns refinements in the receiver as a hash table, whose key is a + * refined class and whose value is a refinement module. + */ + +static VALUE +rb_mod_refinements(VALUE module) +{ + ID id_refinements; + VALUE refinements, result; + + CONST_ID(id_refinements, "__refinements__"); + refinements = rb_attr_get(module, id_refinements); + if (NIL_P(refinements)) { + return rb_hash_new(); + } + result = rb_hash_new(); + rb_hash_foreach(refinements, refinements_i, result); + return result; +} + void rb_obj_call_init(VALUE obj, int argc, VALUE *argv) { @@ -1524,6 +1555,7 @@ rb_define_private_method(rb_cModule, "prepend", rb_mod_prepend, -1); rb_define_private_method(rb_cModule, "using", rb_mod_using, 1); rb_define_private_method(rb_cModule, "refine", rb_mod_refine, 1); + rb_define_method(rb_cModule, "refinements", rb_mod_refinements, 0); rb_undef_method(rb_cClass, "module_function"); Index: test/ruby/test_refinement.rb =================================================================== --- test/ruby/test_refinement.rb (revision 37117) +++ test/ruby/test_refinement.rb (revision 37118) @@ -455,4 +455,69 @@ end end end + + def test_refinements_empty + m = Module.new + assert(m.refinements.empty?) + end + + def test_refinements_one + c = Class.new + c_ext = nil + m = Module.new { + refine c do + c_ext = self + end + } + assert_equal({c => c_ext}, m.refinements) + end + + def test_refinements_two + c1 = Class.new + c1_ext = nil + c2 = Class.new + c2_ext = nil + m = Module.new { + refine c1 do + c1_ext = self + end + + refine c2 do + c2_ext = self + end + } + assert_equal({c1 => c1_ext, c2 => c2_ext}, m.refinements) + end + + def test_refinements_duplicate_refine + c = Class.new + c_ext = nil + m = Module.new { + refine c do + c_ext = self + end + refine c do + end + } + assert_equal({c => c_ext}, m.refinements) + end + + def test_refinements_no_recursion + c1 = Class.new + c1_ext = nil + m1 = Module.new { + refine c1 do + c1_ext = self + end + } + c2 = Class.new + c2_ext = nil + m2 = Module.new { + using m1 + refine c2 do + c2_ext = self + end + } + assert_equal({c2 => c2_ext}, m2.refinements) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/