[macruby-changes] [741] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Nov 14 04:54:41 PST 2008


Revision: 741
          http://trac.macosforge.org/projects/ruby/changeset/741
Author:   ben at tanjero.com
Date:     2008-11-14 04:54:38 -0800 (Fri, 14 Nov 2008)
Log Message:
-----------
Added support for subclasses of the native Set.

Modified Paths:
--------------
    MacRuby/trunk/class.c
    MacRuby/trunk/include/ruby/ruby.h
    MacRuby/trunk/set.c

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2008-11-13 18:02:13 UTC (rev 740)
+++ MacRuby/trunk/class.c	2008-11-14 12:54:38 UTC (rev 741)
@@ -25,11 +25,12 @@
 void rb_objc_install_array_primitives(Class);
 void rb_objc_install_hash_primitives(Class);
 void rb_objc_install_string_primitives(Class);
+void rb_objc_install_set_primitives(Class);
 
 bool
 rb_objc_install_primitives(Class ocklass, Class ocsuper)
 {
-    if (rb_cArray != 0 && rb_cHash != 0 && rb_cString != 0) {
+    if (rb_cArray != 0 && rb_cHash != 0 && rb_cString != 0 && rb_cSet != 0) {
 	do {
 	    if (ocsuper == (Class)rb_cArray) {
 		rb_objc_install_array_primitives(ocklass);
@@ -46,6 +47,11 @@
 		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_STRING_SUBCLASS);
 		return true;
 	    }
+	    if (ocsuper == (Class)rb_cSet) {
+		rb_objc_install_set_primitives(ocklass);
+		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_SET_SUBCLASS);
+		return true;
+	    }
 	    ocsuper = class_getSuperclass(ocsuper);
 	}
 	while (ocsuper != NULL);

Modified: MacRuby/trunk/include/ruby/ruby.h
===================================================================
--- MacRuby/trunk/include/ruby/ruby.h	2008-11-13 18:02:13 UTC (rev 740)
+++ MacRuby/trunk/include/ruby/ruby.h	2008-11-14 12:54:38 UTC (rev 741)
@@ -510,6 +510,7 @@
 # define RCLASS_IS_ARRAY_SUBCLASS     0x20000 /* class is a subclass of NSCFArray */
 # define RCLASS_IS_HASH_SUBCLASS      0x40000 /* class is a subclass of NSCFDictionary */
 # define RCLASS_IS_INCLUDED           0x80000 /* module is included */
+# define RCLASS_IS_SET_SUBCLASS       0x100000 /* class is a subclass of NSCFSet */
 # if defined(__LP64__)
 #  define RCLASS_VERSION(m) (class_getVersion((Class)m))
 #  define RCLASS_SET_VERSION(m,f) (class_setVersion((Class)m, f))
@@ -1040,6 +1041,7 @@
 RUBY_EXTERN VALUE rb_cRational;
 RUBY_EXTERN VALUE rb_cComplex;
 RUBY_EXTERN VALUE rb_cRegexp;
+RUBY_EXTERN VALUE rb_cSet;
 RUBY_EXTERN VALUE rb_cStat;
 RUBY_EXTERN VALUE rb_cString;
 RUBY_EXTERN VALUE rb_cStruct;

Modified: MacRuby/trunk/set.c
===================================================================
--- MacRuby/trunk/set.c	2008-11-13 18:02:13 UTC (rev 740)
+++ MacRuby/trunk/set.c	2008-11-14 12:54:38 UTC (rev 741)
@@ -11,6 +11,7 @@
 
 #include "ruby/ruby.h"
 #include "id.h"
+#include "objc.h"
 
 VALUE rb_cSet;
 VALUE rb_cNSSet, rb_cNSMutableSet, rb_cCFSet;
@@ -320,9 +321,83 @@
     return set;
 }
 
+#define PREPARE_RCV(x) \
+    Class old = *(Class *)x; \
+    *(Class *)x = (Class)rb_cCFSet;
+
+#define RESTORE_RCV(x) \
+    *(Class *)x = old;
+
+bool rb_objc_set_is_pure(VALUE set)
+{
+    return *(Class *)set == (Class)rb_cCFSet;
+}
+
+static CFIndex
+imp_rb_set_count(void *rcv, SEL sel)
+{
+    CFIndex count;
+    PREPARE_RCV(rcv);
+    count = CFSetGetCount((CFSetRef)rcv);
+    RESTORE_RCV(rcv);
+    return count;
+}
+
+static const void *
+imp_rb_set_member(void *rcv, SEL sel, void *obj)
+{
+    void *ret;
+    PREPARE_RCV(rcv);
+    ret = CFSetContainsValue((CFSetRef)rcv, obj) ? obj : NULL;
+    RESTORE_RCV(rcv);
+    return ret;
+}
+
+static const void *
+imp_rb_set_objectEnumerator(void *rcv, SEL sel)
+{
+    void *ret;
+    PREPARE_RCV(rcv);
+    ret = objc_msgSend(rcv, sel);
+    RESTORE_RCV(rcv);
+    return ret;
+}
+
+static void
+imp_rb_set_addOrRemoveObject(void *rcv, SEL sel, void *obj)
+{
+    PREPARE_RCV(rcv);
+    objc_msgSend(rcv, sel, obj);
+    RESTORE_RCV(rcv);
+}
+
+static unsigned long
+imp_rb_set_countByEnumeratingWithStateObjectsCount(void *rcv, SEL sel, void *state, void *objects, unsigned long count)
+{
+    unsigned long ret;
+    PREPARE_RCV(rcv);
+    ret = (unsigned long)objc_msgSend(rcv, sel, state, objects, count);
+    RESTORE_RCV(rcv);
+    return ret;
+}
+
 void
+rb_objc_install_set_primitives(Class klass)
+{
+    rb_objc_install_method2(klass, "count", (IMP)imp_rb_set_count);
+    rb_objc_install_method2(klass, "member:", (IMP)imp_rb_set_member);
+    rb_objc_install_method2(klass, "objectEnumerator", (IMP)imp_rb_set_objectEnumerator);
+    rb_objc_install_method2(klass, "addObject:", (IMP)imp_rb_set_addOrRemoveObject);
+    rb_objc_install_method2(klass, "removeObject:", (IMP)imp_rb_set_addOrRemoveObject);
+    rb_objc_install_method2(klass, "countByEnumeratingWithState:objects:count:", (IMP)imp_rb_set_countByEnumeratingWithStateObjectsCount);
+
+    rb_define_alloc_func((VALUE)klass, set_alloc);
+}
+
+void
 Init_Set(void)
 {
+    rb_cCFSet = (VALUE)objc_getClass("NSCFSet");
     rb_cSet = rb_cNSSet = (VALUE)objc_getClass("NSSet");
     rb_cNSMutableSet = (VALUE)objc_getClass("NSMutableSet");
     rb_cCFSet = (VALUE)objc_getClass("NSCFSet");
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081114/aa825c25/attachment-0001.html>


More information about the macruby-changes mailing list