RFR: 8310843: Reimplement ByteArray and ByteArrayLittleEndian with Unsafe [v10]

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Jul 20 14:17:43 UTC 2023


On Thu, 20 Jul 2023 13:57:04 GMT, Glavo <duke at openjdk.org> wrote:

>> Also... `Integer::toString` seems to be `@IntrinsicCandidate` ?
>
>> Also... `Integer::toString` seems to be `@IntrinsicCandidate` ?
> 
> It's just a bytecode intrinsics, it is only replaced when used in a fluent-chain of StringBuilder/Buffer.

Also, note that ByteBuffer exposes its backing array (at least if the buffer is not read only) via ByteBuffer::array. This does no copy. So in all the various stream implementations, I believe we can really just use a ByteBuffer instead of an array - and use ByteBuffer::array when we really need an array.

This makes it very easy to migrate some of the classes that use ByteArray. Here's the patch for DataInputStream:


diff --git a/src/java.base/share/classes/java/io/DataInputStream.java b/src/java.base/share/classes/java/io/DataInputStream.java
index 7192b30d5f2..b5b013cdd50 100644
--- a/src/java.base/share/classes/java/io/DataInputStream.java
+++ b/src/java.base/share/classes/java/io/DataInputStream.java
@@ -27,6 +27,8 @@ package java.io;
 
 import jdk.internal.util.ByteArray;
 
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.util.Objects;
 
 /**
@@ -59,7 +61,7 @@ public class DataInputStream extends FilterInputStream implements DataInput {
         super(in);
     }
 
-    private final byte[] readBuffer = new byte[8];
+    private final ByteBuffer readBuffer = ByteBuffer.allocate(8); // BIG_ENDIAN
 
     /**
      * working arrays initialized on demand by readUTF
@@ -316,8 +318,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.io.FilterInputStream#in
      */
     public final short readShort() throws IOException {
-        readFully(readBuffer, 0, 2);
-        return ByteArray.getShort(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 2);
+        return readBuffer.getShort(0);
     }
 
     /**
@@ -338,8 +340,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.io.FilterInputStream#in
      */
     public final int readUnsignedShort() throws IOException {
-        readFully(readBuffer, 0, 2);
-        return ByteArray.getUnsignedShort(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 2);
+        return Short.toUnsignedInt(readBuffer.getShort(0));
     }
 
     /**
@@ -360,8 +362,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.io.FilterInputStream#in
      */
     public final char readChar() throws IOException {
-        readFully(readBuffer, 0, 2);
-        return ByteArray.getChar(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 2);
+        return readBuffer.getChar(0);
     }
 
     /**
@@ -382,8 +384,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.io.FilterInputStream#in
      */
     public final int readInt() throws IOException {
-        readFully(readBuffer, 0, 4);
-        return ByteArray.getInt(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 4);
+        return readBuffer.getInt(0);
     }
 
     /**
@@ -404,8 +406,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.io.FilterInputStream#in
      */
     public final long readLong() throws IOException {
-        readFully(readBuffer, 0, 8);
-        return ByteArray.getLong(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 8);
+        return readBuffer.getLong(0);
     }
 
     /**
@@ -427,8 +429,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.lang.Float#intBitsToFloat(int)
      */
     public final float readFloat() throws IOException {
-        readFully(readBuffer, 0, 4);
-        return ByteArray.getFloat(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 4);
+        return readBuffer.getFloat(0);
     }
 
     /**
@@ -450,8 +452,8 @@ public class DataInputStream extends FilterInputStream implements DataInput {
      * @see        java.lang.Double#longBitsToDouble(long)
      */
     public final double readDouble() throws IOException {
-        readFully(readBuffer, 0, 8);
-        return ByteArray.getDouble(readBuffer, 0);
+        readFully(readBuffer.array(), 0, 8);
+        return readBuffer.getDouble(0);
     }
 
     private char[] lineBuffer;


It is very mechanical, and seems to pass all the jdk_io tests.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14636#discussion_r1269527839


More information about the core-libs-dev mailing list