[macruby-changes] [131] MacRuby/trunk/array.c

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 4 17:53:59 PDT 2008


Revision: 131
          http://trac.macosforge.org/projects/ruby/changeset/131
Author:   lsansonetti at apple.com
Date:     2008-04-04 17:53:57 -0700 (Fri, 04 Apr 2008)

Log Message:
-----------
faster #rindex, #uniq

Modified Paths:
--------------
    MacRuby/trunk/array.c

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2008-04-04 20:59:58 UTC (rev 130)
+++ MacRuby/trunk/array.c	2008-04-05 00:53:57 UTC (rev 131)
@@ -516,11 +516,8 @@
 	rb_raise(rb_eArgError, "negative array size");
     }
 #if WITH_OBJC
-    {
-	int i;
-	for (i = 0; i < argc; i++)
-	    rb_ary_insert(ary, i, argv[i]);
-    }
+    CFArrayReplaceValues((CFMutableArrayRef)ary, CFRangeMake(0, 0), 
+	(const void **)argv, argc);
 #else
     RARRAY(ary)->ptr = ALLOC_N(VALUE, argc);
     RARRAY(ary)->aux.capa = argc;
@@ -1246,6 +1243,12 @@
 	}
     }
     else {
+#if WITH_OBJC
+	i = CFArrayGetLastIndexOfValue((CFArrayRef)ary, CFRangeMake(0, n),
+	   (const void *)val);
+	if (i != -1)
+	    return LONG2NUM(i);
+#else
 	while (i--) {
 	    if (rb_equal(RARRAY_AT(ary, i), val))
 		return LONG2NUM(i);
@@ -1253,6 +1256,7 @@
 		i = n;
 	    }
 	}
+#endif
     }
     return Qnil;
 }
@@ -2623,6 +2627,12 @@
 	for (i=beg; i<end; i++) {
 	    rb_ary_store(ary, i, item);
 	}
+# if 0
+	const void **vals = (const void **)alloca(sizeof(void *) * (end - beg));
+	for (i=beg; i<end; i++) { vals[i] = (const void *)item; }
+	CFArrayReplaceValues((CFMutableArrayRef)ary, CFRangeMake(beg, end),
+	    vals, end);
+# endif
 #else
 	p = RARRAY_PTR(ary) + beg;
 	pend = p + len;
@@ -3167,6 +3177,7 @@
 rb_ary_uniq_bang(VALUE ary)
 {
 #if WITH_OBJC
+# if 0 
     long i, n;
     bool changed;
 
@@ -3189,6 +3200,32 @@
     }
     if (!changed)
 	return Qnil;
+# else
+    VALUE hash;
+    long i, n, n_orig;
+    bool changed;
+
+    rb_ary_modify(ary);
+    hash = ary_make_hash(ary, 0);
+    n_orig = n = RARRAY_LEN(ary);
+    if (RARRAY_LEN(ary) == RHASH_SIZE(hash))
+	return Qnil;
+    for (i = 0, changed = false; i < n; i++) {
+	VALUE e;
+
+        e = RARRAY_AT(ary, i);
+	if (CFDictionaryContainsKey((CFDictionaryRef)hash, (const void *)e)) {
+	    CFDictionaryRemoveValue((CFMutableDictionaryRef)hash,
+		(const void *)e);
+	}
+	else {
+	    CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, i);
+	    n--;
+	}
+    }
+    if (n != n_orig)
+	return Qnil;
+# endif
 #else
     VALUE hash, v, vv;
     long i, j;

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080404/93684e26/attachment.html


More information about the macruby-changes mailing list