ruby-changes:37254
From: nobu <ko1@a...>
Date: Mon, 19 Jan 2015 23:09:37 +0900 (JST)
Subject: [ruby-changes:37254] nobu:r49335 (trunk): class.c: add callback argument
nobu 2015-01-19 23:09:20 +0900 (Mon, 19 Jan 2015) New Revision: 49335 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49335 Log: class.c: add callback argument * class.c (rb_class_foreach_subclass): add argument for callback function. Modified files: trunk/class.c trunk/internal.h trunk/vm_method.c Index: vm_method.c =================================================================== --- vm_method.c (revision 49334) +++ vm_method.c (revision 49335) @@ -61,10 +61,10 @@ static struct { https://github.com/ruby/ruby/blob/trunk/vm_method.c#L61 /* 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 kla https://github.com/ruby/ruby/blob/trunk/vm_method.c#L95 INC_GLOBAL_METHOD_STATE(); } else { - rb_class_clear_method_cache(klass); + rb_class_clear_method_cache(klass, Qnil); } } } Index: class.c =================================================================== --- class.c (revision 49334) +++ class.c (revision 49335) @@ -110,7 +110,7 @@ rb_class_remove_from_module_subclasses(V https://github.com/ruby/ruby/blob/trunk/class.c#L110 } 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, v https://github.com/ruby/ruby/blob/trunk/class.c#L119 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); } /** Index: internal.h =================================================================== --- internal.h (revision 49334) +++ internal.h (revision 49335) @@ -542,7 +542,7 @@ VALUE rb_integer_float_cmp(VALUE x, VALU https://github.com/ruby/ruby/blob/trunk/internal.h#L542 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); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/