Revision: 526 http://trac.macosforge.org/projects/ruby/changeset/526 Author: lsansonetti@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 } }
participants (1)
-
source_changes@macosforge.org