* object.c (rb_mod_to_s): Module#{to_s,inspect}, when invoked on
a refinement, returns a string in the format #<refinement:C@M>, where C is a refined class and M is a module at which the refinemet is defined. * eval.c (rb_mod_refine): store information on a refinement for the above change. * test/ruby/test_refinement.rb: related test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37424 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a8b3d67e7c
commit
b14e2b4401
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
Fri Nov 2 17:52:12 2012 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* object.c (rb_mod_to_s): Module#{to_s,inspect}, when invoked on
|
||||||
|
a refinement, returns a string in the format #<refinement:C@M>,
|
||||||
|
where C is a refined class and M is a module at which the refinemet
|
||||||
|
is defined.
|
||||||
|
|
||||||
|
* eval.c (rb_mod_refine): store information on a refinement for the
|
||||||
|
above change.
|
||||||
|
|
||||||
|
* test/ruby/test_refinement.rb: related test.
|
||||||
|
|
||||||
Fri Nov 2 16:57:52 2012 Shota Fukumori <sorah@tubusu.net>
|
Fri Nov 2 16:57:52 2012 Shota Fukumori <sorah@tubusu.net>
|
||||||
|
|
||||||
* vm_dump.c (rb_vm_bugreport): Because of many log directories,
|
* vm_dump.c (rb_vm_bugreport): Because of many log directories,
|
||||||
|
4
eval.c
4
eval.c
@ -1218,7 +1218,7 @@ rb_mod_refine(VALUE module, VALUE klass)
|
|||||||
{
|
{
|
||||||
NODE *cref = rb_vm_cref();
|
NODE *cref = rb_vm_cref();
|
||||||
VALUE mod;
|
VALUE mod;
|
||||||
ID id_refinements, id_refined_class;
|
ID id_refinements, id_refined_class, id_defined_at;
|
||||||
VALUE refinements;
|
VALUE refinements;
|
||||||
|
|
||||||
if (!rb_block_given_p()) {
|
if (!rb_block_given_p()) {
|
||||||
@ -1236,6 +1236,8 @@ rb_mod_refine(VALUE module, VALUE klass)
|
|||||||
mod = rb_module_new();
|
mod = rb_module_new();
|
||||||
CONST_ID(id_refined_class, "__refined_class__");
|
CONST_ID(id_refined_class, "__refined_class__");
|
||||||
rb_ivar_set(mod, id_refined_class, klass);
|
rb_ivar_set(mod, id_refined_class, klass);
|
||||||
|
CONST_ID(id_defined_at, "__defined_at__");
|
||||||
|
rb_ivar_set(mod, id_defined_at, module);
|
||||||
rb_define_singleton_method(mod, "method_added",
|
rb_define_singleton_method(mod, "method_added",
|
||||||
refinement_module_method_added, 1);
|
refinement_module_method_added, 1);
|
||||||
rb_define_singleton_method(mod, "include",
|
rb_define_singleton_method(mod, "include",
|
||||||
|
16
object.c
16
object.c
@ -1336,6 +1336,9 @@ rb_obj_cmp(VALUE obj1, VALUE obj2)
|
|||||||
static VALUE
|
static VALUE
|
||||||
rb_mod_to_s(VALUE klass)
|
rb_mod_to_s(VALUE klass)
|
||||||
{
|
{
|
||||||
|
ID id_refined_class, id_defined_at;
|
||||||
|
VALUE refined_class, defined_at;
|
||||||
|
|
||||||
if (FL_TEST(klass, FL_SINGLETON)) {
|
if (FL_TEST(klass, FL_SINGLETON)) {
|
||||||
VALUE s = rb_usascii_str_new2("#<");
|
VALUE s = rb_usascii_str_new2("#<");
|
||||||
VALUE v = rb_iv_get(klass, "__attached__");
|
VALUE v = rb_iv_get(klass, "__attached__");
|
||||||
@ -1353,6 +1356,19 @@ rb_mod_to_s(VALUE klass)
|
|||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
CONST_ID(id_refined_class, "__refined_class__");
|
||||||
|
refined_class = rb_attr_get(klass, id_refined_class);
|
||||||
|
if (!NIL_P(refined_class)) {
|
||||||
|
VALUE s = rb_usascii_str_new2("#<refinement:");
|
||||||
|
|
||||||
|
rb_str_concat(s, rb_inspect(refined_class));
|
||||||
|
rb_str_cat2(s, "@");
|
||||||
|
CONST_ID(id_defined_at, "__defined_at__");
|
||||||
|
defined_at = rb_attr_get(klass, id_defined_at);
|
||||||
|
rb_str_concat(s, rb_inspect(defined_at));
|
||||||
|
rb_str_cat2(s, ">");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
return rb_str_dup(rb_class_name(klass));
|
return rb_str_dup(rb_class_name(klass));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -622,4 +622,28 @@ class TestRefinement < Test::Unit::TestCase
|
|||||||
def test_symbol_to_proc
|
def test_symbol_to_proc
|
||||||
assert_equal("foo", SymbolToProc::M.call_foo)
|
assert_equal("foo", SymbolToProc::M.call_foo)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module Inspect
|
||||||
|
module M
|
||||||
|
refine Fixnum do
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_inspect
|
||||||
|
assert_equal("#<refinement:Fixnum@TestRefinement::Inspect::M>",
|
||||||
|
Inspect::M.refinements[Fixnum].inspect)
|
||||||
|
|
||||||
|
c = Class.new
|
||||||
|
m = Module.new {
|
||||||
|
refine String do
|
||||||
|
end
|
||||||
|
refine c do
|
||||||
|
end
|
||||||
|
}
|
||||||
|
assert_equal("#<refinement:String@#{m.inspect}>",
|
||||||
|
m.refinements[String].inspect)
|
||||||
|
assert_equal("#<refinement:#{c.inspect}@#{m.inspect}>",
|
||||||
|
m.refinements[c].inspect)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user