[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