Revision: 642 http://trac.macosforge.org/projects/ruby/changeset/642 Author: lsansonetti@apple.com Date: 2008-09-30 12:27:55 -0700 (Tue, 30 Sep 2008) Log Message: ----------- support for writing formal protocol methods Modified Paths: -------------- MacRuby/trunk/objc.m MacRuby/trunk/test/ruby/test_objc.rb Modified: MacRuby/trunk/objc.m =================================================================== --- MacRuby/trunk/objc.m 2008-09-29 05:30:32 UTC (rev 641) +++ MacRuby/trunk/objc.m 2008-09-30 19:27:55 UTC (rev 642) @@ -2627,6 +2627,45 @@ } static void +reload_protocols(void) +{ + Protocol **prots; + unsigned int i, prots_count; + + prots = objc_copyProtocolList(&prots_count); + for (i = 0; i < prots_count; i++) { + Protocol *p; + struct objc_method_description *methods; + unsigned j, methods_count; + + p = prots[i]; + +#define REGISTER_MDESCS(t) \ + do { \ + for (j = 0; j < methods_count; j++) { \ + if (methods[j].name == sel_ignored) \ + continue; \ + st_insert(t, (st_data_t)methods[j].name, (st_data_t)methods[j].types); \ + } \ + free(methods); \ + } \ + while (0) + + methods = protocol_copyMethodDescriptionList(p, true, true, &methods_count); + REGISTER_MDESCS(bs_inf_prot_imethods); + methods = protocol_copyMethodDescriptionList(p, false, true, &methods_count); + REGISTER_MDESCS(bs_inf_prot_imethods); + methods = protocol_copyMethodDescriptionList(p, true, false, &methods_count); + REGISTER_MDESCS(bs_inf_prot_cmethods); + methods = protocol_copyMethodDescriptionList(p, false, false, &methods_count); + REGISTER_MDESCS(bs_inf_prot_cmethods); + +#undef REGISTER_MDESCS + } + free(prots); +} + +static void reload_class_constants(void) { static int class_count = 0; @@ -2750,6 +2789,7 @@ rb_objc_search_and_load_bridge_support(cstr); reload_class_constants(); + reload_protocols(); return Qtrue; } Modified: MacRuby/trunk/test/ruby/test_objc.rb =================================================================== --- MacRuby/trunk/test/ruby/test_objc.rb 2008-09-29 05:30:32 UTC (rev 641) +++ MacRuby/trunk/test/ruby/test_objc.rb 2008-09-30 19:27:55 UTC (rev 642) @@ -411,5 +411,15 @@ assert_equal(Module, Kernel.class) assert_equal(Class, Class.new.class) assert_equal(Module, Module.new.class) - end + end + + def test_protocol + o = Object.new + # TODO object should automatically conform to protocol when all mandatory methods are implemented. + #assert(!o.conformsToProtocol(Protocol.protocolWithName('NSMutableCopying'))) + def o.mutableCopyWithZone(zone); self; end + #assert(o.conformsToProtocol(Protocol.protocolWithName('NSMutableCopying'))) + assert_equal(o, o.mutableCopy) + assert_equal('^{_NSZone=}', o.methodSignatureForSelector('mutableCopyWithZone:').getArgumentTypeAtIndex(2)) + end end