[macruby-changes] [642] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 30 12:27:56 PDT 2008


Revision: 642
          http://trac.macosforge.org/projects/ruby/changeset/642
Author:   lsansonetti at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080930/79c53c12/attachment.html 


More information about the macruby-changes mailing list