final class oadd.com.google.protobuf.ByteBufferWriter extends java.lang.Object
{
private static final int MIN_CACHED_BUFFER_SIZE;
private static final int MAX_CACHED_BUFFER_SIZE;
private static final float BUFFER_REALLOCATION_THRESHOLD;
private static final java.lang.ThreadLocal BUFFER;
private static final java.lang.Class FILE_OUTPUT_STREAM_CLASS;
private static final long CHANNEL_FIELD_OFFSET;
private void <init>()
{
oadd.com.google.protobuf.ByteBufferWriter v;
v := @this: oadd.com.google.protobuf.ByteBufferWriter;
specialinvoke v.<java.lang.Object: void <init>()>();
return;
}
static void clearCachedBuffer()
{
java.lang.ThreadLocal v;
v = <oadd.com.google.protobuf.ByteBufferWriter: java.lang.ThreadLocal BUFFER>;
virtualinvoke v.<java.lang.ThreadLocal: void set(java.lang.Object)>(null);
return;
}
static void write(java.nio.ByteBuffer, java.io.OutputStream) throws java.io.IOException
{
java.lang.Throwable v;
byte[] v, v;
java.nio.ByteBuffer v;
int v, v, v, v, v, v, v, v, v;
boolean v, v, v;
java.io.OutputStream v;
v := @parameter: java.nio.ByteBuffer;
v := @parameter: java.io.OutputStream;
v = virtualinvoke v.<java.nio.ByteBuffer: int position()>();
label:
v = virtualinvoke v.<java.nio.ByteBuffer: boolean hasArray()>();
if v == 0 goto label;
v = virtualinvoke v.<java.nio.ByteBuffer: byte[] array()>();
v = virtualinvoke v.<java.nio.ByteBuffer: int arrayOffset()>();
v = virtualinvoke v.<java.nio.ByteBuffer: int position()>();
v = v + v;
v = virtualinvoke v.<java.nio.ByteBuffer: int remaining()>();
virtualinvoke v.<java.io.OutputStream: void write(byte[],int,int)>(v, v, v);
goto label;
label:
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: boolean writeToChannel(java.nio.ByteBuffer,java.io.OutputStream)>(v, v);
if v != 0 goto label;
v = virtualinvoke v.<java.nio.ByteBuffer: int remaining()>();
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: byte[] getOrCreateBuffer(int)>(v);
label:
v = virtualinvoke v.<java.nio.ByteBuffer: boolean hasRemaining()>();
if v == 0 goto label;
v = virtualinvoke v.<java.nio.ByteBuffer: int remaining()>();
v = lengthof v;
v = staticinvoke <java.lang.Math: int min(int,int)>(v, v);
virtualinvoke v.<java.nio.ByteBuffer: java.nio.ByteBuffer get(byte[],int,int)>(v, 0, v);
virtualinvoke v.<java.io.OutputStream: void write(byte[],int,int)>(v, 0, v);
goto label;
label:
virtualinvoke v.<java.nio.ByteBuffer: java.nio.ByteBuffer position(int)>(v);
goto label;
label:
v := @caughtexception;
virtualinvoke v.<java.nio.ByteBuffer: java.nio.ByteBuffer position(int)>(v);
throw v;
label:
return;
catch java.lang.Throwable from label to label with label;
}
private static byte[] getOrCreateBuffer(int)
{
byte[] v;
int v, v, v;
boolean v;
v := @parameter: int;
v = staticinvoke <java.lang.Math: int max(int,int)>(v, 1024);
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: byte[] getBuffer()>();
if v == null goto label;
v = lengthof v;
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: boolean needToReallocate(int,int)>(v, v);
if v == 0 goto label;
label:
v = newarray (byte)[v];
if v > 16384 goto label;
staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: void setBuffer(byte[])>(v);
label:
return v;
}
private static boolean needToReallocate(int, int)
{
byte v;
int v, v;
float v;
boolean v;
v := @parameter: int;
v := @parameter: int;
if v >= v goto label;
v = v * 0.5F;
v = v cmpg v;
if v >= 0 goto label;
v = 1;
goto label;
label:
v = 0;
label:
return v;
}
private static byte[] getBuffer()
{
java.lang.Object v, v;
java.lang.ThreadLocal v;
v = <oadd.com.google.protobuf.ByteBufferWriter: java.lang.ThreadLocal BUFFER>;
v = virtualinvoke v.<java.lang.ThreadLocal: java.lang.Object get()>();
if v == null goto label;
v = virtualinvoke v.<java.lang.ref.SoftReference: java.lang.Object get()>();
label:
return v;
}
private static void setBuffer(byte[])
{
byte[] v;
java.lang.ThreadLocal v;
java.lang.ref.SoftReference v;
v := @parameter: byte[];
v = <oadd.com.google.protobuf.ByteBufferWriter: java.lang.ThreadLocal BUFFER>;
v = new java.lang.ref.SoftReference;
specialinvoke v.<java.lang.ref.SoftReference: void <init>(java.lang.Object)>(v);
virtualinvoke v.<java.lang.ThreadLocal: void set(java.lang.Object)>(v);
return;
}
private static boolean writeToChannel(java.nio.ByteBuffer, java.io.OutputStream) throws java.io.IOException
{
java.io.OutputStream v;
long v, v;
java.lang.ClassCastException v;
java.nio.ByteBuffer v;
byte v;
java.lang.Class v;
java.lang.Object v;
boolean v;
v := @parameter: java.nio.ByteBuffer;
v := @parameter: java.io.OutputStream;
v = <oadd.com.google.protobuf.ByteBufferWriter: long CHANNEL_FIELD_OFFSET>;
v = v cmp 0L;
if v < 0 goto label;
v = <oadd.com.google.protobuf.ByteBufferWriter: java.lang.Class FILE_OUTPUT_STREAM_CLASS>;
v = virtualinvoke v.<java.lang.Class: boolean isInstance(java.lang.Object)>(v);
if v == 0 goto label;
label:
v = <oadd.com.google.protobuf.ByteBufferWriter: long CHANNEL_FIELD_OFFSET>;
v = staticinvoke <oadd.com.google.protobuf.UnsafeUtil: java.lang.Object getObject(java.lang.Object,long)>(v, v);
label:
goto label;
label:
v := @caughtexception;
label:
if v == null goto label;
interfaceinvoke v.<java.nio.channels.WritableByteChannel: int write(java.nio.ByteBuffer)>(v);
return 1;
label:
return 0;
catch java.lang.ClassCastException from label to label with label;
}
private static java.lang.Class safeGetClass(java.lang.String)
{
java.lang.Class v;
java.lang.ClassNotFoundException v;
java.lang.String v;
v := @parameter: java.lang.String;
label:
v = staticinvoke <java.lang.Class: java.lang.Class forName(java.lang.String)>(v);
label:
return v;
label:
v := @caughtexception;
return null;
catch java.lang.ClassNotFoundException from label to label with label;
}
private static long getChannelFieldOffset(java.lang.Class)
{
java.lang.Throwable v;
java.lang.Class v;
long v;
java.lang.reflect.Field v;
boolean v;
v := @parameter: java.lang.Class;
label:
if v == null goto label;
v = staticinvoke <oadd.com.google.protobuf.UnsafeUtil: boolean hasUnsafeArrayOperations()>();
if v == 0 goto label;
v = virtualinvoke v.<java.lang.Class: java.lang.reflect.Field getDeclaredField(java.lang.String)>("channel");
v = staticinvoke <oadd.com.google.protobuf.UnsafeUtil: long objectFieldOffset(java.lang.reflect.Field)>(v);
label:
return v;
label:
v := @caughtexception;
label:
return -1L;
catch java.lang.Throwable from label to label with label;
}
static void <clinit>()
{
java.lang.ThreadLocal v;
java.lang.Class v, v;
long v;
v = new java.lang.ThreadLocal;
specialinvoke v.<java.lang.ThreadLocal: void <init>()>();
<oadd.com.google.protobuf.ByteBufferWriter: java.lang.ThreadLocal BUFFER> = v;
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: java.lang.Class safeGetClass(java.lang.String)>("java.io.FileOutputStream");
<oadd.com.google.protobuf.ByteBufferWriter: java.lang.Class FILE_OUTPUT_STREAM_CLASS> = v;
v = <oadd.com.google.protobuf.ByteBufferWriter: java.lang.Class FILE_OUTPUT_STREAM_CLASS>;
v = staticinvoke <oadd.com.google.protobuf.ByteBufferWriter: long getChannelFieldOffset(java.lang.Class)>(v);
<oadd.com.google.protobuf.ByteBufferWriter: long CHANNEL_FIELD_OFFSET> = v;
return;
}
}