From 8a53d27c1df17ed3a6a45b42945831ba682992da Mon Sep 17 00:00:00 2001 From: bpb Date: Thu, 6 Aug 2015 10:13:46 -0700 Subject: [PATCH] 8130891: (bf) More direct buffering Summary: Improve non-byte direct buffering. Reviewed-by: alanb, jeff, ahgross, robm, rriggs --- .../java/nio/Direct-X-Buffer.java.template | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/share/classes/java/nio/Direct-X-Buffer.java.template b/src/share/classes/java/nio/Direct-X-Buffer.java.template index 57801f7c5..e9f6d9fd0 100644 --- a/src/share/classes/java/nio/Direct-X-Buffer.java.template +++ b/src/share/classes/java/nio/Direct-X-Buffer.java.template @@ -242,7 +242,7 @@ class Direct$Type$Buffer$RW$$BO$ } private long ix(int i) { - return address + (i << $LG_BYTES_PER_VALUE$); + return address + ((long)i << $LG_BYTES_PER_VALUE$); } public $type$ get() { @@ -261,7 +261,7 @@ class Direct$Type$Buffer$RW$$BO$ public $Type$Buffer get($type$[] dst, int offset, int length) { #if[rw] - if ((length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) { + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) { checkBounds(offset, length, dst.length); int pos = position(); int lim = limit(); @@ -273,13 +273,13 @@ class Direct$Type$Buffer$RW$$BO$ #if[!byte] if (order() != ByteOrder.nativeOrder()) Bits.copyTo$Memtype$Array(ix(pos), dst, - offset << $LG_BYTES_PER_VALUE$, - length << $LG_BYTES_PER_VALUE$); + (long)offset << $LG_BYTES_PER_VALUE$, + (long)length << $LG_BYTES_PER_VALUE$); else #end[!byte] Bits.copyToArray(ix(pos), dst, arrayBaseOffset, - offset << $LG_BYTES_PER_VALUE$, - length << $LG_BYTES_PER_VALUE$); + (long)offset << $LG_BYTES_PER_VALUE$, + (long)length << $LG_BYTES_PER_VALUE$); position(pos + length); } else { super.get(dst, offset, length); @@ -329,7 +329,7 @@ class Direct$Type$Buffer$RW$$BO$ if (srem > rem) throw new BufferOverflowException(); - unsafe.copyMemory(sb.ix(spos), ix(pos), srem << $LG_BYTES_PER_VALUE$); + unsafe.copyMemory(sb.ix(spos), ix(pos), (long)srem << $LG_BYTES_PER_VALUE$); sb.position(spos + srem); position(pos + srem); } else if (src.hb != null) { @@ -353,7 +353,7 @@ class Direct$Type$Buffer$RW$$BO$ public $Type$Buffer put($type$[] src, int offset, int length) { #if[rw] - if ((length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_FROM_ARRAY_THRESHOLD) { + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_FROM_ARRAY_THRESHOLD) { checkBounds(offset, length, src.length); int pos = position(); int lim = limit(); @@ -364,12 +364,16 @@ class Direct$Type$Buffer$RW$$BO$ #if[!byte] if (order() != ByteOrder.nativeOrder()) - Bits.copyFrom$Memtype$Array(src, offset << $LG_BYTES_PER_VALUE$, - ix(pos), length << $LG_BYTES_PER_VALUE$); + Bits.copyFrom$Memtype$Array(src, + (long)offset << $LG_BYTES_PER_VALUE$, + ix(pos), + (long)length << $LG_BYTES_PER_VALUE$); else #end[!byte] - Bits.copyFromArray(src, arrayBaseOffset, offset << $LG_BYTES_PER_VALUE$, - ix(pos), length << $LG_BYTES_PER_VALUE$); + Bits.copyFromArray(src, arrayBaseOffset, + (long)offset << $LG_BYTES_PER_VALUE$, + ix(pos), + (long)length << $LG_BYTES_PER_VALUE$); position(pos + length); } else { super.put(src, offset, length); @@ -387,7 +391,7 @@ class Direct$Type$Buffer$RW$$BO$ assert (pos <= lim); int rem = (pos <= lim ? lim - pos : 0); - unsafe.copyMemory(ix(pos), ix(0), rem << $LG_BYTES_PER_VALUE$); + unsafe.copyMemory(ix(pos), ix(0), (long)rem << $LG_BYTES_PER_VALUE$); position(rem); limit(capacity()); discardMark(); -- GitLab