Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java |
diff --git a/third_party/protobuf/java/src/main/java/com/google/protobuf/UnsafeByteStrings.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java |
similarity index 54% |
copy from third_party/protobuf/java/src/main/java/com/google/protobuf/UnsafeByteStrings.java |
copy to third_party/protobuf/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java |
index c1997515d0fc8ac03078aecb027c3d1246ff564f..0fbf4d401c404ebd8c4c759cb8c4fd88030a70aa 100644 |
--- a/third_party/protobuf/java/src/main/java/com/google/protobuf/UnsafeByteStrings.java |
+++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java |
@@ -30,26 +30,55 @@ |
package com.google.protobuf; |
+import java.io.IOException; |
import java.nio.ByteBuffer; |
/** |
- * Provides unsafe factory methods for {@link ByteString} instances. |
+ * Provides a number of unsafe byte operations to be used by advanced applications with high |
+ * performance requirements. These methods are referred to as "unsafe" due to the fact that they |
+ * potentially expose the backing buffer of a {@link ByteString} to the application. |
* |
* <p><strong>DISCLAIMER:</strong> The methods in this class should only be called if it is |
- * guaranteed that the the buffer backing the {@link ByteString} will never change! Mutation of a |
+ * guaranteed that the buffer backing the {@link ByteString} will never change! Mutation of a |
* {@link ByteString} can lead to unexpected and undesirable consequences in your application, |
* and will likely be difficult to debug. Proceed with caution! |
*/ |
-public final class UnsafeByteStrings { |
- private UnsafeByteStrings() {} |
+@ExperimentalApi |
+public final class UnsafeByteOperations { |
+ private UnsafeByteOperations() {} |
/** |
* An unsafe operation that returns a {@link ByteString} that is backed by the provided buffer. |
* |
- * @param buffer the Java NIO buffer to be wrapped. |
- * @return a {@link ByteString} backed by the provided buffer. |
+ * @param buffer the Java NIO buffer to be wrapped |
+ * @return a {@link ByteString} backed by the provided buffer |
*/ |
public static ByteString unsafeWrap(ByteBuffer buffer) { |
- return new NioByteString(buffer); |
+ if (buffer.hasArray()) { |
+ final int offset = buffer.arrayOffset(); |
+ return ByteString.wrap(buffer.array(), offset + buffer.position(), buffer.remaining()); |
+ } else { |
+ return new NioByteString(buffer); |
+ } |
+ } |
+ |
+ /** |
+ * Writes the given {@link ByteString} to the provided {@link ByteOutput}. Calling this method may |
+ * result in multiple operations on the target {@link ByteOutput} |
+ * (i.e. for roped {@link ByteString}s). |
+ * |
+ * <p>This method exposes the internal backing buffer(s) of the {@link ByteString} to the {@link |
+ * ByteOutput} in order to avoid additional copying overhead. It would be possible for a malicious |
+ * {@link ByteOutput} to corrupt the {@link ByteString}. Use with caution! |
+ * |
+ * <p> NOTE: The {@link ByteOutput} <strong>MUST NOT</strong> modify the provided buffers. Doing |
+ * so may result in corrupted data, which would be difficult to debug. |
+ * |
+ * @param bytes the {@link ByteString} to be written |
+ * @param output the output to receive the bytes |
+ * @throws IOException if an I/O error occurs |
+ */ |
+ public static void unsafeWriteTo(ByteString bytes, ByteOutput output) throws IOException { |
+ bytes.writeTo(output); |
} |
} |