1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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
This commit is contained in:
nobu 2015-01-19 14:09:20 +00:00
parent 97d71ce8f0
commit 0fb2cd458b
3 changed files with 20 additions and 8 deletions

20
class.c
View file

@ -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);
}
/**

View file

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

View file

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