Skip to content

Commit 0fd1733

Browse files
committed
Adapt the codebase to changes in nio Buffers in Java 9.
First, several methods of `nio.Buffer` are now overridden in specific subclasses so that they return a more specific type. For example, `Buffer.position(int)` is overridden in `ByteBuffer` to return a `ByteBuffer`, allowing chained invocations. This obviously means we had to add those overrides in our javalib, so that they can link. Indeed, the overrides have a different binary signature. In addition, because of scala/bug#10418, we also have to call `position()` and `limit()` instead of `position` and `limit`, respectively. Lastly, the methods `slice()` and `duplicate()` now have an abstract definition in `Buffer`, which broken source compatibility of the `BufferAdapter`s in our test suite. We fix this by renaming the methods to `sliceChain()` and `duplicateChain()` in the adapters.
1 parent e284270 commit 0fd1733

30 files changed

+334
-180
lines changed

javalib/src/main/scala/java/io/InputStreamReader.scala

+9-9
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@ class InputStreamReader(private[this] var in: InputStream,
127127

128128
@tailrec
129129
private def readImpl(out: CharBuffer): Int = {
130-
val initPos = out.position
130+
val initPos = out.position()
131131
val result = decoder.decode(inBuf, out, endOfInput)
132132

133-
if (out.position != initPos) {
133+
if (out.position() != initPos) {
134134
/* Good, we made progress, so we can return.
135135
* Note that the `result` does not matter. Whether it's an underflow,
136136
* an overflow, or even an error, if we read *something*, we can return
@@ -139,7 +139,7 @@ class InputStreamReader(private[this] var in: InputStream,
139139
* which will necessarily return the same result (but without advancing
140140
* at all), which will cause one of the following cases to be handled.
141141
*/
142-
out.position - initPos
142+
out.position() - initPos
143143
} else if (result.isUnderflow) {
144144
if (endOfInput) {
145145
assert(!inBuf.hasRemaining,
@@ -151,12 +151,12 @@ class InputStreamReader(private[this] var in: InputStream,
151151
InputStreamReader.Overflow
152152
} else {
153153
// Done
154-
if (out.position == initPos) -1
155-
else out.position - initPos
154+
if (out.position() == initPos) -1
155+
else out.position() - initPos
156156
}
157157
} else {
158158
// We need to read more from the underlying input stream
159-
if (inBuf.limit == inBuf.capacity) {
159+
if (inBuf.limit() == inBuf.capacity) {
160160
inBuf.compact()
161161
if (!inBuf.hasRemaining) {
162162
throw new AssertionError(
@@ -165,7 +165,7 @@ class InputStreamReader(private[this] var in: InputStream,
165165
getEncoding + " to decode a single code point. " +
166166
"Please report this as a bug.")
167167
}
168-
inBuf.limit(inBuf.position)
168+
inBuf.limit(inBuf.position())
169169
inBuf.position(0)
170170
}
171171

@@ -174,12 +174,12 @@ class InputStreamReader(private[this] var in: InputStream,
174174
* according to the specification of InputStreamReader.
175175
*/
176176
val bytesRead =
177-
in.read(inBuf.array, inBuf.limit, inBuf.capacity - inBuf.limit)
177+
in.read(inBuf.array, inBuf.limit, inBuf.capacity - inBuf.limit())
178178

179179
if (bytesRead == -1)
180180
endOfInput = true
181181
else
182-
inBuf.limit(inBuf.limit + bytesRead)
182+
inBuf.limit(inBuf.limit() + bytesRead)
183183

184184
readImpl(out)
185185
}

javalib/src/main/scala/java/io/OutputStreamWriter.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class OutputStreamWriter(private[this] var out: OutputStream,
134134
}
135135

136136
private def makeRoomInOutBuf(): Unit = {
137-
if (outBuf.position != 0) {
137+
if (outBuf.position() != 0) {
138138
flushBuffer()
139139
} else {
140140
// Very unlikely (outBuf.capacity is not enough to encode a single code point)
@@ -153,7 +153,7 @@ class OutputStreamWriter(private[this] var out: OutputStream,
153153

154154
// Don't use outBuf.flip() first, in case out.write() throws
155155
// Hence, use 0 instead of position, and position instead of limit
156-
out.write(outBuf.array, outBuf.arrayOffset, outBuf.position)
156+
out.write(outBuf.array, outBuf.arrayOffset, outBuf.position())
157157
outBuf.clear()
158158
}
159159

javalib/src/main/scala/java/io/Reader.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ abstract class Reader private[this] (_lock: Option[Object])
1414
if (!target.hasRemaining) 0
1515
else if (target.hasArray) {
1616
val charsRead = read(target.array,
17-
target.position + target.arrayOffset, target.remaining)
17+
target.position() + target.arrayOffset, target.remaining)
1818
if (charsRead != -1)
19-
target.position(target.position + charsRead)
19+
target.position(target.position() + charsRead)
2020
charsRead
2121
} else {
2222
val buf = new Array[Char](target.remaining)

javalib/src/main/scala/java/nio/Buffer.scala

+7-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ abstract class Buffer private[nio] (val _capacity: Int) {
2121

2222
final def position(): Int = _position
2323

24-
final def position(newPosition: Int): Buffer = {
24+
def position(newPosition: Int): Buffer = {
2525
if (newPosition < 0 || newPosition > limit())
2626
throw new IllegalArgumentException
2727
_position = newPosition
@@ -32,7 +32,7 @@ abstract class Buffer private[nio] (val _capacity: Int) {
3232

3333
final def limit(): Int = _limit
3434

35-
final def limit(newLimit: Int): Buffer = {
35+
def limit(newLimit: Int): Buffer = {
3636
if (newLimit < 0 || newLimit > capacity())
3737
throw new IllegalArgumentException
3838
_limit = newLimit
@@ -44,33 +44,33 @@ abstract class Buffer private[nio] (val _capacity: Int) {
4444
this
4545
}
4646

47-
final def mark(): Buffer = {
47+
def mark(): Buffer = {
4848
_mark = _position
4949
this
5050
}
5151

52-
final def reset(): Buffer = {
52+
def reset(): Buffer = {
5353
if (_mark == -1)
5454
throw new InvalidMarkException
5555
_position = _mark
5656
this
5757
}
5858

59-
final def clear(): Buffer = {
59+
def clear(): Buffer = {
6060
_mark = -1
6161
_position = 0
6262
_limit = capacity
6363
this
6464
}
6565

66-
final def flip(): Buffer = {
66+
def flip(): Buffer = {
6767
_mark = -1
6868
_limit = _position
6969
_position = 0
7070
this
7171
}
7272

73-
final def rewind(): Buffer = {
73+
def rewind(): Buffer = {
7474
_mark = -1
7575
_position = 0
7676
this

javalib/src/main/scala/java/nio/ByteBuffer.scala

+21
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,27 @@ abstract class ByteBuffer private[nio] (
8383
@inline final def arrayOffset(): Int =
8484
GenBuffer(this).generic_arrayOffset()
8585

86+
@inline override def position(newPosition: Int): ByteBuffer =
87+
super.position(newPosition).asInstanceOf[ByteBuffer]
88+
89+
@inline override def limit(newLimit: Int): ByteBuffer =
90+
super.limit(newLimit).asInstanceOf[ByteBuffer]
91+
92+
@inline override def mark(): ByteBuffer =
93+
super.mark().asInstanceOf[ByteBuffer]
94+
95+
@inline override def reset(): ByteBuffer =
96+
super.reset().asInstanceOf[ByteBuffer]
97+
98+
@inline override def clear(): ByteBuffer =
99+
super.clear().asInstanceOf[ByteBuffer]
100+
101+
@inline override def flip(): ByteBuffer =
102+
super.flip().asInstanceOf[ByteBuffer]
103+
104+
@inline override def rewind(): ByteBuffer =
105+
super.rewind().asInstanceOf[ByteBuffer]
106+
86107
def compact(): ByteBuffer
87108

88109
def isDirect(): Boolean

javalib/src/main/scala/java/nio/CharBuffer.scala

+25-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ abstract class CharBuffer private[nio] (
4646
target.put(_array, _arrayOffset, n)
4747
n
4848
} else {
49-
val savedPos = position
49+
val savedPos = position()
5050
target.put(this)
5151
position(savedPos)
5252
n
@@ -100,6 +100,27 @@ abstract class CharBuffer private[nio] (
100100
@inline final def arrayOffset(): Int =
101101
GenBuffer(this).generic_arrayOffset()
102102

103+
@inline override def position(newPosition: Int): CharBuffer =
104+
super.position(newPosition).asInstanceOf[CharBuffer]
105+
106+
@inline override def limit(newLimit: Int): CharBuffer =
107+
super.limit(newLimit).asInstanceOf[CharBuffer]
108+
109+
@inline override def mark(): CharBuffer =
110+
super.mark().asInstanceOf[CharBuffer]
111+
112+
@inline override def reset(): CharBuffer =
113+
super.reset().asInstanceOf[CharBuffer]
114+
115+
@inline override def clear(): CharBuffer =
116+
super.clear().asInstanceOf[CharBuffer]
117+
118+
@inline override def flip(): CharBuffer =
119+
super.flip().asInstanceOf[CharBuffer]
120+
121+
@inline override def rewind(): CharBuffer =
122+
super.rewind().asInstanceOf[CharBuffer]
123+
103124
def compact(): CharBuffer
104125

105126
def isDirect(): Boolean
@@ -119,10 +140,10 @@ abstract class CharBuffer private[nio] (
119140

120141
override def toString(): String = {
121142
if (_array != null) { // even if read-only
122-
new String(_array, position + _arrayOffset, remaining)
143+
new String(_array, position() + _arrayOffset, remaining)
123144
} else {
124145
val chars = new Array[Char](remaining)
125-
val savedPos = position
146+
val savedPos = position()
126147
get(chars)
127148
position(savedPos)
128149
new String(chars)
@@ -131,7 +152,7 @@ abstract class CharBuffer private[nio] (
131152

132153
final def length(): Int = remaining
133154

134-
final def charAt(index: Int): Char = get(position + index)
155+
final def charAt(index: Int): Char = get(position() + index)
135156

136157
def subSequence(start: Int, end: Int): CharSequence
137158

javalib/src/main/scala/java/nio/DataViewCharBuffer.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private[nio] final class DataViewCharBuffer private (
3434
if (start < 0 || end < start || end > remaining)
3535
throw new IndexOutOfBoundsException
3636
new DataViewCharBuffer(_dataView,
37-
position + start, position + end, isReadOnly, isBigEndian)
37+
position() + start, position() + end, isReadOnly, isBigEndian)
3838
}
3939

4040
@noinline

javalib/src/main/scala/java/nio/DoubleBuffer.scala

+21
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,27 @@ abstract class DoubleBuffer private[nio] (
7272
@inline final def arrayOffset(): Int =
7373
GenBuffer(this).generic_arrayOffset()
7474

75+
@inline override def position(newPosition: Int): DoubleBuffer =
76+
super.position(newPosition).asInstanceOf[DoubleBuffer]
77+
78+
@inline override def limit(newLimit: Int): DoubleBuffer =
79+
super.limit(newLimit).asInstanceOf[DoubleBuffer]
80+
81+
@inline override def mark(): DoubleBuffer =
82+
super.mark().asInstanceOf[DoubleBuffer]
83+
84+
@inline override def reset(): DoubleBuffer =
85+
super.reset().asInstanceOf[DoubleBuffer]
86+
87+
@inline override def clear(): DoubleBuffer =
88+
super.clear().asInstanceOf[DoubleBuffer]
89+
90+
@inline override def flip(): DoubleBuffer =
91+
super.flip().asInstanceOf[DoubleBuffer]
92+
93+
@inline override def rewind(): DoubleBuffer =
94+
super.rewind().asInstanceOf[DoubleBuffer]
95+
7596
def compact(): DoubleBuffer
7697

7798
def isDirect(): Boolean

javalib/src/main/scala/java/nio/FloatBuffer.scala

+21
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,27 @@ abstract class FloatBuffer private[nio] (
7272
@inline final def arrayOffset(): Int =
7373
GenBuffer(this).generic_arrayOffset()
7474

75+
@inline override def position(newPosition: Int): FloatBuffer =
76+
super.position(newPosition).asInstanceOf[FloatBuffer]
77+
78+
@inline override def limit(newLimit: Int): FloatBuffer =
79+
super.limit(newLimit).asInstanceOf[FloatBuffer]
80+
81+
@inline override def mark(): FloatBuffer =
82+
super.mark().asInstanceOf[FloatBuffer]
83+
84+
@inline override def reset(): FloatBuffer =
85+
super.reset().asInstanceOf[FloatBuffer]
86+
87+
@inline override def clear(): FloatBuffer =
88+
super.clear().asInstanceOf[FloatBuffer]
89+
90+
@inline override def flip(): FloatBuffer =
91+
super.flip().asInstanceOf[FloatBuffer]
92+
93+
@inline override def rewind(): FloatBuffer =
94+
super.rewind().asInstanceOf[FloatBuffer]
95+
7596
def compact(): FloatBuffer
7697

7798
def isDirect(): Boolean

javalib/src/main/scala/java/nio/GenDataViewBuffer.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ private[nio] object GenDataViewBuffer {
2020
byteBuffer: TypedArrayByteBuffer)(
2121
implicit newDataViewBuffer: NewDataViewBuffer[BufferType]): BufferType = {
2222
val byteArray = byteBuffer._typedArray
23-
val byteBufferPos = byteBuffer.position
24-
val byteBufferLimit = byteBuffer.limit
23+
val byteBufferPos = byteBuffer.position()
24+
val byteBufferLimit = byteBuffer.limit()
2525
val viewCapacity =
2626
(byteBufferLimit - byteBufferPos) / newDataViewBuffer.bytesPerElem
2727
val byteLength = viewCapacity * newDataViewBuffer.bytesPerElem

javalib/src/main/scala/java/nio/GenHeapBufferView.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ private[nio] object GenHeapBufferView {
1616
def generic_fromHeapByteBuffer[BufferType <: Buffer](
1717
byteBuffer: HeapByteBuffer)(
1818
implicit newHeapBufferView: NewHeapBufferView[BufferType]): BufferType = {
19-
val byteBufferPos = byteBuffer.position
19+
val byteBufferPos = byteBuffer.position()
2020
val viewCapacity =
21-
(byteBuffer.limit - byteBufferPos) / newHeapBufferView.bytesPerElem
21+
(byteBuffer.limit() - byteBufferPos) / newHeapBufferView.bytesPerElem
2222
newHeapBufferView(viewCapacity, byteBuffer._array,
2323
byteBuffer._arrayOffset + byteBufferPos,
2424
0, viewCapacity, byteBuffer.isReadOnly, byteBuffer.isBigEndian)

javalib/src/main/scala/java/nio/GenTypedArrayBuffer.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ private[nio] object GenTypedArrayBuffer {
2121
byteBuffer: TypedArrayByteBuffer)(
2222
implicit newTypedArrayBuffer: NewTypedArrayBuffer[BufferType]): BufferType = {
2323
val byteArray = byteBuffer._typedArray
24-
val byteBufferPos = byteBuffer.position
25-
val byteBufferLimit = byteBuffer.limit
24+
val byteBufferPos = byteBuffer.position()
25+
val byteBufferLimit = byteBuffer.limit()
2626
val viewCapacity =
2727
(byteBufferLimit - byteBufferPos) / newTypedArrayBuffer.bytesPerElem
2828
val viewTypedArray = newTypedArrayBuffer.newTypedArray(

javalib/src/main/scala/java/nio/HeapByteBufferCharView.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private[nio] final class HeapByteBufferCharView private (
3434
if (start < 0 || end < start || end > remaining)
3535
throw new IndexOutOfBoundsException
3636
new HeapByteBufferCharView(capacity, _byteArray, _byteArrayOffset,
37-
position + start, position + end, isReadOnly, isBigEndian)
37+
position() + start, position() + end, isReadOnly, isBigEndian)
3838
}
3939

4040
@noinline

javalib/src/main/scala/java/nio/HeapCharBuffer.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ private[nio] final class HeapCharBuffer private (
3030
if (start < 0 || end < start || end > remaining)
3131
throw new IndexOutOfBoundsException
3232
new HeapCharBuffer(capacity, _array, _arrayOffset,
33-
position + start, position + end, isReadOnly)
33+
position() + start, position() + end, isReadOnly)
3434
}
3535

3636
@noinline

javalib/src/main/scala/java/nio/IntBuffer.scala

+21
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,27 @@ abstract class IntBuffer private[nio] (
7272
@inline final def arrayOffset(): Int =
7373
GenBuffer(this).generic_arrayOffset()
7474

75+
@inline override def position(newPosition: Int): IntBuffer =
76+
super.position(newPosition).asInstanceOf[IntBuffer]
77+
78+
@inline override def limit(newLimit: Int): IntBuffer =
79+
super.limit(newLimit).asInstanceOf[IntBuffer]
80+
81+
@inline override def mark(): IntBuffer =
82+
super.mark().asInstanceOf[IntBuffer]
83+
84+
@inline override def reset(): IntBuffer =
85+
super.reset().asInstanceOf[IntBuffer]
86+
87+
@inline override def clear(): IntBuffer =
88+
super.clear().asInstanceOf[IntBuffer]
89+
90+
@inline override def flip(): IntBuffer =
91+
super.flip().asInstanceOf[IntBuffer]
92+
93+
@inline override def rewind(): IntBuffer =
94+
super.rewind().asInstanceOf[IntBuffer]
95+
7596
def compact(): IntBuffer
7697

7798
def isDirect(): Boolean

0 commit comments

Comments
 (0)