[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