Revision
130
Author
lsansonetti@apple.com
Date
2008-04-04 13:59:58 -0700 (Fri, 04 Apr 2008)

Log Message

faster Array#index

Modified Paths

Diff

Modified: MacRuby/trunk/array.c (129 => 130)


--- MacRuby/trunk/array.c	2008-04-02 00:47:10 UTC (rev 129)
+++ MacRuby/trunk/array.c	2008-04-04 20:59:58 UTC (rev 130)
@@ -1184,21 +1184,30 @@
 rb_ary_index(int argc, VALUE *argv, VALUE ary)
 {
     VALUE val;
-    long i;
+    long n, i;
 
+    n = RARRAY_LEN(ary);
     if (rb_scan_args(argc, argv, "01", &val) == 0) {
 	RETURN_ENUMERATOR(ary, 0, 0);
-	for (i=0; i<RARRAY_LEN(ary); i++) {
+	for (i=0; i<n; i++) {
 	    if (RTEST(rb_yield(RARRAY_AT(ary, i)))) {
 		return LONG2NUM(i);
 	    }
 	}
     }
     else {
-	for (i=0; i<RARRAY_LEN(ary); i++) {
+#if WITH_OBJC
+	CFIndex idx;
+	idx = CFArrayGetFirstIndexOfValue((CFArrayRef)ary, CFRangeMake(0, n), 
+	    (const void *)val);
+	if (idx != -1)
+	    return LONG2NUM(idx);
+#else
+	for (i=0; i<n; i++) {
 	    if (rb_equal(RARRAY_AT(ary, i), val))
 		return LONG2NUM(i);
 	}
+#endif
     }
     return Qnil;
 }