8247619: Improve Direct Buffering of Characters
Reviewed-by: alanb, ahgross, rhalade, psandoz
diff --git a/src/java.base/share/classes/java/nio/Buffer.java b/src/java.base/share/classes/java/nio/Buffer.java
index 574db70e..bba1118 100644
--- a/src/java.base/share/classes/java/nio/Buffer.java
+++ b/src/java.base/share/classes/java/nio/Buffer.java
@@ -291,8 +291,8 @@
public Buffer position(int newPosition) {
if (newPosition > limit | newPosition < 0)
throw createPositionException(newPosition);
+ if (mark > newPosition) mark = -1;
position = newPosition;
- if (mark > position) mark = -1;
return this;
}
@@ -481,7 +481,8 @@
* @return The number of elements remaining in this buffer
*/
public final int remaining() {
- return limit - position;
+ int rem = limit - position;
+ return rem > 0 ? rem : 0;
}
/**
diff --git a/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template b/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template
index c0ee8b1..dcb99d8 100644
--- a/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template
+++ b/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -261,7 +261,9 @@
public $Type$Buffer compact() {
#if[rw]
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);
position(rem);
limit(capacity());
diff --git a/src/java.base/share/classes/java/nio/X-Buffer.java.template b/src/java.base/share/classes/java/nio/X-Buffer.java.template
index 09afe66..dd02126 100644
--- a/src/java.base/share/classes/java/nio/X-Buffer.java.template
+++ b/src/java.base/share/classes/java/nio/X-Buffer.java.template
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -440,15 +440,23 @@
*/
public int read(CharBuffer target) throws IOException {
// Determine the number of bytes n that can be transferred
- int targetRemaining = target.remaining();
int limit = limit();
- int remaining = limit - position();
- if (remaining == 0)
+ int pos = position();
+ int remaining = limit - pos;
+ assert remaining >= 0;
+ if (remaining <= 0) // include equality condition when remaining == 0
return -1;
+
+ int targetRemaining = target.remaining();
+ assert targetRemaining >= 0;
+ if (targetRemaining <= 0) // include condition targetRemaining == 0
+ return 0;
+
int n = Math.min(remaining, targetRemaining);
+
// Set source limit to prevent target overflow
if (targetRemaining < remaining)
- limit(position() + n);
+ limit(pos + n);
try {
if (n > 0)
target.put(this);