[macruby-changes] [524] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 29 21:26:04 PDT 2008


Revision: 524
          http://trac.macosforge.org/projects/ruby/changeset/524
Author:   lsansonetti at apple.com
Date:     2008-08-29 21:26:04 -0700 (Fri, 29 Aug 2008)
Log Message:
-----------
fix for #113

Modified Paths:
--------------
    MacRuby/trunk/objc.m
    MacRuby/trunk/test/ruby/test_objc.rb

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2008-08-30 02:49:58 UTC (rev 523)
+++ MacRuby/trunk/objc.m	2008-08-30 04:26:04 UTC (rev 524)
@@ -630,12 +630,17 @@
     else {
 	void *data;
 
-	Data_Get_Struct(rval, void, data);
-	if (data == NULL) {
+	if (rval == Qnil) {
 	    *(void **)ocval = NULL; 
 	}
 	else {
-	    memcpy(ocval, data, bs_boxed->ffi_type->size);
+	    Data_Get_Struct(rval, void, data);
+	    if (data == NULL) {
+		*(void **)ocval = NULL; 
+	    }
+	    else {
+		memcpy(ocval, data, bs_boxed->ffi_type->size);
+	    }
 	}
     }
 
@@ -3065,6 +3070,32 @@
     RUBY_VM_CHECK_INTS();
 }
 
+static IMP old_imp_isaForAutonotifying;
+
+static Class
+rb_obj_imp_isaForAutonotifying(void *rcv, SEL sel)
+{
+    Class ret;
+
+#define KVO_CHECK_DONE 0x100000
+
+    ret = ((Class (*)(void *, SEL)) old_imp_isaForAutonotifying)(rcv, sel);
+    if (ret != NULL && (RCLASS_VERSION(ret) & KVO_CHECK_DONE) == 0) {
+	const char *name = class_getName(ret);
+	if (strncmp(name, "NSKVONotifying_", 15) == 0) {
+	    Class ret_orig;
+	    name += 15;
+	    ret_orig = objc_getClass(name);
+	    if (ret_orig != NULL && RCLASS_VERSION(ret_orig) & RCLASS_IS_OBJECT_SUBCLASS) {
+		DLOG("XXX", "marking KVO generated klass %p (%s) as RObject", ret, class_getName(ret));
+		RCLASS_VERSION(ret) |= RCLASS_IS_OBJECT_SUBCLASS;
+	    }
+	}
+	RCLASS_VERSION(ret) |= KVO_CHECK_DONE;
+    }
+    return ret;
+}
+
 void
 Init_ObjC(void)
 {
@@ -3103,6 +3134,11 @@
     }
 
     rb_define_method(rb_cBasicObject, "__super_objc_send__", rb_super_objc_send, -1);
+
+    Method m = class_getInstanceMethod(objc_getClass("NSKeyValueUnnestedProperty"), sel_registerName("isaForAutonotifying"));
+    assert(m != NULL);
+    old_imp_isaForAutonotifying = method_getImplementation(m);
+    method_setImplementation(m, (IMP)rb_obj_imp_isaForAutonotifying);
 }
 
 // for debug in gdb

Modified: MacRuby/trunk/test/ruby/test_objc.rb
===================================================================
--- MacRuby/trunk/test/ruby/test_objc.rb	2008-08-30 02:49:58 UTC (rev 523)
+++ MacRuby/trunk/test/ruby/test_objc.rb	2008-08-30 04:26:04 UTC (rev 524)
@@ -65,6 +65,7 @@
 
   def setup
     framework 'Foundation'
+    framework 'AppKit'
   end
 
   def test_all_objects_inherit_from_nsobject
@@ -330,4 +331,25 @@
     d.testCallGetRectMethod(obj, expectedValue:obj.val)
   end
 
+  class Icon
+    attr_accessor :name
+    def initialize(name)
+      @name = name
+    end
+  end
+  def test_NSKVONotifying_class_preserve_ivars
+    array_controller = NSArrayController.new
+    array_controller.setAvoidsEmptySelection(false)
+    array_controller.setPreservesSelection(false)
+    array_controller.setSelectsInsertedObjects(false)
+    array_controller.setAutomaticallyRearrangesObjects(true)
+    array_controller.setSortDescriptors([NSSortDescriptor.alloc.initWithKey("name", ascending: false)])
+    array_controller.addObjects([Icon.new("Rich"), Icon.new("Chad")])
+    o = array_controller.arrangedObjects[0]
+    assert_equal(Icon, o.class)
+    assert_equal('Rich', o.name)
+    o = array_controller.arrangedObjects[1]
+    assert_equal(Icon, o.class)
+    assert_equal('Chad', o.name)
+  end
 end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080829/df308d37/attachment.html 


More information about the macruby-changes mailing list