Skip to content

Commit ae0abe8

Browse files
committed
Fix ArrayIndexOutOfBoundsException in mutable.BitSet.<<=
1 parent 192ed91 commit ae0abe8

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

src/main/scala/scala/collection/decorators/MutableBitSetDecorator.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@ class MutableBitSetDecorator(protected val bs: mutable.BitSet) {
3939

4040
private def shiftLeftInPlace(shiftBy: Int): Unit = {
4141

42-
val bitOffset = shiftBy & WordMask
43-
val wordOffset = shiftBy >>> LogWL
44-
4542
var significantWordCount = bs.nwords
4643
while (significantWordCount > 0 && bs.word(significantWordCount - 1) == 0) {
4744
significantWordCount -= 1
4845
}
4946

47+
if (significantWordCount == 0) return
48+
49+
val bitOffset = shiftBy & WordMask
50+
val wordOffset = shiftBy >>> LogWL
51+
5052
if (bitOffset == 0) {
5153
val newSize = significantWordCount + wordOffset
5254
require(newSize <= MaxSize)

src/test/scala/scala/collection/decorators/MutableBitSetDecoratorTest.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package scala.collection.decorators
22

33
import org.junit.{Assert, Test}
44

5+
import scala.collection.BitSetOps
56
import scala.collection.mutable.BitSet
67

78
class MutableBitSetDecoratorTest {
89

9-
import Assert.{assertEquals, assertSame}
10+
import Assert.{assertEquals, assertSame, assertTrue}
1011
import BitSet.empty
1112

1213
@Test
@@ -104,4 +105,12 @@ class MutableBitSetDecoratorTest {
104105
}
105106
}
106107

108+
@Test
109+
def shiftLeftTwoEmptyWords(): Unit = {
110+
val twoWords = BitSet(BitSetOps.WordLength + 1)
111+
twoWords ^= twoWords
112+
twoWords <<= 1
113+
assertTrue(twoWords.isEmpty)
114+
}
115+
107116
}

0 commit comments

Comments
 (0)