mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8247619: Improve Direct Buffering of Characters
Reviewed-by: alanb, ahgross, rhalade, psandoz
This commit is contained in:
parent
0408b23bcf
commit
a5367cbb7a
3 changed files with 27 additions and 12 deletions
|
@ -313,8 +313,8 @@ public abstract class Buffer {
|
||||||
public Buffer position(int newPosition) {
|
public Buffer position(int newPosition) {
|
||||||
if (newPosition > limit | newPosition < 0)
|
if (newPosition > limit | newPosition < 0)
|
||||||
throw createPositionException(newPosition);
|
throw createPositionException(newPosition);
|
||||||
|
if (mark > newPosition) mark = -1;
|
||||||
position = newPosition;
|
position = newPosition;
|
||||||
if (mark > position) mark = -1;
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,7 +503,8 @@ public abstract class Buffer {
|
||||||
* @return The number of elements remaining in this buffer
|
* @return The number of elements remaining in this buffer
|
||||||
*/
|
*/
|
||||||
public final int remaining() {
|
public final int remaining() {
|
||||||
return limit - position;
|
int rem = limit - position;
|
||||||
|
return rem > 0 ? rem : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -292,7 +292,9 @@ class Heap$Type$Buffer$RW$
|
||||||
public $Type$Buffer compact() {
|
public $Type$Buffer compact() {
|
||||||
#if[rw]
|
#if[rw]
|
||||||
int pos = position();
|
int pos = position();
|
||||||
int rem = limit() - pos;
|
int lim = limit();
|
||||||
|
assert (pos <= lim);
|
||||||
|
int rem = (pos <= lim ? lim - pos : 0);
|
||||||
System.arraycopy(hb, ix(pos), hb, ix(0), rem);
|
System.arraycopy(hb, ix(pos), hb, ix(0), rem);
|
||||||
position(rem);
|
position(rem);
|
||||||
limit(capacity());
|
limit(capacity());
|
||||||
|
|
|
@ -452,15 +452,23 @@ public abstract class $Type$Buffer
|
||||||
*/
|
*/
|
||||||
public int read(CharBuffer target) throws IOException {
|
public int read(CharBuffer target) throws IOException {
|
||||||
// Determine the number of bytes n that can be transferred
|
// Determine the number of bytes n that can be transferred
|
||||||
int targetRemaining = target.remaining();
|
|
||||||
int limit = limit();
|
int limit = limit();
|
||||||
int remaining = limit - position();
|
int pos = position();
|
||||||
if (remaining == 0)
|
int remaining = limit - pos;
|
||||||
|
assert remaining >= 0;
|
||||||
|
if (remaining <= 0) // include equality condition when remaining == 0
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
int targetRemaining = target.remaining();
|
||||||
|
assert targetRemaining >= 0;
|
||||||
|
if (targetRemaining <= 0) // include condition targetRemaining == 0
|
||||||
|
return 0;
|
||||||
|
|
||||||
int n = Math.min(remaining, targetRemaining);
|
int n = Math.min(remaining, targetRemaining);
|
||||||
|
|
||||||
// Set source limit to prevent target overflow
|
// Set source limit to prevent target overflow
|
||||||
if (targetRemaining < remaining)
|
if (targetRemaining < remaining)
|
||||||
limit(position() + n);
|
limit(pos + n);
|
||||||
try {
|
try {
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
target.put(this);
|
target.put(this);
|
||||||
|
@ -951,15 +959,19 @@ public abstract class $Type$Buffer
|
||||||
throw new ReadOnlyBufferException();
|
throw new ReadOnlyBufferException();
|
||||||
|
|
||||||
int srcPos = src.position();
|
int srcPos = src.position();
|
||||||
int n = src.limit() - srcPos;
|
int srcLim = src.limit();
|
||||||
|
int srcRem = (srcPos <= srcLim ? srcLim - srcPos : 0);
|
||||||
int pos = position();
|
int pos = position();
|
||||||
if (n > limit() - pos)
|
int lim = limit();
|
||||||
|
int rem = (pos <= lim ? lim - pos : 0);
|
||||||
|
|
||||||
|
if (srcRem > rem)
|
||||||
throw new BufferOverflowException();
|
throw new BufferOverflowException();
|
||||||
|
|
||||||
putBuffer(pos, src, srcPos, n);
|
putBuffer(pos, src, srcPos, srcRem);
|
||||||
|
|
||||||
position(pos + n);
|
position(pos + srcRem);
|
||||||
src.position(srcPos + n);
|
src.position(srcPos + srcRem);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue