From 684aa1f98590ca97eab22ceecfea04c5cb5134bf Mon Sep 17 00:00:00 2001 From: shugo Date: Tue, 13 Nov 2012 09:05:18 +0000 Subject: * 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 --- eval.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 0f1d3d97d0..b90616d8e3 100644 --- a/eval.c +++ b/eval.c @@ -1135,6 +1135,26 @@ rb_using_module(NODE *cref, VALUE module) 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: * using(module) -> self @@ -1150,6 +1170,7 @@ rb_mod_using(VALUE self, VALUE module) VALUE using_modules; Check_Type(module, T_MODULE); + check_cyclic_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)) { -- cgit v1.2.3