Skip to content

Commit 8dfebdd

Browse files
committed
use while instead of foreach
avoid NonLocalReturnControl
1 parent 465aea6 commit 8dfebdd

File tree

2 files changed

+45
-63
lines changed

2 files changed

+45
-63
lines changed

src/library/scala/runtime/Tuple2Zipped.scala

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,23 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
4444
def map[B, To](f: (El1, El2) => B)(implicit bf: BuildFrom[It1, B, To]): To = {
4545
val b = bf.newBuilder(coll1)
4646
b.sizeHint(coll1, 0)
47+
val elems1 = coll1.iterator
4748
val elems2 = coll2.iterator
4849

49-
for (el1 <- coll1) {
50-
if (elems2.hasNext)
51-
b += f(el1, elems2.next())
52-
else
53-
return b.result()
50+
while (elems1.hasNext && elems2.hasNext) {
51+
b += f(elems1.next(), elems2.next())
5452
}
5553

5654
b.result()
5755
}
5856

5957
def flatMap[B, To](f: (El1, El2) => IterableOnce[B])(implicit bf: BuildFrom[It1, B, To]): To = {
6058
val b = bf.newBuilder(coll1)
59+
val elems1 = coll1.iterator
6160
val elems2 = coll2.iterator
6261

63-
for (el1 <- coll1) {
64-
if (elems2.hasNext)
65-
b ++= f(el1, elems2.next())
66-
else
67-
return b.result()
62+
while (elems1.hasNext && elems2.hasNext) {
63+
b ++= f(elems1.next(), elems2.next())
6864
}
6965

7066
b.result()
@@ -73,31 +69,29 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
7369
def filter[To1, To2](f: (El1, El2) => Boolean)(implicit bf1: BuildFrom[It1, El1, To1], bf2: BuildFrom[It2, El2, To2]): (To1, To2) = {
7470
val b1 = bf1.newBuilder(coll1)
7571
val b2 = bf2.newBuilder(coll2)
72+
val elems1 = coll1.iterator
7673
val elems2 = coll2.iterator
7774

78-
for (el1 <- coll1) {
79-
if (elems2.hasNext) {
80-
val el2 = elems2.next()
81-
if (f(el1, el2)) {
82-
b1 += el1
83-
b2 += el2
84-
}
75+
while (elems1.hasNext && elems2.hasNext) {
76+
val el1 = elems1.next()
77+
val el2 = elems2.next()
78+
if (f(el1, el2)) {
79+
b1 += el1
80+
b2 += el2
8581
}
86-
else return (b1.result(), b2.result())
8782
}
8883

8984
(b1.result(), b2.result())
9085
}
9186

9287
def exists(p: (El1, El2) => Boolean): Boolean = {
88+
val elems1 = coll1.iterator
9389
val elems2 = coll2.iterator
9490

95-
for (el1 <- coll1) {
96-
if (elems2.hasNext) {
97-
if (p(el1, elems2.next()))
98-
return true
91+
while (elems1.hasNext && elems2.hasNext) {
92+
if (p(elems1.next(), elems2.next())) {
93+
return true
9994
}
100-
else return false
10195
}
10296
false
10397
}
@@ -108,13 +102,11 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
108102
def iterator: Iterator[(El1, El2)] = coll1.iterator.zip(coll2.iterator)
109103
override def isEmpty: Boolean = coll1.isEmpty || coll2.isEmpty
110104
def foreach[U](f: (El1, El2) => U): Unit = {
105+
val elems1 = coll1.iterator
111106
val elems2 = coll2.iterator
112107

113-
for (el1 <- coll1) {
114-
if (elems2.hasNext)
115-
f(el1, elems2.next())
116-
else
117-
return
108+
while (elems1.hasNext && elems2.hasNext) {
109+
f(elems1.next(), elems2.next())
118110
}
119111
}
120112

src/library/scala/runtime/Tuple3Zipped.scala

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,24 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
4444

4545
def map[B, To](f: (El1, El2, El3) => B)(implicit bf: BuildFrom[It1, B, To]): To = {
4646
val b = bf.newBuilder(coll1)
47+
val elems1 = coll1.iterator
4748
val elems2 = coll2.iterator
4849
val elems3 = coll3.iterator
4950

50-
for (el1 <- coll1) {
51-
if (elems2.hasNext && elems3.hasNext)
52-
b += f(el1, elems2.next(), elems3.next())
53-
else
54-
return b.result()
51+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
52+
b += f(elems1.next(), elems2.next(), elems3.next())
5553
}
5654
b.result()
5755
}
5856

5957
def flatMap[B, To](f: (El1, El2, El3) => IterableOnce[B])(implicit bf: BuildFrom[It1, B, To]): To = {
6058
val b = bf.newBuilder(coll1)
59+
val elems1 = coll1.iterator
6160
val elems2 = coll2.iterator
6261
val elems3 = coll3.iterator
6362

64-
for (el1 <- coll1) {
65-
if (elems2.hasNext && elems3.hasNext)
66-
b ++= f(el1, elems2.next(), elems3.next())
67-
else
68-
return b.result()
63+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
64+
b ++= f(elems1.next(), elems2.next(), elems3.next())
6965
}
7066
b.result()
7167
}
@@ -77,37 +73,33 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
7773
val b1 = bf1.newBuilder(coll1)
7874
val b2 = bf2.newBuilder(coll2)
7975
val b3 = bf3.newBuilder(coll3)
76+
val elems1 = coll1.iterator
8077
val elems2 = coll2.iterator
8178
val elems3 = coll3.iterator
82-
def result = (b1.result(), b2.result(), b3.result())
83-
84-
for (el1 <- coll1) {
85-
if (elems2.hasNext && elems3.hasNext) {
86-
val el2 = elems2.next()
87-
val el3 = elems3.next()
88-
89-
if (f(el1, el2, el3)) {
90-
b1 += el1
91-
b2 += el2
92-
b3 += el3
93-
}
79+
80+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
81+
val el1 = elems1.next()
82+
val el2 = elems2.next()
83+
val el3 = elems3.next()
84+
85+
if (f(el1, el2, el3)) {
86+
b1 += el1
87+
b2 += el2
88+
b3 += el3
9489
}
95-
else return result
9690
}
97-
98-
result
91+
(b1.result(), b2.result(), b3.result())
9992
}
10093

10194
def exists(p: (El1, El2, El3) => Boolean): Boolean = {
95+
val elems1 = coll1.iterator
10296
val elems2 = coll2.iterator
10397
val elems3 = coll3.iterator
10498

105-
for (el1 <- coll1) {
106-
if (elems2.hasNext && elems3.hasNext) {
107-
if (p(el1, elems2.next(), elems3.next()))
108-
return true
99+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
100+
if (p(elems1.next(), elems2.next(), elems3.next())) {
101+
return true
109102
}
110-
else return false
111103
}
112104
false
113105
}
@@ -118,14 +110,12 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
118110
def iterator: Iterator[(El1, El2, El3)] = coll1.iterator.zip(coll2.iterator).zip(coll3.iterator).map { case ((a, b), c) => (a, b, c)}
119111
override def isEmpty: Boolean = coll1.isEmpty || coll2.isEmpty || coll3.isEmpty
120112
def foreach[U](f: (El1, El2, El3) => U): Unit = {
113+
val elems1 = coll1.iterator
121114
val elems2 = coll2.iterator
122115
val elems3 = coll3.iterator
123116

124-
for (el1 <- coll1) {
125-
if (elems2.hasNext && elems3.hasNext)
126-
f(el1, elems2.next(), elems3.next())
127-
else
128-
return
117+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
118+
f(elems1.next(), elems2.next(), elems3.next())
129119
}
130120
}
131121

0 commit comments

Comments
 (0)