* eval.c (rb_mod_using): raise an ArgumentError if cyclic using is
detected. based on the patch by Charlie Somerville. [ruby-core:49092] Bug #7308 * test/ruby/test_refinement.rb: related test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37646 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e7659bd2fd
commit
684aa1f985
@ -1,3 +1,11 @@
|
|||||||
|
Tue Nov 13 18:01:54 2012 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_mod_using): raise an ArgumentError if cyclic using is
|
||||||
|
detected. based on the patch by Charlie Somerville.
|
||||||
|
[ruby-core:49092] Bug #7308
|
||||||
|
|
||||||
|
* test/ruby/test_refinement.rb: related test.
|
||||||
|
|
||||||
Tue Nov 13 17:40:04 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
Tue Nov 13 17:40:04 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* common.mk (vm_insnhelper.c): this target is useless and causes
|
* common.mk (vm_insnhelper.c): this target is useless and causes
|
||||||
|
21
eval.c
21
eval.c
@ -1135,6 +1135,26 @@ rb_using_module(NODE *cref, VALUE module)
|
|||||||
rb_hash_foreach(refinements, using_refinement, (VALUE) cref);
|
rb_hash_foreach(refinements, using_refinement, (VALUE) cref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_cyclic_using(VALUE mod, VALUE _, VALUE search)
|
||||||
|
{
|
||||||
|
VALUE using_modules;
|
||||||
|
ID id_using_modules;
|
||||||
|
CONST_ID(id_using_modules, "__using_modules__");
|
||||||
|
|
||||||
|
if (mod == search) {
|
||||||
|
rb_raise(rb_eArgError, "cyclic using detected");
|
||||||
|
}
|
||||||
|
|
||||||
|
using_modules = rb_attr_get(mod, id_using_modules);
|
||||||
|
if (!NIL_P(using_modules)) {
|
||||||
|
rb_hash_foreach(using_modules, check_cyclic_using, search);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ST_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* using(module) -> self
|
* using(module) -> self
|
||||||
@ -1150,6 +1170,7 @@ rb_mod_using(VALUE self, VALUE module)
|
|||||||
VALUE using_modules;
|
VALUE using_modules;
|
||||||
|
|
||||||
Check_Type(module, T_MODULE);
|
Check_Type(module, T_MODULE);
|
||||||
|
check_cyclic_using(module, 0, self);
|
||||||
CONST_ID(id_using_modules, "__using_modules__");
|
CONST_ID(id_using_modules, "__using_modules__");
|
||||||
using_modules = rb_attr_get(self, id_using_modules);
|
using_modules = rb_attr_get(self, id_using_modules);
|
||||||
if (NIL_P(using_modules)) {
|
if (NIL_P(using_modules)) {
|
||||||
|
@ -801,4 +801,25 @@ class TestRefinement < Test::Unit::TestCase
|
|||||||
p c.foo
|
p c.foo
|
||||||
INPUT
|
INPUT
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_circular_using_is_not_allowed
|
||||||
|
a = Module.new
|
||||||
|
b = Module.new
|
||||||
|
|
||||||
|
assert_raise ArgumentError do
|
||||||
|
a.module_eval do
|
||||||
|
using a
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
b.module_eval do
|
||||||
|
using a
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_raise ArgumentError do
|
||||||
|
a.module_eval do
|
||||||
|
using b
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user