aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-19 14:09:20 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-19 14:09:20 +0000
commit0fb2cd458b13576c837ed10b94eb8bb296e85118 (patch)
treeff42ba330d15a0808e98f7fb1fecac8d673c613a
parent97d71ce8f0802ef20dae819f3012828381b408f5 (diff)
downloadruby-0fb2cd458b13576c837ed10b94eb8bb296e85118.tar.gz
class.c: add callback argument
* class.c (rb_class_foreach_subclass): add argument for callback function. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49335 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--class.c20
-rw-r--r--internal.h2
-rw-r--r--vm_method.c6
3 files changed, 20 insertions, 8 deletions
diff --git a/class.c b/class.c
index f90b0806bf..fe6f38eebe 100644
--- a/class.c
+++ b/class.c
@@ -110,7 +110,7 @@ rb_class_remove_from_module_subclasses(VALUE klass)
}
void
-rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE))
+rb_class_foreach_subclass(VALUE klass, void (*f)(VALUE, VALUE), VALUE arg)
{
rb_subclass_entry_t *cur = RCLASS_EXT(klass)->subclasses;
@@ -119,20 +119,32 @@ rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE))
while (cur) {
VALUE curklass = cur->klass;
cur = cur->next;
- f(curklass);
+ f(curklass, arg);
}
}
+static void
+class_detach_subclasses(VALUE klass, VALUE arg)
+{
+ rb_class_remove_from_super_subclasses(klass);
+}
+
void
rb_class_detach_subclasses(VALUE klass)
{
- rb_class_foreach_subclass(klass, rb_class_remove_from_super_subclasses);
+ rb_class_foreach_subclass(klass, class_detach_subclasses, Qnil);
+}
+
+static void
+class_detach_module_subclasses(VALUE klass, VALUE arg)
+{
+ rb_class_remove_from_module_subclasses(klass);
}
void
rb_class_detach_module_subclasses(VALUE klass)
{
- rb_class_foreach_subclass(klass, rb_class_remove_from_module_subclasses);
+ rb_class_foreach_subclass(klass, class_detach_module_subclasses, Qnil);
}
/**
diff --git a/internal.h b/internal.h
index 10e85c77b8..e7880f0177 100644
--- a/internal.h
+++ b/internal.h
@@ -542,7 +542,7 @@ VALUE rb_integer_float_cmp(VALUE x, VALUE y);
VALUE rb_integer_float_eq(VALUE x, VALUE y);
/* class.c */
-void rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE));
+void rb_class_foreach_subclass(VALUE klass, void (*f)(VALUE, VALUE), VALUE);
void rb_class_detach_subclasses(VALUE);
void rb_class_detach_module_subclasses(VALUE);
void rb_class_remove_from_module_subclasses(VALUE);
diff --git a/vm_method.c b/vm_method.c
index eab12f024e..b2cff6f13d 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -61,10 +61,10 @@ static struct {
/* int ruby_running = 0; */
static void
-rb_class_clear_method_cache(VALUE klass)
+rb_class_clear_method_cache(VALUE klass, VALUE arg)
{
RCLASS_SERIAL(klass) = rb_next_class_serial();
- rb_class_foreach_subclass(klass, rb_class_clear_method_cache);
+ rb_class_foreach_subclass(klass, rb_class_clear_method_cache, arg);
}
void
@@ -95,7 +95,7 @@ rb_clear_method_cache_by_class(VALUE klass)
INC_GLOBAL_METHOD_STATE();
}
else {
- rb_class_clear_method_cache(klass);
+ rb_class_clear_method_cache(klass, Qnil);
}
}
}