[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