summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-01 05:45:28 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-01 05:45:28 +0000
commit7a58c65a8931dab792ac40ae7227ff82b1610178 (patch)
tree867dcfca48315e1cddfd8304fade5f38fc2b8206 /eval.c
parent94d10fbb14743acfa4ef067522d19bf7246236c5 (diff)
* eval.c (rb_using_module): using should be used indirectly.
[ruby-dev:46326] [Feature #7251] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index c1d22d66fa..9430e2bc67 100644
--- a/eval.c
+++ b/eval.c
@@ -1090,8 +1090,19 @@ rb_using_refinement(NODE *cref, VALUE klass, VALUE module)
rb_clear_cache_by_class(klass);
}
+void rb_using_module(NODE *cref, VALUE module);
+
static int
-using_module_i(VALUE klass, VALUE module, VALUE arg)
+using_module_i(VALUE module, VALUE val, VALUE arg)
+{
+ NODE *cref = (NODE *) arg;
+
+ rb_using_module(cref, module);
+ return ST_CONTINUE;
+}
+
+static int
+using_refinement(VALUE klass, VALUE module, VALUE arg)
{
NODE *cref = (NODE *) arg;
@@ -1104,12 +1115,19 @@ rb_using_module(NODE *cref, VALUE module)
{
ID id_refinements;
VALUE refinements;
+ ID id_using_modules;
+ VALUE using_modules;
check_class_or_module(module);
+ CONST_ID(id_using_modules, "__using_modules__");
+ using_modules = rb_attr_get(module, id_using_modules);
+ if (!NIL_P(using_modules)) {
+ rb_hash_foreach(using_modules, using_module_i, (VALUE) cref);
+ }
CONST_ID(id_refinements, "__refinements__");
refinements = rb_attr_get(module, id_refinements);
if (NIL_P(refinements)) return;
- rb_hash_foreach(refinements, using_module_i, (VALUE) cref);
+ rb_hash_foreach(refinements, using_refinement, (VALUE) cref);
}
/*