ThreadLocalCache.smali 
.class public Lcom/alibaba/fastjson/util/ThreadLocalCache;
.super Ljava/lang/Object;
.source "ThreadLocalCache.java"
# static fields
.field static final synthetic $assertionsDisabled:Z = false
.field public static final BYTES_CACH_INIT_SIZE:I = 0x400
.field public static final BYTES_CACH_INIT_SIZE_EXP:I = 0xa
.field public static final BYTES_CACH_MAX_SIZE:I = 0x20000
.field public static final BYTES_CACH_MAX_SIZE_EXP:I = 0x11
.field public static final CHARS_CACH_INIT_SIZE:I = 0x400
.field public static final CHARS_CACH_INIT_SIZE_EXP:I = 0xa
.field public static final CHARS_CACH_MAX_SIZE:I = 0x20000
.field public static final CHARS_CACH_MAX_SIZE_EXP:I = 0x11
.field private static final bytesBufLocal:Ljava/lang/ThreadLocal;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/lang/ThreadLocal<",
            "Ljava/lang/ref/SoftReference<",
            "[B>;>;"
        }
    .end annotation
.end field
.field private static final charsBufLocal:Ljava/lang/ThreadLocal;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/lang/ThreadLocal<",
            "Ljava/lang/ref/SoftReference<",
            "[C>;>;"
        }
    .end annotation
.end field
.field private static final decoderLocal:Ljava/lang/ThreadLocal;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/lang/ThreadLocal<",
            "Ljava/nio/charset/CharsetDecoder;",
            ">;"
        }
    .end annotation
.end field
# direct methods
.method static constructor <clinit>()V
    .registers 1
    .line 15
    new-instance v0, Ljava/lang/ThreadLocal;
    invoke-direct {v0}, Ljava/lang/ThreadLocal;-><init>()V
    sput-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->charsBufLocal:Ljava/lang/ThreadLocal;
    .line 17
    new-instance v0, Ljava/lang/ThreadLocal;
    invoke-direct {v0}, Ljava/lang/ThreadLocal;-><init>()V
    sput-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->decoderLocal:Ljava/lang/ThreadLocal;
    .line 81
    new-instance v0, Ljava/lang/ThreadLocal;
    invoke-direct {v0}, Ljava/lang/ThreadLocal;-><init>()V
    sput-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->bytesBufLocal:Ljava/lang/ThreadLocal;
    return-void
.end method
.method public constructor <init>()V
    .registers 1
    .line 9
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method
.method private static allocate(I)[C
    .registers 3
    const/high16 v0, 0x20000
    if-le p0, v0, :cond_7
    .line 54
    new-array p0, p0, [C
    return-object p0
    :cond_7
    const/16 v0, 0xa
    const/16 v1, 0x11
    .line 57
    invoke-static {v0, v1, p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->getAllocateLengthExp(III)I
    move-result p0
    .line 58
    new-array p0, p0, [C
    .line 59
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->charsBufLocal:Ljava/lang/ThreadLocal;
    new-instance v1, Ljava/lang/ref/SoftReference;
    invoke-direct {v1, p0}, Ljava/lang/ref/SoftReference;-><init>(Ljava/lang/Object;)V
    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    return-object p0
.end method
.method private static allocateBytes(I)[B
    .registers 3
    const/high16 v0, 0x20000
    if-le p0, v0, :cond_7
    .line 109
    new-array p0, p0, [B
    return-object p0
    :cond_7
    const/16 v0, 0xa
    const/16 v1, 0x11
    .line 112
    invoke-static {v0, v1, p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->getAllocateLengthExp(III)I
    move-result p0
    .line 113
    new-array p0, p0, [B
    .line 114
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->bytesBufLocal:Ljava/lang/ThreadLocal;
    new-instance v1, Ljava/lang/ref/SoftReference;
    invoke-direct {v1, p0}, Ljava/lang/ref/SoftReference;-><init>(Ljava/lang/Object;)V
    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    return-object p0
.end method
.method public static clearBytes()V
    .registers 2
    .line 84
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->bytesBufLocal:Ljava/lang/ThreadLocal;
    const/4 v1, 0x0
    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    return-void
.end method
.method public static clearChars()V
    .registers 2
    .line 29
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->charsBufLocal:Ljava/lang/ThreadLocal;
    const/4 v1, 0x0
    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    return-void
.end method
.method private static getAllocateLengthExp(III)I
    .registers 4
    ushr-int p1, p2, p0
    const/4 v0, 0x1
    if-gtz p1, :cond_8
    shl-int p0, v0, p0
    return p0
    :cond_8
    sub-int/2addr p2, v0
    .line 73
    invoke-static {p2}, Ljava/lang/Integer;->numberOfLeadingZeros(I)I
    move-result p0
    rsub-int/lit8 p0, p0, 0x20
    shl-int p0, v0, p0
    return p0
.end method
.method public static getBytes(I)[B
    .registers 3
    .line 88
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->bytesBufLocal:Ljava/lang/ThreadLocal;
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, Ljava/lang/ref/SoftReference;
    if-nez v0, :cond_f
    .line 91
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocateBytes(I)[B
    move-result-object p0
    return-object p0
    .line 94
    :cond_f
    invoke-virtual {v0}, Ljava/lang/ref/SoftReference;->get()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, [B
    if-nez v0, :cond_1c
    .line 97
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocateBytes(I)[B
    move-result-object p0
    return-object p0
    .line 100
    :cond_1c
    array-length v1, v0
    if-ge v1, p0, :cond_23
    .line 101
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocateBytes(I)[B
    move-result-object v0
    :cond_23
    return-object v0
.end method
.method public static getChars(I)[C
    .registers 3
    .line 33
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->charsBufLocal:Ljava/lang/ThreadLocal;
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, Ljava/lang/ref/SoftReference;
    if-nez v0, :cond_f
    .line 36
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocate(I)[C
    move-result-object p0
    return-object p0
    .line 39
    :cond_f
    invoke-virtual {v0}, Ljava/lang/ref/SoftReference;->get()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, [C
    if-nez v0, :cond_1c
    .line 42
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocate(I)[C
    move-result-object p0
    return-object p0
    .line 45
    :cond_1c
    array-length v1, v0
    if-ge v1, p0, :cond_23
    .line 46
    invoke-static {p0}, Lcom/alibaba/fastjson/util/ThreadLocalCache;->allocate(I)[C
    move-result-object v0
    :cond_23
    return-object v0
.end method
.method public static getUTF8Decoder()Ljava/nio/charset/CharsetDecoder;
    .registers 2
    .line 20
    sget-object v0, Lcom/alibaba/fastjson/util/ThreadLocalCache;->decoderLocal:Ljava/lang/ThreadLocal;
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
    move-result-object v1
    check-cast v1, Ljava/nio/charset/CharsetDecoder;
    if-nez v1, :cond_12
    .line 22
    new-instance v1, Lcom/alibaba/fastjson/util/UTF8Decoder;
    invoke-direct {v1}, Lcom/alibaba/fastjson/util/UTF8Decoder;-><init>()V
    .line 23
    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    :cond_12
    return-object v1
.end method