[macruby-changes] [761] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sun Nov 30 19:13:33 PST 2008


Revision: 761
          http://trac.macosforge.org/projects/ruby/changeset/761
Author:   lsansonetti at apple.com
Date:     2008-11-30 19:13:32 -0800 (Sun, 30 Nov 2008)
Log Message:
-----------
fixing some regressions

Modified Paths:
--------------
    MacRuby/trunk/insns.def
    MacRuby/trunk/objc.m
    MacRuby/trunk/vm_insnhelper.c

Modified: MacRuby/trunk/insns.def
===================================================================
--- MacRuby/trunk/insns.def	2008-11-29 05:53:03 UTC (rev 760)
+++ MacRuby/trunk/insns.def	2008-12-01 03:13:32 UTC (rev 761)
@@ -1090,12 +1090,32 @@
 
     recv = GET_SELF();
     vm_search_superclass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass);
-    mn = rb_objc_method_node(klass, id, NULL, &sel);
 
 #if WITH_OBJC
+    static ID idNew = 0, idNew2 = 0, idNew3 = 0;
     struct rb_method_cache mcache;
     void *mcachep;
 
+    if (idNew == 0) {
+        idNew = rb_intern("new");
+        idNew2 = rb_intern("new:");
+        idNew3 = rb_intern("__new__");
+    }
+
+    /* because #new is added on every new NSObject subclasses, and if overriden
+       we should still call our implementation with super */
+    if ((id == idNew || id == idNew2) && klass == *(VALUE *)rb_cNSObject) {
+	VALUE k = CLASS_OF(recv);
+        if ((mn = rb_objc_method_node(k, idNew3, NULL, &sel)) == NULL) {
+            rb_bug("can't look up __new__ in klass `%s'\n",
+                   class_getName((Class)k));
+        }
+        klass = k;
+    }
+    else {
+	mn = rb_objc_method_node(klass, id, NULL, &sel);
+    }
+
     if (mn != NULL) {
 	mcache.flags = RB_MCACHE_RCALL_FLAG;
 	mcache.as.rcall.sel = sel;

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2008-11-29 05:53:03 UTC (rev 760)
+++ MacRuby/trunk/objc.m	2008-12-01 03:13:32 UTC (rev 761)
@@ -2780,14 +2780,14 @@
     if (!ok) {
 	rb_raise(rb_eRuntimeError, "%s", error);
     }
-#if defined(__LP64__)
-# if MAC_OS_X_VERSION_MAX_ALLOWED <= 1060
-    /* XXX work around for <rdar://problem/6399046> NSNotFound 64-bit value is incorrect
-     * XXX we should introduce the possibility to write prelude scripts per
+#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1060
+    /* XXX we should introduce the possibility to write prelude scripts per
      * frameworks where this kind of changes could be located.
      */
-    static bool nsnotfound_fixed = false;
-    if (!nsnotfound_fixed) {
+#if defined(__LP64__)
+    static bool R6399046_fixed = false;
+    /* XXX work around for <rdar://problem/6399046> NSNotFound 64-bit value is incorrect */
+    if (!R6399046_fixed) {
 	ID nsnotfound = rb_intern("NSNotFound");
 	VALUE val = 
 	    (VALUE)CFDictionaryGetValue(rb_cObject_dict, (void *)nsnotfound);
@@ -2795,11 +2795,33 @@
 	    CFDictionarySetValue(rb_cObject_dict, 
 		    (const void *)nsnotfound,
 		    (const void *)ULL2NUM(NSNotFound));
-	    nsnotfound_fixed = true;
+	    R6399046_fixed = true;
+	    DLOG("XXX", "applied work-around for rdar://problem/6399046");
 	}
     }
-# endif
 #endif
+    static bool R6401816_fixed = false;
+    /* XXX work around for <rdar://problem/6401816> -[NSObject performSelector:withObject:] has wrong sel_of_type attributes*/
+    if (!R6401816_fixed) {
+	bs_element_method_t *bs_method = 
+	    rb_bs_find_method((Class)rb_cNSObject, 
+			      @selector(performSelector:withObject:));
+	if (bs_method != NULL) {
+	    bs_element_arg_t *arg = bs_method->args;
+	    while (arg != NULL) {
+		if (arg->index == 0 
+		    && arg->sel_of_type != NULL
+		    && arg->sel_of_type[0] != '@') {
+		    arg->sel_of_type[0] = '@';
+		    R6401816_fixed = true;
+		    DLOG("XXX", "applied work-around for rdar://problem/6401816");
+		    break;
+		}
+		arg++;
+	    }
+	}	
+    }
+#endif
 }
 
 static VALUE

Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c	2008-11-29 05:53:03 UTC (rev 760)
+++ MacRuby/trunk/vm_insnhelper.c	2008-12-01 03:13:32 UTC (rev 761)
@@ -1433,7 +1433,6 @@
 static inline VALUE
 vm_search_normal_superclass(VALUE klass, VALUE recv, ID mid) 
 {
-    static ID idNew = 0, idNew2 = 0, idNew3 = 0;
     VALUE k, ary;
     int i, count;
     bool klass_located;
@@ -1477,22 +1476,6 @@
 	    (void *)recv, 
 	    class_getName((Class)k));
 
-    if (idNew == 0) {
-	idNew = rb_intern("new");
-	idNew2 = rb_intern("new:");
-	idNew3 = rb_intern("__new__");
-    }
-
-    /* because #new is added on every new NSObject subclasses, and if overriden
-       we should still call our implementation with super */ 
-    if ((mid == idNew || mid == idNew2) && k == *(VALUE *)rb_cNSObject) {
-	if (rb_objc_method_node(klass, idNew3, NULL, NULL) == NULL) {
-	    rb_bug("can't look up __new__ in klass `%s'\n", 
-		   class_getName((Class)klass));
-	}
-	k = klass;
-    }
-
     return k;
 }
 #endif
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081130/3c7109f1/attachment.html>


More information about the macruby-changes mailing list