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:
parent
97d71ce8f0
commit
0fb2cd458b
3 changed files with 20 additions and 8 deletions
20
class.c
20
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue