提交 8a53d27c 编写于 作者: B bpb

8130891: (bf) More direct buffering

Summary: Improve non-byte direct buffering.
Reviewed-by: alanb, jeff, ahgross, robm, rriggs
上级 d990a4c0
...@@ -242,7 +242,7 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -242,7 +242,7 @@ class Direct$Type$Buffer$RW$$BO$
} }
private long ix(int i) { private long ix(int i) {
return address + (i << $LG_BYTES_PER_VALUE$); return address + ((long)i << $LG_BYTES_PER_VALUE$);
} }
public $type$ get() { public $type$ get() {
...@@ -261,7 +261,7 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -261,7 +261,7 @@ class Direct$Type$Buffer$RW$$BO$
public $Type$Buffer get($type$[] dst, int offset, int length) { public $Type$Buffer get($type$[] dst, int offset, int length) {
#if[rw] #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); checkBounds(offset, length, dst.length);
int pos = position(); int pos = position();
int lim = limit(); int lim = limit();
...@@ -273,13 +273,13 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -273,13 +273,13 @@ class Direct$Type$Buffer$RW$$BO$
#if[!byte] #if[!byte]
if (order() != ByteOrder.nativeOrder()) if (order() != ByteOrder.nativeOrder())
Bits.copyTo$Memtype$Array(ix(pos), dst, Bits.copyTo$Memtype$Array(ix(pos), dst,
offset << $LG_BYTES_PER_VALUE$, (long)offset << $LG_BYTES_PER_VALUE$,
length << $LG_BYTES_PER_VALUE$); (long)length << $LG_BYTES_PER_VALUE$);
else else
#end[!byte] #end[!byte]
Bits.copyToArray(ix(pos), dst, arrayBaseOffset, Bits.copyToArray(ix(pos), dst, arrayBaseOffset,
offset << $LG_BYTES_PER_VALUE$, (long)offset << $LG_BYTES_PER_VALUE$,
length << $LG_BYTES_PER_VALUE$); (long)length << $LG_BYTES_PER_VALUE$);
position(pos + length); position(pos + length);
} else { } else {
super.get(dst, offset, length); super.get(dst, offset, length);
...@@ -329,7 +329,7 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -329,7 +329,7 @@ class Direct$Type$Buffer$RW$$BO$
if (srem > rem) if (srem > rem)
throw new BufferOverflowException(); 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); sb.position(spos + srem);
position(pos + srem); position(pos + srem);
} else if (src.hb != null) { } else if (src.hb != null) {
...@@ -353,7 +353,7 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -353,7 +353,7 @@ class Direct$Type$Buffer$RW$$BO$
public $Type$Buffer put($type$[] src, int offset, int length) { public $Type$Buffer put($type$[] src, int offset, int length) {
#if[rw] #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); checkBounds(offset, length, src.length);
int pos = position(); int pos = position();
int lim = limit(); int lim = limit();
...@@ -364,12 +364,16 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -364,12 +364,16 @@ class Direct$Type$Buffer$RW$$BO$
#if[!byte] #if[!byte]
if (order() != ByteOrder.nativeOrder()) if (order() != ByteOrder.nativeOrder())
Bits.copyFrom$Memtype$Array(src, offset << $LG_BYTES_PER_VALUE$, Bits.copyFrom$Memtype$Array(src,
ix(pos), length << $LG_BYTES_PER_VALUE$); (long)offset << $LG_BYTES_PER_VALUE$,
ix(pos),
(long)length << $LG_BYTES_PER_VALUE$);
else else
#end[!byte] #end[!byte]
Bits.copyFromArray(src, arrayBaseOffset, offset << $LG_BYTES_PER_VALUE$, Bits.copyFromArray(src, arrayBaseOffset,
ix(pos), length << $LG_BYTES_PER_VALUE$); (long)offset << $LG_BYTES_PER_VALUE$,
ix(pos),
(long)length << $LG_BYTES_PER_VALUE$);
position(pos + length); position(pos + length);
} else { } else {
super.put(src, offset, length); super.put(src, offset, length);
...@@ -387,7 +391,7 @@ class Direct$Type$Buffer$RW$$BO$ ...@@ -387,7 +391,7 @@ class Direct$Type$Buffer$RW$$BO$
assert (pos <= lim); assert (pos <= lim);
int rem = (pos <= lim ? lim - pos : 0); 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); position(rem);
limit(capacity()); limit(capacity());
discardMark(); discardMark();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册