Package com.google.protobuf
Class UnsafeUtil
- java.lang.Object
-
- com.google.protobuf.UnsafeUtil
-
final class UnsafeUtil extends java.lang.Object
Utility class for working with unsafe operations.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
UnsafeUtil.Android32MemoryAccessor
private static class
UnsafeUtil.Android64MemoryAccessor
private static class
UnsafeUtil.JvmMemoryAccessor
private static class
UnsafeUtil.MemoryAccessor
-
Field Summary
Fields Modifier and Type Field Description private static long
BOOLEAN_ARRAY_BASE_OFFSET
private static long
BOOLEAN_ARRAY_INDEX_SCALE
private static long
BUFFER_ADDRESS_OFFSET
private static int
BYTE_ARRAY_ALIGNMENT
(package private) static long
BYTE_ARRAY_BASE_OFFSET
private static long
DOUBLE_ARRAY_BASE_OFFSET
private static long
DOUBLE_ARRAY_INDEX_SCALE
private static long
FLOAT_ARRAY_BASE_OFFSET
private static long
FLOAT_ARRAY_INDEX_SCALE
private static boolean
HAS_UNSAFE_ARRAY_OPERATIONS
private static boolean
HAS_UNSAFE_BYTEBUFFER_OPERATIONS
private static long
INT_ARRAY_BASE_OFFSET
private static long
INT_ARRAY_INDEX_SCALE
private static boolean
IS_ANDROID_32
private static boolean
IS_ANDROID_64
(package private) static boolean
IS_BIG_ENDIAN
private static java.util.logging.Logger
logger
private static long
LONG_ARRAY_BASE_OFFSET
private static long
LONG_ARRAY_INDEX_SCALE
private static UnsafeUtil.MemoryAccessor
MEMORY_ACCESSOR
private static java.lang.Class<?>
MEMORY_CLASS
private static long
OBJECT_ARRAY_BASE_OFFSET
private static long
OBJECT_ARRAY_INDEX_SCALE
private static int
STRIDE
private static int
STRIDE_ALIGNMENT_MASK
private static sun.misc.Unsafe
UNSAFE
-
Constructor Summary
Constructors Modifier Constructor Description private
UnsafeUtil()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description (package private) static long
addressOffset(java.nio.ByteBuffer buffer)
Gets the offset of theaddress
field of the given directByteBuffer
.(package private) static <T> T
allocateInstance(java.lang.Class<T> clazz)
private static int
arrayBaseOffset(java.lang.Class<?> clazz)
private static int
arrayIndexScale(java.lang.Class<?> clazz)
private static java.lang.reflect.Field
bufferAddressField()
Finds the address field within a directBuffer
.(package private) static void
copyMemory(byte[] src, long srcIndex, byte[] target, long targetIndex, long length)
(package private) static void
copyMemory(byte[] src, long srcIndex, long targetOffset, long length)
(package private) static void
copyMemory(long srcOffset, byte[] target, long targetIndex, long length)
private static boolean
determineAndroidSupportByAddressSize(java.lang.Class<?> addressClass)
private static java.lang.reflect.Field
field(java.lang.Class<?> clazz, java.lang.String fieldName)
Gets the field with the given name within the class, ornull
if not found.private static long
fieldOffset(java.lang.reflect.Field field)
Returns the offset of the provided field, or-1
ifsun.misc.Unsafe
is not available.private static int
firstDifferingByteIndexNativeEndian(long left, long right)
Returns the index of the first byte where left and right differ, in the range [0, 8].(package private) static boolean
getBoolean(boolean[] target, long index)
(package private) static boolean
getBoolean(java.lang.Object target, long offset)
private static boolean
getBooleanBigEndian(java.lang.Object target, long offset)
private static boolean
getBooleanLittleEndian(java.lang.Object target, long offset)
(package private) static byte
getByte(byte[] target, long index)
(package private) static byte
getByte(long address)
(package private) static byte
getByte(java.lang.Object target, long offset)
private static byte
getByteBigEndian(java.lang.Object target, long offset)
private static byte
getByteLittleEndian(java.lang.Object target, long offset)
(package private) static double
getDouble(double[] target, long index)
(package private) static double
getDouble(java.lang.Object target, long offset)
(package private) static float
getFloat(float[] target, long index)
(package private) static float
getFloat(java.lang.Object target, long offset)
(package private) static int
getInt(int[] target, long index)
(package private) static int
getInt(long address)
(package private) static int
getInt(java.lang.Object target, long offset)
(package private) static long
getLong(long address)
(package private) static long
getLong(long[] target, long index)
(package private) static long
getLong(java.lang.Object target, long offset)
private static UnsafeUtil.MemoryAccessor
getMemoryAccessor()
Get aUnsafeUtil.MemoryAccessor
appropriate for the platform, or null if not supported.(package private) static java.lang.Object
getObject(java.lang.Object[] target, long index)
(package private) static java.lang.Object
getObject(java.lang.Object target, long offset)
(package private) static java.lang.Object
getStaticObject(java.lang.reflect.Field field)
(package private) static sun.misc.Unsafe
getUnsafe()
Gets thesun.misc.Unsafe
instance, ornull
if not available on this platform.(package private) static boolean
hasUnsafeArrayOperations()
(package private) static boolean
hasUnsafeByteBufferOperations()
(package private) static boolean
isAndroid64()
(package private) static int
mismatch(byte[] left, int leftOff, byte[] right, int rightOff, int length)
Returns the lowestindex
such that0 <= index < length
andleft[leftOff + index] != right[rightOff + index]
.(package private) static long
objectFieldOffset(java.lang.reflect.Field field)
(package private) static void
putBoolean(boolean[] target, long index, boolean value)
(package private) static void
putBoolean(java.lang.Object target, long offset, boolean value)
private static void
putBooleanBigEndian(java.lang.Object target, long offset, boolean value)
private static void
putBooleanLittleEndian(java.lang.Object target, long offset, boolean value)
(package private) static void
putByte(byte[] target, long index, byte value)
(package private) static void
putByte(long address, byte value)
(package private) static void
putByte(java.lang.Object target, long offset, byte value)
private static void
putByteBigEndian(java.lang.Object target, long offset, byte value)
private static void
putByteLittleEndian(java.lang.Object target, long offset, byte value)
(package private) static void
putDouble(double[] target, long index, double value)
(package private) static void
putDouble(java.lang.Object target, long offset, double value)
(package private) static void
putFloat(float[] target, long index, float value)
(package private) static void
putFloat(java.lang.Object target, long offset, float value)
(package private) static void
putInt(int[] target, long index, int value)
(package private) static void
putInt(long address, int value)
(package private) static void
putInt(java.lang.Object target, long offset, int value)
(package private) static void
putLong(long[] target, long index, long value)
(package private) static void
putLong(long address, long value)
(package private) static void
putLong(java.lang.Object target, long offset, long value)
(package private) static void
putObject(java.lang.Object[] target, long index, java.lang.Object value)
(package private) static void
putObject(java.lang.Object target, long offset, java.lang.Object value)
private static boolean
supportsUnsafeArrayOperations()
Indicates whether or not unsafe array operations are supported on this platform.private static boolean
supportsUnsafeByteBufferOperations()
-
-
-
Field Detail
-
logger
private static final java.util.logging.Logger logger
-
UNSAFE
private static final sun.misc.Unsafe UNSAFE
-
MEMORY_CLASS
private static final java.lang.Class<?> MEMORY_CLASS
-
IS_ANDROID_64
private static final boolean IS_ANDROID_64
-
IS_ANDROID_32
private static final boolean IS_ANDROID_32
-
MEMORY_ACCESSOR
private static final UnsafeUtil.MemoryAccessor MEMORY_ACCESSOR
-
HAS_UNSAFE_BYTEBUFFER_OPERATIONS
private static final boolean HAS_UNSAFE_BYTEBUFFER_OPERATIONS
-
HAS_UNSAFE_ARRAY_OPERATIONS
private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS
-
BYTE_ARRAY_BASE_OFFSET
static final long BYTE_ARRAY_BASE_OFFSET
-
BOOLEAN_ARRAY_BASE_OFFSET
private static final long BOOLEAN_ARRAY_BASE_OFFSET
-
BOOLEAN_ARRAY_INDEX_SCALE
private static final long BOOLEAN_ARRAY_INDEX_SCALE
-
INT_ARRAY_BASE_OFFSET
private static final long INT_ARRAY_BASE_OFFSET
-
INT_ARRAY_INDEX_SCALE
private static final long INT_ARRAY_INDEX_SCALE
-
LONG_ARRAY_BASE_OFFSET
private static final long LONG_ARRAY_BASE_OFFSET
-
LONG_ARRAY_INDEX_SCALE
private static final long LONG_ARRAY_INDEX_SCALE
-
FLOAT_ARRAY_BASE_OFFSET
private static final long FLOAT_ARRAY_BASE_OFFSET
-
FLOAT_ARRAY_INDEX_SCALE
private static final long FLOAT_ARRAY_INDEX_SCALE
-
DOUBLE_ARRAY_BASE_OFFSET
private static final long DOUBLE_ARRAY_BASE_OFFSET
-
DOUBLE_ARRAY_INDEX_SCALE
private static final long DOUBLE_ARRAY_INDEX_SCALE
-
OBJECT_ARRAY_BASE_OFFSET
private static final long OBJECT_ARRAY_BASE_OFFSET
-
OBJECT_ARRAY_INDEX_SCALE
private static final long OBJECT_ARRAY_INDEX_SCALE
-
BUFFER_ADDRESS_OFFSET
private static final long BUFFER_ADDRESS_OFFSET
-
STRIDE
private static final int STRIDE
- See Also:
- Constant Field Values
-
STRIDE_ALIGNMENT_MASK
private static final int STRIDE_ALIGNMENT_MASK
- See Also:
- Constant Field Values
-
BYTE_ARRAY_ALIGNMENT
private static final int BYTE_ARRAY_ALIGNMENT
-
IS_BIG_ENDIAN
static final boolean IS_BIG_ENDIAN
-
-
Method Detail
-
hasUnsafeArrayOperations
static boolean hasUnsafeArrayOperations()
-
hasUnsafeByteBufferOperations
static boolean hasUnsafeByteBufferOperations()
-
isAndroid64
static boolean isAndroid64()
-
allocateInstance
static <T> T allocateInstance(java.lang.Class<T> clazz)
-
objectFieldOffset
static long objectFieldOffset(java.lang.reflect.Field field)
-
arrayBaseOffset
private static int arrayBaseOffset(java.lang.Class<?> clazz)
-
arrayIndexScale
private static int arrayIndexScale(java.lang.Class<?> clazz)
-
getByte
static byte getByte(java.lang.Object target, long offset)
-
putByte
static void putByte(java.lang.Object target, long offset, byte value)
-
getInt
static int getInt(java.lang.Object target, long offset)
-
putInt
static void putInt(java.lang.Object target, long offset, int value)
-
getLong
static long getLong(java.lang.Object target, long offset)
-
putLong
static void putLong(java.lang.Object target, long offset, long value)
-
getBoolean
static boolean getBoolean(java.lang.Object target, long offset)
-
putBoolean
static void putBoolean(java.lang.Object target, long offset, boolean value)
-
getFloat
static float getFloat(java.lang.Object target, long offset)
-
putFloat
static void putFloat(java.lang.Object target, long offset, float value)
-
getDouble
static double getDouble(java.lang.Object target, long offset)
-
putDouble
static void putDouble(java.lang.Object target, long offset, double value)
-
getObject
static java.lang.Object getObject(java.lang.Object target, long offset)
-
putObject
static void putObject(java.lang.Object target, long offset, java.lang.Object value)
-
getByte
static byte getByte(byte[] target, long index)
-
putByte
static void putByte(byte[] target, long index, byte value)
-
getInt
static int getInt(int[] target, long index)
-
putInt
static void putInt(int[] target, long index, int value)
-
getLong
static long getLong(long[] target, long index)
-
putLong
static void putLong(long[] target, long index, long value)
-
getBoolean
static boolean getBoolean(boolean[] target, long index)
-
putBoolean
static void putBoolean(boolean[] target, long index, boolean value)
-
getFloat
static float getFloat(float[] target, long index)
-
putFloat
static void putFloat(float[] target, long index, float value)
-
getDouble
static double getDouble(double[] target, long index)
-
putDouble
static void putDouble(double[] target, long index, double value)
-
getObject
static java.lang.Object getObject(java.lang.Object[] target, long index)
-
putObject
static void putObject(java.lang.Object[] target, long index, java.lang.Object value)
-
copyMemory
static void copyMemory(byte[] src, long srcIndex, long targetOffset, long length)
-
copyMemory
static void copyMemory(long srcOffset, byte[] target, long targetIndex, long length)
-
copyMemory
static void copyMemory(byte[] src, long srcIndex, byte[] target, long targetIndex, long length)
-
getByte
static byte getByte(long address)
-
putByte
static void putByte(long address, byte value)
-
getInt
static int getInt(long address)
-
putInt
static void putInt(long address, int value)
-
getLong
static long getLong(long address)
-
putLong
static void putLong(long address, long value)
-
addressOffset
static long addressOffset(java.nio.ByteBuffer buffer)
Gets the offset of theaddress
field of the given directByteBuffer
.
-
getStaticObject
static java.lang.Object getStaticObject(java.lang.reflect.Field field)
-
getUnsafe
static sun.misc.Unsafe getUnsafe()
Gets thesun.misc.Unsafe
instance, ornull
if not available on this platform.
-
getMemoryAccessor
private static UnsafeUtil.MemoryAccessor getMemoryAccessor()
Get aUnsafeUtil.MemoryAccessor
appropriate for the platform, or null if not supported.
-
supportsUnsafeArrayOperations
private static boolean supportsUnsafeArrayOperations()
Indicates whether or not unsafe array operations are supported on this platform.
-
supportsUnsafeByteBufferOperations
private static boolean supportsUnsafeByteBufferOperations()
-
determineAndroidSupportByAddressSize
private static boolean determineAndroidSupportByAddressSize(java.lang.Class<?> addressClass)
-
bufferAddressField
private static java.lang.reflect.Field bufferAddressField()
Finds the address field within a directBuffer
.
-
firstDifferingByteIndexNativeEndian
private static int firstDifferingByteIndexNativeEndian(long left, long right)
Returns the index of the first byte where left and right differ, in the range [0, 8]. Ifleft == right
, the result will be 8, otherwise less than 8.This counts from the *first* byte, which may be the most or least significant byte depending on the system endianness.
-
mismatch
static int mismatch(byte[] left, int leftOff, byte[] right, int rightOff, int length)
Returns the lowestindex
such that0 <= index < length
andleft[leftOff + index] != right[rightOff + index]
. If no such value exists -- ifleft
andright
match up tolength
bytes from their respective offsets -- returns -1.leftOff + length
must be less than or equal toleft.length
, and the same forright
.
-
fieldOffset
private static long fieldOffset(java.lang.reflect.Field field)
Returns the offset of the provided field, or-1
ifsun.misc.Unsafe
is not available.
-
field
private static java.lang.reflect.Field field(java.lang.Class<?> clazz, java.lang.String fieldName)
Gets the field with the given name within the class, ornull
if not found.
-
getByteBigEndian
private static byte getByteBigEndian(java.lang.Object target, long offset)
-
getByteLittleEndian
private static byte getByteLittleEndian(java.lang.Object target, long offset)
-
putByteBigEndian
private static void putByteBigEndian(java.lang.Object target, long offset, byte value)
-
putByteLittleEndian
private static void putByteLittleEndian(java.lang.Object target, long offset, byte value)
-
getBooleanBigEndian
private static boolean getBooleanBigEndian(java.lang.Object target, long offset)
-
getBooleanLittleEndian
private static boolean getBooleanLittleEndian(java.lang.Object target, long offset)
-
putBooleanBigEndian
private static void putBooleanBigEndian(java.lang.Object target, long offset, boolean value)
-
putBooleanLittleEndian
private static void putBooleanLittleEndian(java.lang.Object target, long offset, boolean value)
-
-