[macruby-changes] [526] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 29 23:58:37 PDT 2008


Revision: 526
          http://trac.macosforge.org/projects/ruby/changeset/526
Author:   lsansonetti at apple.com
Date:     2008-08-29 23:58:37 -0700 (Fri, 29 Aug 2008)
Log Message:
-----------
fix for #40

Modified Paths:
--------------
    MacRuby/trunk/objc.h
    MacRuby/trunk/objc.m
    MacRuby/trunk/vm_method.c

Modified: MacRuby/trunk/objc.h
===================================================================
--- MacRuby/trunk/objc.h	2008-08-30 05:13:53 UTC (rev 525)
+++ MacRuby/trunk/objc.h	2008-08-30 06:58:37 UTC (rev 526)
@@ -16,6 +16,8 @@
 	struct rb_objc_method_sig *sig, bs_element_method_t *bs_method, int argc, 
 	VALUE *argv);
 
+void rb_objc_define_kvo_setter(VALUE klass, ID mid);
+
 static inline void
 rb_objc_install_method(Class klass, SEL sel, IMP imp)
 {

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2008-08-30 05:13:53 UTC (rev 525)
+++ MacRuby/trunk/objc.m	2008-08-30 06:58:37 UTC (rev 526)
@@ -2778,7 +2778,7 @@
 }
 
 static void
-rb_objc_ib_outlet_imp(void *recv, SEL sel, void *value)
+rb_objc_kvo_setter_imp(void *recv, SEL sel, void *value)
 {
     const char *selname;
     char buf[128];
@@ -2790,38 +2790,44 @@
     s = strlcpy(&buf[2], &selname[4], sizeof buf - 2);
     buf[s + 1] = '\0';
 
-    rb_ivar_set((VALUE)recv, rb_intern(buf), value == NULL ? Qnil : (VALUE)value);
+    rb_ivar_set((VALUE)recv, rb_intern(buf), value == NULL ? Qnil : OC2RB(value));
 }
 
+void
+rb_objc_define_kvo_setter(VALUE klass, ID mid)
+{
+    char buf[100];
+    const char *mid_name;
+
+    buf[0] = 's'; buf[1] = 'e'; buf[2] = 't';
+    mid_name = rb_id2name(mid);
+
+    buf[3] = toupper(mid_name[0]);
+    buf[4] = '\0';
+    strlcat(buf, &mid_name[1], sizeof buf);
+    strlcat(buf, ":", sizeof buf);
+
+    if (!class_addMethod((Class)klass, sel_registerName(buf), 
+			 (IMP)rb_objc_kvo_setter_imp, "v@:@")) {
+	rb_warn("can't register `%s' as an KVO setter (method `%s')",
+		mid_name, buf);
+    }
+}
+
 VALUE
 rb_mod_objc_ib_outlet(int argc, VALUE *argv, VALUE recv)
 {
     int i;
-    char buf[100];
 
-    buf[0] = 's'; buf[1] = 'e'; buf[2] = 't';
+    rb_warn("ib_outlet has been deprecated, please use attr_writer instead");
 
     for (i = 0; i < argc; i++) {
 	VALUE sym = argv[i];
-	const char *symname;
 	
 	Check_Type(sym, T_SYMBOL);
-	symname = rb_sym2name(sym);
+	rb_objc_define_kvo_setter(recv, SYM2ID(sym));
+    }
 
-	if (strlen(symname) == 0)
-	    rb_raise(rb_eArgError, "empty symbol given");
-	
-	buf[3] = toupper(symname[0]);
-	buf[4] = '\0';
-	strlcat(buf, &symname[1], sizeof buf);
-	strlcat(buf, ":", sizeof buf);
-
-	if (!class_addMethod((Class)recv, sel_registerName(buf), 
-			     (IMP)rb_objc_ib_outlet_imp, "v@:@"))
-	    rb_raise(rb_eArgError, 
-		     "can't register `%s' (method %s) as an IB outlet",
-		     symname, buf);
-    }
     return recv;
 }
 

Modified: MacRuby/trunk/vm_method.c
===================================================================
--- MacRuby/trunk/vm_method.c	2008-08-30 05:13:53 UTC (rev 525)
+++ MacRuby/trunk/vm_method.c	2008-08-30 06:58:37 UTC (rev 526)
@@ -549,6 +549,9 @@
     }
     if (write) {
 	rb_add_method(klass, rb_id_attrset(id), NEW_ATTRSET(attriv), noex);
+#if WITH_OBJC
+	rb_objc_define_kvo_setter(klass, id);
+#endif
     }
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080829/cdd1b9d4/attachment-0001.html 


More information about the macruby-changes mailing list