8247619: Improve Direct Buffering of Characters

Reviewed-by: alanb, ahgross, rhalade, psandoz
This commit is contained in:
Brian Burkhalter 2020-07-29 09:52:13 -07:00 committed by Henry Jen
parent 0408b23bcf
commit a5367cbb7a
3 changed files with 27 additions and 12 deletions

View file

@ -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;
} }
/** /**

View file

@ -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());

View file

@ -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;
} }