Bug #7308 » prevent-circular-using.patch
| eval.c | ||
|---|---|---|
|
rb_hash_foreach(refinements, using_refinement, (VALUE) cref);
|
||
|
}
|
||
|
static int
|
||
|
check_circular_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_eTypeError, "circular using is not allowed");
|
||
|
}
|
||
|
using_modules = rb_attr_get(mod, id_using_modules);
|
||
|
if (!NIL_P(using_modules)) {
|
||
|
rb_hash_foreach(using_modules, check_circular_using, search);
|
||
|
}
|
||
|
return ST_CONTINUE;
|
||
|
}
|
||
|
/*
|
||
|
* call-seq:
|
||
|
* using(module) -> self
|
||
| ... | ... | |
|
VALUE using_modules;
|
||
|
Check_Type(module, T_MODULE);
|
||
|
check_circular_using(module, 0, self);
|
||
|
CONST_ID(id_using_modules, "__using_modules__");
|
||
|
using_modules = rb_attr_get(self, id_using_modules);
|
||
|
if (NIL_P(using_modules)) {
|
||
| test/ruby/test_refinement.rb | ||
|---|---|---|
|
assert_equal("#<refinement:#{c.inspect}@#{m.inspect}>",
|
||
|
m.refinements[c].inspect)
|
||
|
end
|
||
|
def test_circular_using_is_not_allowed
|
||
|
a = Module.new
|
||
|
b = Module.new
|
||
|
assert_raise TypeError do
|
||
|
a.module_eval do
|
||
|
using a
|
||
|
end
|
||
|
end
|
||
|
b.module_eval do
|
||
|
using a
|
||
|
end
|
||
|
assert_raise TypeError do
|
||
|
a.module_eval do
|
||
|
using b
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
- « Previous
- 1
- 2
- Next »