Revision: 2942 http://trac.macosforge.org/projects/ruby/changeset/2942 Author: lsansonetti@apple.com Date: 2009-11-02 18:07:11 -0800 (Mon, 02 Nov 2009) Log Message: ----------- when changing the visibility of a method that is included in classes, make sure the new flags are recursively applied Modified Paths: -------------- MacRuby/trunk/vm.cpp MacRuby/trunk/vm.h MacRuby/trunk/vm_method.c Modified: MacRuby/trunk/vm.cpp =================================================================== --- MacRuby/trunk/vm.cpp 2009-11-03 01:22:54 UTC (rev 2941) +++ MacRuby/trunk/vm.cpp 2009-11-03 02:07:11 UTC (rev 2942) @@ -2188,7 +2188,7 @@ static rb_vm_method_node_t * __rb_vm_define_method(Class klass, SEL sel, IMP objc_imp, IMP ruby_imp, - const rb_vm_arity_t &arity, int flags, bool direct) + const rb_vm_arity_t &arity, int flags, bool direct) { assert(klass != NULL); @@ -2251,13 +2251,16 @@ extern "C" rb_vm_method_node_t * rb_vm_define_method2(Class klass, SEL sel, rb_vm_method_node_t *node, - bool direct) + long flags, bool direct) { assert(node != NULL); - long flags = node->flags; - flags &= ~VM_METHOD_PRIVATE; - flags &= ~VM_METHOD_PROTECTED; + + if (flags == -1) { + flags = node->flags; + flags &= ~VM_METHOD_PRIVATE; + flags &= ~VM_METHOD_PROTECTED; + } return __rb_vm_define_method(klass, sel, node->objc_imp, node->ruby_imp, node->arity, flags, direct); Modified: MacRuby/trunk/vm.h =================================================================== --- MacRuby/trunk/vm.h 2009-11-03 01:22:54 UTC (rev 2941) +++ MacRuby/trunk/vm.h 2009-11-03 02:07:11 UTC (rev 2942) @@ -279,7 +279,7 @@ rb_vm_method_node_t *rb_vm_define_method(Class klass, SEL sel, IMP imp, NODE *node, bool direct); rb_vm_method_node_t *rb_vm_define_method2(Class klass, SEL sel, - rb_vm_method_node_t *node, bool direct); + rb_vm_method_node_t *node, long flags, bool direct); void rb_vm_define_method3(Class klass, SEL sel, rb_vm_block_t *node); bool rb_vm_resolve_method(Class klass, SEL sel); void *rb_vm_undefined_imp(void *rcv, SEL sel); Modified: MacRuby/trunk/vm_method.c =================================================================== --- MacRuby/trunk/vm_method.c 2009-11-03 01:22:54 UTC (rev 2941) +++ MacRuby/trunk/vm_method.c 2009-11-03 02:07:11 UTC (rev 2942) @@ -224,29 +224,32 @@ sel_getName(sel)); } + long flags = 0; + switch (noex) { + case NOEX_PRIVATE: + flags |= VM_METHOD_PRIVATE; + break; + + case NOEX_PROTECTED: + flags |= VM_METHOD_PROTECTED; + break; + + default: + break; + } + VALUE sklass = RCLASS_SUPER(klass); if (sklass != 0) { Method m = class_getInstanceMethod((Class)sklass, sel); if (m != NULL && method_getImplementation(m) == node->objc_imp) { // The method actually exists on a superclass, we need to duplicate - // it to the current class then change its visibility. - node = rb_vm_define_method2((Class)klass, sel, node, false); + // it to the current class. + rb_vm_define_method2((Class)klass, sel, node, flags, false); + return; } } - switch (noex) { - case NOEX_PUBLIC: - node->flags |= 0; - break; - - case NOEX_PRIVATE: - node->flags |= VM_METHOD_PRIVATE; - break; - - case NOEX_PROTECTED: - node->flags |= VM_METHOD_PROTECTED; - break; - } + node->flags |= flags; } int @@ -749,7 +752,7 @@ rb_bug("undefined method `%s'; can't happen", rb_id2name(id)); } - rb_vm_define_method2(*(Class *)module, sel, node, false); + rb_vm_define_method2(*(Class *)module, sel, node, -1, false); } return module;
participants (1)
-
source_changes@macosforge.org