[macruby-changes] [124] MacRuby/trunk/array.c
source_changes at macosforge.org
source_changes at macosforge.org
Mon Mar 31 12:27:01 PDT 2008
Revision: 124
http://trac.macosforge.org/projects/ruby/changeset/124
Author: lsansonetti at apple.com
Date: 2008-03-31 12:26:59 -0700 (Mon, 31 Mar 2008)
Log Message:
-----------
fixing more regressions, most of test_array.rb is now passing
Modified Paths:
--------------
MacRuby/trunk/array.c
Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c 2008-03-29 19:03:13 UTC (rev 123)
+++ MacRuby/trunk/array.c 2008-03-31 19:26:59 UTC (rev 124)
@@ -1268,15 +1268,18 @@
CFRangeMake(0, rlen));
}
else {
+ const void **values;
if (rlen > 0) {
- const void **values;
values = (void *)alloca(sizeof(void *) * rlen);
CFArrayGetValues((CFArrayRef)rpl, CFRangeMake(0, rlen), values);
- CFArrayReplaceValues((CFMutableArrayRef)ary,
- CFRangeMake(beg, len),
- values,
- rlen);
}
+ else {
+ values = NULL;
+ }
+ CFArrayReplaceValues((CFMutableArrayRef)ary,
+ CFRangeMake(beg, len),
+ values,
+ rlen);
}
#else
if (beg >= RARRAY_LEN(ary)) {
@@ -1682,10 +1685,18 @@
* the receiver to an Array object.
*/
+#if WITH_OBJC
+static bool rb_objc_ary_is_pure(VALUE ary);
+#endif
+
static VALUE
rb_ary_to_a(VALUE ary)
{
+#if WITH_OBJC
+ if (!rb_objc_ary_is_pure(ary)) {
+#else
if (rb_obj_class(ary) != rb_cArray) {
+#endif
VALUE dup = rb_ary_new2(RARRAY_LEN(ary));
rb_ary_replace(dup, ary);
return dup;
@@ -2209,19 +2220,19 @@
static VALUE
rb_ary_reject_bang(VALUE ary)
{
- long n, i1, i2;
+ long orign, n, i1, i2;
RETURN_ENUMERATOR(ary, 0, 0);
rb_ary_modify(ary);
- n = RARRAY_LEN(ary);
+ orign = n = RARRAY_LEN(ary);
for (i1 = i2 = 0; i1 < n; i1++) {
VALUE v = RARRAY_AT(ary, i1);
#if WITH_OBJC
if (!RTEST(rb_yield(v))) {
- i2++;
continue;
}
CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, i1);
+ n--;
i1--;
#else
if (RTEST(rb_yield(v))) continue;
@@ -2232,8 +2243,11 @@
#endif
}
+#if WITH_OBJC
+ if (n == orign)
+ return Qnil;
+#else
if (n == i2) return Qnil;
-#if !WITH_OBJC
if (i2 < RARRAY_LEN(ary))
RARRAY(ary)->len = i2;
#endif
@@ -2541,14 +2555,16 @@
for (i=beg; i<end; i++) {
v = rb_yield(LONG2NUM(i));
+#if !WITH_OBJC
if (i>=RARRAY_LEN(ary)) break;
+#endif
rb_ary_store(ary, i, v);
}
}
else {
#if WITH_OBJC
long i;
- for (i=beg; i<len; i++) {
+ for (i=beg; i<end; i++) {
rb_ary_store(ary, i, item);
}
#else
@@ -2655,7 +2671,7 @@
#if WITH_OBJC
ary2 = ary_new(rb_obj_class(ary), 0);
for (i = 0; i < len; i++) {
- CFArrayAppendArray((CFMutableArrayRef)ary,
+ CFArrayAppendArray((CFMutableArrayRef)ary2,
(CFArrayRef)ary,
CFRangeMake(0, n));
}
@@ -3096,10 +3112,11 @@
{
#if WITH_OBJC
long i, n;
+ bool changed;
rb_ary_modify(ary);
n = RARRAY_LEN(ary);
- for (i = 0; i < n; i++) {
+ for (i = 0, changed = false; i < n; i++) {
VALUE e;
long idx;
CFRange r;
@@ -3111,8 +3128,11 @@
CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, idx);
r.location = idx;
r.length = --n - idx;
+ changed = true;
}
}
+ if (!changed)
+ return Qnil;
#else
VALUE hash, v, vv;
long i, j;
@@ -3262,8 +3282,9 @@
}
else {
#if WITH_OBJC
- n = CFArrayGetCountOfValue((CFArrayRef)ary,
- CFRangeMake(0, RARRAY_LEN(ary)), (const void *)Qnil);
+ long total = RARRAY_LEN(ary);
+ n = total - CFArrayGetCountOfValue((CFArrayRef)ary,
+ CFRangeMake(0, total), (const void *)Qnil);
#else
VALUE *p = RARRAY_PTR(ary);
VALUE *pend = p + RARRAY_LEN(ary);
@@ -3767,15 +3788,25 @@
#if WITH_OBJC
static Class __nscfarray = NULL;
+
+#define NSCFARRAY() \
+ (__nscfarray == NULL \
+ ? __nscfarray = (Class)objc_getClass("NSCFArray") \
+ : __nscfarray)
+
#define PREPARE_RCV(x) \
Class old = *(Class *)x; \
- if (__nscfarray == NULL) \
- __nscfarray = (Class)objc_getClass("NSCFArray"); \
- *(Class *)x = __nscfarray;
+ *(Class *)x = NSCFARRAY();
#define RESTORE_RCV(x) \
*(Class *)x = old;
+static bool
+rb_objc_ary_is_pure(VALUE ary)
+{
+ return *(Class *)ary == NSCFARRAY();
+}
+
static CFIndex
imp_rb_array_count(void *rcv, SEL sel)
{
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080331/abd1f1d6/attachment.html
More information about the macruby-changes
mailing list