Revision
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

Diff

Modified: MacRuby/trunk/objc.m (641 => 642)


--- 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 (641 => 642)


--- 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