[macruby-changes] [2942] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Nov 2 18:07:14 PST 2009
Revision: 2942
http://trac.macosforge.org/projects/ruby/changeset/2942
Author: lsansonetti at 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;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091102/02482893/attachment.html>
More information about the macruby-changes
mailing list