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); } } }