summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}
}
}