SymbolTable.smali

.class public Lcom/alibaba/fastjson/parser/SymbolTable;
.super Ljava/lang/Object;
.source "SymbolTable.java"


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    }
.end annotation


# static fields
.field public static final DEFAULT_TABLE_SIZE:I

.field public static final MAX_BUCKET_LENTH:I

.field public static final MAX_SIZE:I


# instance fields
.field private final buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

.field private final indexMask:I

.field private size:I

.field private final symbols:[Ljava/lang/String;

.field private final symbols_char:[[C


# direct methods
.method static constructor <clinit>()V
    .registers 1

    const v0, 0x176f

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/alibaba/fastjson/parser/SymbolTable;->DEFAULT_TABLE_SIZE:I

    const v0, 0x1567

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/alibaba/fastjson/parser/SymbolTable;->MAX_BUCKET_LENTH:I

    const v0, 0x56f

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/alibaba/fastjson/parser/SymbolTable;->MAX_SIZE:I

    return-void
.end method

.method public constructor <init>()V
    .registers 5

    .line 38
    const/16 v0, 0x200

    invoke-direct {p0, v0}, Lcom/alibaba/fastjson/parser/SymbolTable;-><init>(I)V

    .line 39
    const-string v0, "$ref"

    invoke-virtual {v0}, Ljava/lang/String;->hashCode()I

    move-result v1

    const/4 v2, 0x0

    const/4 v3, 0x4

    invoke-virtual {p0, v0, v2, v3, v1}, Lcom/alibaba/fastjson/parser/SymbolTable;->addSymbol(Ljava/lang/String;III)Ljava/lang/String;

    .line 40
    sget-object v0, Lcom/alibaba/fastjson/JSON;->DEFAULT_TYPE_KEY:Ljava/lang/String;

    sget-object v1, Lcom/alibaba/fastjson/JSON;->DEFAULT_TYPE_KEY:Ljava/lang/String;

    invoke-virtual {v1}, Ljava/lang/String;->hashCode()I

    move-result v1

    const/4 v3, 0x5

    invoke-virtual {p0, v0, v2, v3, v1}, Lcom/alibaba/fastjson/parser/SymbolTable;->addSymbol(Ljava/lang/String;III)Ljava/lang/String;

    .line 41
    return-void
.end method

.method public constructor <init>(I)V
    .registers 3
    .param p1, "tableSize"    # I

    .line 43
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 35
    const/4 v0, 0x0

    iput v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    .line 44
    add-int/lit8 v0, p1, -0x1

    iput v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->indexMask:I

    .line 45
    new-array v0, p1, [Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    iput-object v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    .line 46
    new-array v0, p1, [Ljava/lang/String;

    iput-object v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols:[Ljava/lang/String;

    .line 47
    new-array v0, p1, [[C

    iput-object v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols_char:[[C

    .line 48
    return-void
.end method

.method static synthetic access$000(Ljava/lang/String;II)Ljava/lang/String;
    .registers 4
    .param p0, "x0"    # Ljava/lang/String;
    .param p1, "x1"    # I
    .param p2, "x2"    # I

    .line 23
    invoke-static {p0, p1, p2}, Lcom/alibaba/fastjson/parser/SymbolTable;->subString(Ljava/lang/String;II)Ljava/lang/String;

    move-result-object v0

    return-object v0
.end method

.method public static final hash([CII)I
    .registers 8
    .param p0, "buffer"    # [C
    .param p1, "offset"    # I
    .param p2, "len"    # I

    .line 212
    const/4 v0, 0x0

    .line 213
    .local v0, "h":I
    move v1, p1

    .line 215
    .local v1, "off":I
    const/4 v2, 0x0

    .local v2, "i":I
    :goto_3
    if-ge v2, p2, :cond_11

    .line 216
    mul-int/lit8 v3, v0, 0x1f

    add-int/lit8 v4, v1, 0x1

    .end local v1    # "off":I
    .local v4, "off":I
    aget-char v1, p0, v1

    add-int v0, v3, v1

    .line 215
    add-int/lit8 v2, v2, 0x1

    move v1, v4

    goto :goto_3

    .line 218
    .end local v2    # "i":I
    .end local v4    # "off":I
    .restart local v1    # "off":I
    :cond_11
    return v0
.end method

.method private static subString(Ljava/lang/String;II)Ljava/lang/String;
    .registers 7
    .param p0, "src"    # Ljava/lang/String;
    .param p1, "offset"    # I
    .param p2, "len"    # I

    .line 200
    new-array v0, p2, [C

    .line 201
    .local v0, "chars":[C
    move v1, p1

    .local v1, "i":I
    :goto_3
    add-int v2, p1, p2

    if-ge v1, v2, :cond_12

    .line 202
    sub-int v2, v1, p1

    invoke-virtual {p0, v1}, Ljava/lang/String;->charAt(I)C

    move-result v3

    aput-char v3, v0, v2

    .line 201
    add-int/lit8 v1, v1, 0x1

    goto :goto_3

    .line 204
    .end local v1    # "i":I
    :cond_12
    new-instance v1, Ljava/lang/String;

    invoke-direct {v1, v0}, Ljava/lang/String;-><init>([C)V

    return-object v1
.end method


# virtual methods
.method public addSymbol(Ljava/lang/String;III)Ljava/lang/String;
    .registers 15
    .param p1, "buffer"    # Ljava/lang/String;
    .param p2, "offset"    # I
    .param p3, "len"    # I
    .param p4, "hash"    # I

    .line 133
    iget v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->indexMask:I

    and-int/2addr v0, p4

    .line 135
    .local v0, "bucket":I
    iget-object v1, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols:[Ljava/lang/String;

    aget-object v1, v1, v0

    .line 137
    .local v1, "sym":Ljava/lang/String;
    const/4 v2, 0x1

    .line 139
    .local v2, "match":Z
    if-eqz v1, :cond_2b

    .line 140
    invoke-virtual {v1}, Ljava/lang/String;->length()I

    move-result v3

    if-ne v3, p3, :cond_2a

    .line 141
    iget-object v3, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols_char:[[C

    aget-object v3, v3, v0

    .line 143
    .local v3, "characters":[C
    const/4 v4, 0x0

    .local v4, "i":I
    :goto_15
    if-ge v4, p3, :cond_26

    .line 144
    add-int v5, p2, v4

    invoke-virtual {p1, v5}, Ljava/lang/String;->charAt(I)C

    move-result v5

    aget-char v6, v3, v4

    if-eq v5, v6, :cond_23

    .line 145
    const/4 v2, 0x0

    .line 146
    goto :goto_26

    .line 143
    :cond_23
    add-int/lit8 v4, v4, 0x1

    goto :goto_15

    .line 150
    .end local v4    # "i":I
    :cond_26
    :goto_26
    if-eqz v2, :cond_29

    .line 151
    return-object v1

    .line 153
    .end local v3    # "characters":[C
    :cond_29
    goto :goto_2b

    .line 154
    :cond_2a
    const/4 v2, 0x0

    .line 159
    :cond_2b
    :goto_2b
    const/4 v3, 0x0

    .line 160
    .local v3, "entryIndex":I
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aget-object v4, v4, v0

    .local v4, "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    :goto_30
    if-eqz v4, :cond_59

    .line 161
    iget-object v5, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->characters:[C

    .line 162
    .local v5, "characters":[C
    array-length v6, v5

    if-ne p3, v6, :cond_56

    iget v6, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->hashCode:I

    if-ne p4, v6, :cond_56

    .line 163
    const/4 v6, 0x1

    .line 164
    .local v6, "eq":Z
    const/4 v7, 0x0

    .local v7, "i":I
    :goto_3d
    if-ge v7, p3, :cond_4e

    .line 165
    add-int v8, p2, v7

    invoke-virtual {p1, v8}, Ljava/lang/String;->charAt(I)C

    move-result v8

    aget-char v9, v5, v7

    if-eq v8, v9, :cond_4b

    .line 166
    const/4 v6, 0x0

    .line 167
    goto :goto_4e

    .line 164
    :cond_4b
    add-int/lit8 v7, v7, 0x1

    goto :goto_3d

    .line 171
    .end local v7    # "i":I
    :cond_4e
    :goto_4e
    if-nez v6, :cond_53

    .line 172
    add-int/lit8 v3, v3, 0x1

    .line 173
    goto :goto_56

    .line 175
    :cond_53
    iget-object v7, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    return-object v7

    .line 160
    .end local v5    # "characters":[C
    .end local v6    # "eq":Z
    :cond_56
    :goto_56
    iget-object v4, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->next:Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    goto :goto_30

    .line 178
    .end local v4    # "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    :cond_59
    const/16 v4, 0x8

    if-lt v3, v4, :cond_62

    .line 180
    invoke-static {p1, p2, p3}, Lcom/alibaba/fastjson/parser/SymbolTable;->subString(Ljava/lang/String;II)Ljava/lang/String;

    move-result-object v4

    return-object v4

    .line 184
    .end local v3    # "entryIndex":I
    :cond_62
    iget v3, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    const/16 v4, 0x1000

    if-lt v3, v4, :cond_6d

    .line 186
    invoke-static {p1, p2, p3}, Lcom/alibaba/fastjson/parser/SymbolTable;->subString(Ljava/lang/String;II)Ljava/lang/String;

    move-result-object v3

    return-object v3

    .line 189
    :cond_6d
    new-instance v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aget-object v9, v4, v0

    move-object v4, v3

    move-object v5, p1

    move v6, p2

    move v7, p3

    move v8, p4

    invoke-direct/range {v4 .. v9}, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;-><init>(Ljava/lang/String;IIILcom/alibaba/fastjson/parser/SymbolTable$Entry;)V

    .line 190
    .local v3, "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aput-object v3, v4, v0

    .line 191
    if-eqz v2, :cond_8d

    .line 192
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols:[Ljava/lang/String;

    iget-object v5, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    aput-object v5, v4, v0

    .line 193
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols_char:[[C

    iget-object v5, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->characters:[C

    aput-object v5, v4, v0

    .line 195
    :cond_8d
    iget v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    add-int/lit8 v4, v4, 0x1

    iput v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    .line 196
    iget-object v4, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    return-object v4
.end method

.method public addSymbol([CII)Ljava/lang/String;
    .registers 6
    .param p1, "buffer"    # [C
    .param p2, "offset"    # I
    .param p3, "len"    # I

    .line 52
    invoke-static {p1, p2, p3}, Lcom/alibaba/fastjson/parser/SymbolTable;->hash([CII)I

    move-result v0

    .line 53
    .local v0, "hash":I
    invoke-virtual {p0, p1, p2, p3, v0}, Lcom/alibaba/fastjson/parser/SymbolTable;->addSymbol([CIII)Ljava/lang/String;

    move-result-object v1

    return-object v1
.end method

.method public addSymbol([CIII)Ljava/lang/String;
    .registers 15
    .param p1, "buffer"    # [C
    .param p2, "offset"    # I
    .param p3, "len"    # I
    .param p4, "hash"    # I

    .line 67
    iget v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->indexMask:I

    and-int/2addr v0, p4

    .line 69
    .local v0, "bucket":I
    iget-object v1, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols:[Ljava/lang/String;

    aget-object v1, v1, v0

    .line 71
    .local v1, "sym":Ljava/lang/String;
    const/4 v2, 0x1

    .line 73
    .local v2, "match":Z
    if-eqz v1, :cond_29

    .line 74
    invoke-virtual {v1}, Ljava/lang/String;->length()I

    move-result v3

    if-ne v3, p3, :cond_28

    .line 75
    iget-object v3, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols_char:[[C

    aget-object v3, v3, v0

    .line 77
    .local v3, "characters":[C
    const/4 v4, 0x0

    .local v4, "i":I
    :goto_15
    if-ge v4, p3, :cond_24

    .line 78
    add-int v5, p2, v4

    aget-char v5, p1, v5

    aget-char v6, v3, v4

    if-eq v5, v6, :cond_21

    .line 79
    const/4 v2, 0x0

    .line 80
    goto :goto_24

    .line 77
    :cond_21
    add-int/lit8 v4, v4, 0x1

    goto :goto_15

    .line 84
    .end local v4    # "i":I
    :cond_24
    :goto_24
    if-eqz v2, :cond_27

    .line 85
    return-object v1

    .line 87
    .end local v3    # "characters":[C
    :cond_27
    goto :goto_29

    .line 88
    :cond_28
    const/4 v2, 0x0

    .line 93
    :cond_29
    :goto_29
    const/4 v3, 0x0

    .line 94
    .local v3, "entryIndex":I
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aget-object v4, v4, v0

    .local v4, "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    :goto_2e
    if-eqz v4, :cond_55

    .line 95
    iget-object v5, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->characters:[C

    .line 96
    .local v5, "characters":[C
    array-length v6, v5

    if-ne p3, v6, :cond_52

    iget v6, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->hashCode:I

    if-ne p4, v6, :cond_52

    .line 97
    const/4 v6, 0x1

    .line 98
    .local v6, "eq":Z
    const/4 v7, 0x0

    .local v7, "i":I
    :goto_3b
    if-ge v7, p3, :cond_4a

    .line 99
    add-int v8, p2, v7

    aget-char v8, p1, v8

    aget-char v9, v5, v7

    if-eq v8, v9, :cond_47

    .line 100
    const/4 v6, 0x0

    .line 101
    goto :goto_4a

    .line 98
    :cond_47
    add-int/lit8 v7, v7, 0x1

    goto :goto_3b

    .line 105
    .end local v7    # "i":I
    :cond_4a
    :goto_4a
    if-nez v6, :cond_4f

    .line 106
    add-int/lit8 v3, v3, 0x1

    .line 107
    goto :goto_52

    .line 109
    :cond_4f
    iget-object v7, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    return-object v7

    .line 94
    .end local v5    # "characters":[C
    .end local v6    # "eq":Z
    :cond_52
    :goto_52
    iget-object v4, v4, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->next:Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    goto :goto_2e

    .line 112
    .end local v4    # "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    :cond_55
    const/16 v4, 0x8

    if-lt v3, v4, :cond_5f

    .line 113
    new-instance v4, Ljava/lang/String;

    invoke-direct {v4, p1, p2, p3}, Ljava/lang/String;-><init>([CII)V

    return-object v4

    .line 117
    .end local v3    # "entryIndex":I
    :cond_5f
    iget v3, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    const/16 v4, 0x1000

    if-lt v3, v4, :cond_6b

    .line 118
    new-instance v3, Ljava/lang/String;

    invoke-direct {v3, p1, p2, p3}, Ljava/lang/String;-><init>([CII)V

    return-object v3

    .line 121
    :cond_6b
    new-instance v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aget-object v9, v4, v0

    move-object v4, v3

    move-object v5, p1

    move v6, p2

    move v7, p3

    move v8, p4

    invoke-direct/range {v4 .. v9}, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;-><init>([CIIILcom/alibaba/fastjson/parser/SymbolTable$Entry;)V

    .line 122
    .local v3, "entry":Lcom/alibaba/fastjson/parser/SymbolTable$Entry;
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->buckets:[Lcom/alibaba/fastjson/parser/SymbolTable$Entry;

    aput-object v3, v4, v0

    .line 123
    if-eqz v2, :cond_8b

    .line 124
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols:[Ljava/lang/String;

    iget-object v5, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    aput-object v5, v4, v0

    .line 125
    iget-object v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->symbols_char:[[C

    iget-object v5, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->characters:[C

    aput-object v5, v4, v0

    .line 127
    :cond_8b
    iget v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    add-int/lit8 v4, v4, 0x1

    iput v4, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    .line 128
    iget-object v4, v3, Lcom/alibaba/fastjson/parser/SymbolTable$Entry;->symbol:Ljava/lang/String;

    return-object v4
.end method

.method public size()I
    .registers 2

    .line 208
    iget v0, p0, Lcom/alibaba/fastjson/parser/SymbolTable;->size:I

    return v0
.end method