mirror of
https://github.com/VibedByKaKi/alexandroid.git
synced 2026-11-14 18:07:16 +01:00
504 lines
18 KiB
Java
504 lines
18 KiB
Java
package com.google.protobuf;
|
|
|
|
import java.nio.Buffer;
|
|
import java.nio.ByteBuffer;
|
|
import java.security.AccessController;
|
|
import java.security.PrivilegedExceptionAction;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import sun.misc.Unsafe;
|
|
|
|
/* compiled from: r8-map-id-b9432e0f623b4a4bff4ba50a8a24c4aafad2c1e11092747b9fb5e6a22af5a940 */
|
|
/* loaded from: classes8.dex */
|
|
final class UnsafeUtil {
|
|
private static final Logger logger = Logger.getLogger(UnsafeUtil.class.getName());
|
|
private static final Unsafe UNSAFE = getUnsafe();
|
|
private static final MemoryAccessor MEMORY_ACCESSOR = getMemoryAccessor();
|
|
private static final boolean HAS_UNSAFE_BYTEBUFFER_OPERATIONS = supportsUnsafeByteBufferOperations();
|
|
private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS = supportsUnsafeArrayOperations();
|
|
private static final long BYTE_ARRAY_BASE_OFFSET = arrayBaseOffset(byte[].class);
|
|
private static final long BOOLEAN_ARRAY_BASE_OFFSET = arrayBaseOffset(boolean[].class);
|
|
private static final long BOOLEAN_ARRAY_INDEX_SCALE = arrayIndexScale(boolean[].class);
|
|
private static final long INT_ARRAY_BASE_OFFSET = arrayBaseOffset(int[].class);
|
|
private static final long INT_ARRAY_INDEX_SCALE = arrayIndexScale(int[].class);
|
|
private static final long LONG_ARRAY_BASE_OFFSET = arrayBaseOffset(long[].class);
|
|
private static final long LONG_ARRAY_INDEX_SCALE = arrayIndexScale(long[].class);
|
|
private static final long FLOAT_ARRAY_BASE_OFFSET = arrayBaseOffset(float[].class);
|
|
private static final long FLOAT_ARRAY_INDEX_SCALE = arrayIndexScale(float[].class);
|
|
private static final long DOUBLE_ARRAY_BASE_OFFSET = arrayBaseOffset(double[].class);
|
|
private static final long DOUBLE_ARRAY_INDEX_SCALE = arrayIndexScale(double[].class);
|
|
private static final long OBJECT_ARRAY_BASE_OFFSET = arrayBaseOffset(Object[].class);
|
|
private static final long OBJECT_ARRAY_INDEX_SCALE = arrayIndexScale(Object[].class);
|
|
private static final long BUFFER_ADDRESS_OFFSET = fieldOffset(bufferAddressField());
|
|
|
|
/* compiled from: r8-map-id-b9432e0f623b4a4bff4ba50a8a24c4aafad2c1e11092747b9fb5e6a22af5a940 */
|
|
public static abstract class MemoryAccessor {
|
|
Unsafe unsafe;
|
|
|
|
public MemoryAccessor(Unsafe unsafe) {
|
|
this.unsafe = unsafe;
|
|
}
|
|
|
|
public final int arrayBaseOffset(Class<?> cls) {
|
|
return this.unsafe.arrayBaseOffset(cls);
|
|
}
|
|
|
|
public final int arrayIndexScale(Class<?> cls) {
|
|
return this.unsafe.arrayIndexScale(cls);
|
|
}
|
|
|
|
public abstract void copyMemory(long j, byte[] bArr, long j2, long j3);
|
|
|
|
public abstract void copyMemory(byte[] bArr, long j, long j2, long j3);
|
|
|
|
public abstract boolean getBoolean(Object obj, long j);
|
|
|
|
public abstract byte getByte(long j);
|
|
|
|
public abstract byte getByte(Object obj, long j);
|
|
|
|
public abstract double getDouble(Object obj, long j);
|
|
|
|
public abstract float getFloat(Object obj, long j);
|
|
|
|
public abstract int getInt(long j);
|
|
|
|
public final int getInt(Object obj, long j) {
|
|
return this.unsafe.getInt(obj, j);
|
|
}
|
|
|
|
public abstract long getLong(long j);
|
|
|
|
public final long getLong(Object obj, long j) {
|
|
return this.unsafe.getLong(obj, j);
|
|
}
|
|
|
|
public final Object getObject(Object obj, long j) {
|
|
return this.unsafe.getObject(obj, j);
|
|
}
|
|
|
|
public abstract Object getStaticObject(java.lang.reflect.Field field);
|
|
|
|
public final long objectFieldOffset(java.lang.reflect.Field field) {
|
|
return this.unsafe.objectFieldOffset(field);
|
|
}
|
|
|
|
public abstract void putBoolean(Object obj, long j, boolean z);
|
|
|
|
public abstract void putByte(long j, byte b);
|
|
|
|
public abstract void putByte(Object obj, long j, byte b);
|
|
|
|
public abstract void putDouble(Object obj, long j, double d);
|
|
|
|
public abstract void putFloat(Object obj, long j, float f);
|
|
|
|
public abstract void putInt(long j, int i);
|
|
|
|
public final void putInt(Object obj, long j, int i) {
|
|
this.unsafe.putInt(obj, j, i);
|
|
}
|
|
|
|
public abstract void putLong(long j, long j2);
|
|
|
|
public final void putLong(Object obj, long j, long j2) {
|
|
this.unsafe.putLong(obj, j, j2);
|
|
}
|
|
|
|
public final void putObject(Object obj, long j, Object obj2) {
|
|
this.unsafe.putObject(obj, j, obj2);
|
|
}
|
|
}
|
|
|
|
private UnsafeUtil() {
|
|
}
|
|
|
|
public static long addressOffset(ByteBuffer byteBuffer) {
|
|
return MEMORY_ACCESSOR.getLong(byteBuffer, BUFFER_ADDRESS_OFFSET);
|
|
}
|
|
|
|
private static int arrayBaseOffset(Class<?> cls) {
|
|
if (HAS_UNSAFE_ARRAY_OPERATIONS) {
|
|
return MEMORY_ACCESSOR.arrayBaseOffset(cls);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
private static int arrayIndexScale(Class<?> cls) {
|
|
if (HAS_UNSAFE_ARRAY_OPERATIONS) {
|
|
return MEMORY_ACCESSOR.arrayIndexScale(cls);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
private static java.lang.reflect.Field bufferAddressField() {
|
|
return field(Buffer.class, "address");
|
|
}
|
|
|
|
public static void copyMemory(byte[] bArr, long j, long j2, long j3) {
|
|
MEMORY_ACCESSOR.copyMemory(bArr, j, j2, j3);
|
|
}
|
|
|
|
private static java.lang.reflect.Field field(Class<?> cls, String str) {
|
|
try {
|
|
java.lang.reflect.Field declaredField = cls.getDeclaredField(str);
|
|
declaredField.setAccessible(true);
|
|
return declaredField;
|
|
} catch (Throwable unused) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static long fieldOffset(java.lang.reflect.Field field) {
|
|
MemoryAccessor memoryAccessor;
|
|
if (field == null || (memoryAccessor = MEMORY_ACCESSOR) == null) {
|
|
return -1L;
|
|
}
|
|
return memoryAccessor.objectFieldOffset(field);
|
|
}
|
|
|
|
public static boolean getBoolean(boolean[] zArr, long j) {
|
|
return MEMORY_ACCESSOR.getBoolean(zArr, (j * BOOLEAN_ARRAY_INDEX_SCALE) + BOOLEAN_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
public static byte getByte(byte[] bArr, long j) {
|
|
return MEMORY_ACCESSOR.getByte(bArr, BYTE_ARRAY_BASE_OFFSET + j);
|
|
}
|
|
|
|
private static <T> Class<T> getClassForName(String str) {
|
|
try {
|
|
return (Class<T>) Class.forName(str);
|
|
} catch (Throwable unused) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static double getDouble(double[] dArr, long j) {
|
|
return MEMORY_ACCESSOR.getDouble(dArr, (j * DOUBLE_ARRAY_INDEX_SCALE) + DOUBLE_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
public static float getFloat(float[] fArr, long j) {
|
|
return MEMORY_ACCESSOR.getFloat(fArr, (j * FLOAT_ARRAY_INDEX_SCALE) + FLOAT_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
public static int getInt(int[] iArr, long j) {
|
|
return MEMORY_ACCESSOR.getInt(iArr, (j * INT_ARRAY_INDEX_SCALE) + INT_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
public static long getLong(long[] jArr, long j) {
|
|
return MEMORY_ACCESSOR.getLong(jArr, (j * LONG_ARRAY_INDEX_SCALE) + LONG_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
private static MemoryAccessor getMemoryAccessor() {
|
|
Unsafe unsafe = UNSAFE;
|
|
if (unsafe == null) {
|
|
return null;
|
|
}
|
|
return new JvmMemoryAccessor(unsafe);
|
|
}
|
|
|
|
public static Object getObject(Object[] objArr, long j) {
|
|
return MEMORY_ACCESSOR.getObject(objArr, (j * OBJECT_ARRAY_INDEX_SCALE) + OBJECT_ARRAY_BASE_OFFSET);
|
|
}
|
|
|
|
public static Object getStaticObject(java.lang.reflect.Field field) {
|
|
return MEMORY_ACCESSOR.getStaticObject(field);
|
|
}
|
|
|
|
private static Unsafe getUnsafe() {
|
|
try {
|
|
return (Unsafe) AccessController.doPrivileged(new PrivilegedExceptionAction<Unsafe>() { // from class: com.google.protobuf.UnsafeUtil.1
|
|
@Override // java.security.PrivilegedExceptionAction
|
|
public Unsafe run() throws Exception {
|
|
for (java.lang.reflect.Field field : Unsafe.class.getDeclaredFields()) {
|
|
field.setAccessible(true);
|
|
Object obj = field.get(null);
|
|
if (Unsafe.class.isInstance(obj)) {
|
|
return (Unsafe) Unsafe.class.cast(obj);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
});
|
|
} catch (Throwable unused) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static boolean hasUnsafeArrayOperations() {
|
|
return HAS_UNSAFE_ARRAY_OPERATIONS;
|
|
}
|
|
|
|
public static boolean hasUnsafeByteBufferOperations() {
|
|
return HAS_UNSAFE_BYTEBUFFER_OPERATIONS;
|
|
}
|
|
|
|
public static long objectFieldOffset(java.lang.reflect.Field field) {
|
|
return MEMORY_ACCESSOR.objectFieldOffset(field);
|
|
}
|
|
|
|
public static void putBoolean(boolean[] zArr, long j, boolean z) {
|
|
MEMORY_ACCESSOR.putBoolean(zArr, (j * BOOLEAN_ARRAY_INDEX_SCALE) + BOOLEAN_ARRAY_BASE_OFFSET, z);
|
|
}
|
|
|
|
public static void putByte(byte[] bArr, long j, byte b) {
|
|
MEMORY_ACCESSOR.putByte(bArr, BYTE_ARRAY_BASE_OFFSET + j, b);
|
|
}
|
|
|
|
public static void putDouble(double[] dArr, long j, double d) {
|
|
MEMORY_ACCESSOR.putDouble(dArr, (j * DOUBLE_ARRAY_INDEX_SCALE) + DOUBLE_ARRAY_BASE_OFFSET, d);
|
|
}
|
|
|
|
public static void putFloat(float[] fArr, long j, float f) {
|
|
MEMORY_ACCESSOR.putFloat(fArr, (j * FLOAT_ARRAY_INDEX_SCALE) + FLOAT_ARRAY_BASE_OFFSET, f);
|
|
}
|
|
|
|
public static void putInt(int[] iArr, long j, int i) {
|
|
MEMORY_ACCESSOR.putInt(iArr, (j * INT_ARRAY_INDEX_SCALE) + INT_ARRAY_BASE_OFFSET, i);
|
|
}
|
|
|
|
public static void putLong(long[] jArr, long j, long j2) {
|
|
MEMORY_ACCESSOR.putLong(jArr, (j * LONG_ARRAY_INDEX_SCALE) + LONG_ARRAY_BASE_OFFSET, j2);
|
|
}
|
|
|
|
public static void putObject(Object[] objArr, long j, Object obj) {
|
|
MEMORY_ACCESSOR.putObject(objArr, (j * OBJECT_ARRAY_INDEX_SCALE) + OBJECT_ARRAY_BASE_OFFSET, obj);
|
|
}
|
|
|
|
private static boolean supportsUnsafeArrayOperations() {
|
|
Unsafe unsafe = UNSAFE;
|
|
if (unsafe == null) {
|
|
return false;
|
|
}
|
|
try {
|
|
Class<?> cls = unsafe.getClass();
|
|
cls.getMethod("objectFieldOffset", java.lang.reflect.Field.class);
|
|
cls.getMethod("arrayBaseOffset", Class.class);
|
|
cls.getMethod("arrayIndexScale", Class.class);
|
|
Class cls2 = Long.TYPE;
|
|
cls.getMethod("getInt", Object.class, cls2);
|
|
cls.getMethod("putInt", Object.class, cls2, Integer.TYPE);
|
|
cls.getMethod("getLong", Object.class, cls2);
|
|
cls.getMethod("putLong", Object.class, cls2, cls2);
|
|
cls.getMethod("getObject", Object.class, cls2);
|
|
cls.getMethod("putObject", Object.class, cls2, Object.class);
|
|
cls.getMethod("getByte", Object.class, cls2);
|
|
cls.getMethod("putByte", Object.class, cls2, Byte.TYPE);
|
|
cls.getMethod("getBoolean", Object.class, cls2);
|
|
cls.getMethod("putBoolean", Object.class, cls2, Boolean.TYPE);
|
|
cls.getMethod("getFloat", Object.class, cls2);
|
|
cls.getMethod("putFloat", Object.class, cls2, Float.TYPE);
|
|
cls.getMethod("getDouble", Object.class, cls2);
|
|
cls.getMethod("putDouble", Object.class, cls2, Double.TYPE);
|
|
return true;
|
|
} catch (Throwable th) {
|
|
logger.log(Level.WARNING, "platform method missing - proto runtime falling back to safer methods: " + th);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private static boolean supportsUnsafeByteBufferOperations() {
|
|
Unsafe unsafe = UNSAFE;
|
|
if (unsafe == null) {
|
|
return false;
|
|
}
|
|
try {
|
|
Class<?> cls = unsafe.getClass();
|
|
cls.getMethod("objectFieldOffset", java.lang.reflect.Field.class);
|
|
Class cls2 = Long.TYPE;
|
|
cls.getMethod("getLong", Object.class, cls2);
|
|
cls.getMethod("getByte", cls2);
|
|
cls.getMethod("putByte", cls2, Byte.TYPE);
|
|
cls.getMethod("getInt", cls2);
|
|
cls.getMethod("putInt", cls2, Integer.TYPE);
|
|
cls.getMethod("getLong", cls2);
|
|
cls.getMethod("putLong", cls2, cls2);
|
|
cls.getMethod("copyMemory", cls2, cls2, cls2);
|
|
cls.getMethod("copyMemory", Object.class, cls2, Object.class, cls2, cls2);
|
|
return true;
|
|
} catch (Throwable th) {
|
|
logger.log(Level.WARNING, "platform method missing - proto runtime falling back to safer methods: " + th);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* compiled from: r8-map-id-b9432e0f623b4a4bff4ba50a8a24c4aafad2c1e11092747b9fb5e6a22af5a940 */
|
|
public static final class JvmMemoryAccessor extends MemoryAccessor {
|
|
public JvmMemoryAccessor(Unsafe unsafe) {
|
|
super(unsafe);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void copyMemory(long j, byte[] bArr, long j2, long j3) {
|
|
this.unsafe.copyMemory((Object) null, j, bArr, UnsafeUtil.BYTE_ARRAY_BASE_OFFSET + j2, j3);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public boolean getBoolean(Object obj, long j) {
|
|
return this.unsafe.getBoolean(obj, j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public byte getByte(long j) {
|
|
return this.unsafe.getByte(j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public double getDouble(Object obj, long j) {
|
|
return this.unsafe.getDouble(obj, j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public float getFloat(Object obj, long j) {
|
|
return this.unsafe.getFloat(obj, j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public int getInt(long j) {
|
|
return this.unsafe.getInt(j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public long getLong(long j) {
|
|
return this.unsafe.getLong(j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public Object getStaticObject(java.lang.reflect.Field field) {
|
|
return getObject(this.unsafe.staticFieldBase(field), this.unsafe.staticFieldOffset(field));
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putBoolean(Object obj, long j, boolean z) {
|
|
this.unsafe.putBoolean(obj, j, z);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putByte(long j, byte b) {
|
|
this.unsafe.putByte(j, b);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putDouble(Object obj, long j, double d) {
|
|
this.unsafe.putDouble(obj, j, d);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putFloat(Object obj, long j, float f) {
|
|
this.unsafe.putFloat(obj, j, f);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putInt(long j, int i) {
|
|
this.unsafe.putInt(j, i);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putLong(long j, long j2) {
|
|
this.unsafe.putLong(j, j2);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void putByte(Object obj, long j, byte b) {
|
|
this.unsafe.putByte(obj, j, b);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public byte getByte(Object obj, long j) {
|
|
return this.unsafe.getByte(obj, j);
|
|
}
|
|
|
|
@Override // com.google.protobuf.UnsafeUtil.MemoryAccessor
|
|
public void copyMemory(byte[] bArr, long j, long j2, long j3) {
|
|
this.unsafe.copyMemory(bArr, UnsafeUtil.BYTE_ARRAY_BASE_OFFSET + j, (Object) null, j2, j3);
|
|
}
|
|
}
|
|
|
|
public static void putByte(Object obj, long j, byte b) {
|
|
MEMORY_ACCESSOR.putByte(obj, j, b);
|
|
}
|
|
|
|
public static void copyMemory(long j, byte[] bArr, long j2, long j3) {
|
|
MEMORY_ACCESSOR.copyMemory(j, bArr, j2, j3);
|
|
}
|
|
|
|
public static byte getByte(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getByte(obj, j);
|
|
}
|
|
|
|
public static void putByte(long j, byte b) {
|
|
MEMORY_ACCESSOR.putByte(j, b);
|
|
}
|
|
|
|
public static void copyMemory(byte[] bArr, long j, byte[] bArr2, long j2, long j3) {
|
|
System.arraycopy(bArr, (int) j, bArr2, (int) j2, (int) j3);
|
|
}
|
|
|
|
public static byte getByte(long j) {
|
|
return MEMORY_ACCESSOR.getByte(j);
|
|
}
|
|
|
|
public static void putBoolean(Object obj, long j, boolean z) {
|
|
MEMORY_ACCESSOR.putBoolean(obj, j, z);
|
|
}
|
|
|
|
public static void putFloat(Object obj, long j, float f) {
|
|
MEMORY_ACCESSOR.putFloat(obj, j, f);
|
|
}
|
|
|
|
public static void putInt(Object obj, long j, int i) {
|
|
MEMORY_ACCESSOR.putInt(obj, j, i);
|
|
}
|
|
|
|
public static void putObject(Object obj, long j, Object obj2) {
|
|
MEMORY_ACCESSOR.putObject(obj, j, obj2);
|
|
}
|
|
|
|
public static boolean getBoolean(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getBoolean(obj, j);
|
|
}
|
|
|
|
public static double getDouble(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getDouble(obj, j);
|
|
}
|
|
|
|
public static float getFloat(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getFloat(obj, j);
|
|
}
|
|
|
|
public static int getInt(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getInt(obj, j);
|
|
}
|
|
|
|
public static long getLong(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getLong(obj, j);
|
|
}
|
|
|
|
public static Object getObject(Object obj, long j) {
|
|
return MEMORY_ACCESSOR.getObject(obj, j);
|
|
}
|
|
|
|
public static void putInt(long j, int i) {
|
|
MEMORY_ACCESSOR.putInt(j, i);
|
|
}
|
|
|
|
public static int getInt(long j) {
|
|
return MEMORY_ACCESSOR.getInt(j);
|
|
}
|
|
|
|
public static long getLong(long j) {
|
|
return MEMORY_ACCESSOR.getLong(j);
|
|
}
|
|
|
|
public static void putDouble(Object obj, long j, double d) {
|
|
MEMORY_ACCESSOR.putDouble(obj, j, d);
|
|
}
|
|
|
|
public static void putLong(Object obj, long j, long j2) {
|
|
MEMORY_ACCESSOR.putLong(obj, j, j2);
|
|
}
|
|
|
|
public static void putLong(long j, long j2) {
|
|
MEMORY_ACCESSOR.putLong(j, j2);
|
|
}
|
|
}
|