Revision: 4409 http://trac.macosforge.org/projects/ruby/changeset/4409 Author: lsansonetti@apple.com Date: 2010-08-05 17:40:08 -0700 (Thu, 05 Aug 2010) Log Message: ----------- honor bridgesupport metadata when calculating the default objc signature of a new method Modified Paths: -------------- MacRuby/trunk/objc.h MacRuby/trunk/objc.m MacRuby/trunk/vm.cpp Modified: MacRuby/trunk/objc.h =================================================================== --- MacRuby/trunk/objc.h 2010-08-05 20:30:53 UTC (rev 4408) +++ MacRuby/trunk/objc.h 2010-08-06 00:40:08 UTC (rev 4409) @@ -15,6 +15,26 @@ #include "bs.h" +static inline const char * +rb_get_bs_method_type(bs_element_method_t *bs_method, int arg) +{ + if (bs_method != NULL) { + if (arg == -1) { + if (bs_method->retval != NULL) { + return bs_method->retval->type; + } + } + else { + for (unsigned int i = 0; i < bs_method->args_count; i++) { + if (bs_method->args[i].index == arg) { + return bs_method->args[i].type; + } + } + } + } + return NULL; +} + bool rb_objc_get_types(VALUE recv, Class klass, SEL sel, Method m, bs_element_method_t *bs_method, char *buf, size_t buflen); Modified: MacRuby/trunk/objc.m =================================================================== --- MacRuby/trunk/objc.m 2010-08-05 20:30:53 UTC (rev 4408) +++ MacRuby/trunk/objc.m 2010-08-06 00:40:08 UTC (rev 4409) @@ -26,27 +26,6 @@ # include "bs.h" #endif -static inline const char * -rb_get_bs_method_type(bs_element_method_t *bs_method, int arg) -{ - if (bs_method != NULL) { - if (arg == -1) { - if (bs_method->retval != NULL) { - return bs_method->retval->type; - } - } - else { - int i; - for (i = 0; i < bs_method->args_count; i++) { - if (bs_method->args[i].index == arg) { - return bs_method->args[i].type; - } - } - } - } - return NULL; -} - bool rb_objc_get_types(VALUE recv, Class klass, SEL sel, Method method, bs_element_method_t *bs_method, char *buf, size_t buflen) Modified: MacRuby/trunk/vm.cpp =================================================================== --- MacRuby/trunk/vm.cpp 2010-08-05 20:30:53 UTC (rev 4408) +++ MacRuby/trunk/vm.cpp 2010-08-06 00:40:08 UTC (rev 4409) @@ -1664,6 +1664,16 @@ #endif } +static const char * +get_bs_method_type(bs_element_method_t *bs_method, int idx) +{ + const char *type = rb_get_bs_method_type(bs_method, idx); + if (type == NULL) { + type = "@"; + } + return type; +} + static void resolve_method_type(char *buf, const size_t buflen, Class klass, Method m, SEL sel, const unsigned int types_count) @@ -1716,6 +1726,19 @@ else if (kvo_sel(klass, selname, selsize, "get", ":range:")) { } #endif + else if (bs_method != NULL) { + buf[0] = '\0'; + + // retval, self and sel. + strlcat(buf, get_bs_method_type(bs_method, -1), buflen); + strlcat(buf, "@", buflen); + strlcat(buf, ":", buflen); + + // Arguments. + for (unsigned int i = 3; i < types_count; i++) { + strlcat(buf, get_bs_method_type(bs_method, i - 3), buflen); + } + } else { assert(types_count < buflen);