Revision
4494
Author
lsansonetti@apple.com
Date
2010-09-03 18:55:20 -0700 (Fri, 03 Sep 2010)

Log Message

Range#each: make sure break works in all cases

Modified Paths

Diff

Modified: MacRuby/trunk/range.c (4493 => 4494)


--- MacRuby/trunk/range.c	2010-09-03 02:37:28 UTC (rev 4493)
+++ MacRuby/trunk/range.c	2010-09-04 01:55:20 UTC (rev 4494)
@@ -246,7 +246,7 @@
     return LONG2FIX(hash);
 }
 
-static void
+static VALUE
 range_each_func(VALUE range, VALUE (*func) (VALUE, void *), void *arg)
 {
     int c;
@@ -257,17 +257,20 @@
     if (EXCL(range)) {
 	while (r_lt(v, e)) {
 	    (*func) (v, arg);
+	    RETURN_IF_BROKEN();
 	    v = rb_vm_call(v, selSucc, 0, NULL);
 	}
     }
     else {
 	while (RTEST(c = r_le(v, e))) {
 	    (*func) (v, arg);
+	    RETURN_IF_BROKEN();
 	    if (c == INT2FIX(0))
 		break;
 	    v = rb_vm_call(v, selSucc, 0, NULL);
 	}
     }
+    return range;
 }
 
 static VALUE
@@ -420,7 +423,7 @@
 	    }
 	    args[0] = INT2FIX(1);
 	    args[1] = step;
-	    range_each_func(range, step_i, args);
+	    return range_each_func(range, step_i, args);
 	}
     }
     return range;
@@ -498,7 +501,7 @@
 	rb_objc_block_call(beg, selUpto, 2, args, rb_yield, 0);
     }
     else {
-	range_each_func(range, each_i, NULL);
+	return range_each_func(range, each_i, NULL);
     }
     return range;
 }