Weather/smali/com/alibaba/fastjson/util/UTF8Decoder.smali
2021-05-10 10:13:34 +02:00

885 lines
15 KiB
Smali

.class public Lcom/alibaba/fastjson/util/UTF8Decoder;
.super Ljava/nio/charset/CharsetDecoder;
.source "UTF8Decoder.java"
# static fields
.field private static final charset:Ljava/nio/charset/Charset;
# direct methods
.method static constructor <clinit>()V
.locals 1
const-string v0, "UTF-8"
.line 32
invoke-static {v0}, Ljava/nio/charset/Charset;->forName(Ljava/lang/String;)Ljava/nio/charset/Charset;
move-result-object v0
sput-object v0, Lcom/alibaba/fastjson/util/UTF8Decoder;->charset:Ljava/nio/charset/Charset;
return-void
.end method
.method public constructor <init>()V
.locals 2
.line 35
sget-object v0, Lcom/alibaba/fastjson/util/UTF8Decoder;->charset:Ljava/nio/charset/Charset;
const/high16 v1, 0x3f800000 # 1.0f
invoke-direct {p0, v0, v1, v1}, Ljava/nio/charset/CharsetDecoder;-><init>(Ljava/nio/charset/Charset;FF)V
return-void
.end method
.method private static malformed(Ljava/nio/ByteBuffer;ILjava/nio/CharBuffer;II)Ljava/nio/charset/CoderResult;
.locals 1
.line 87
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->arrayOffset()I
move-result v0
sub-int v0, p1, v0
invoke-virtual {p0, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
.line 88
invoke-static {p0, p4}, Lcom/alibaba/fastjson/util/UTF8Decoder;->malformedN(Ljava/nio/ByteBuffer;I)Ljava/nio/charset/CoderResult;
move-result-object p4
.line 90
invoke-virtual {p0, p1}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
.line 91
invoke-virtual {p2, p3}, Ljava/nio/CharBuffer;->position(I)Ljava/nio/Buffer;
return-object p4
.end method
.method public static malformedN(Ljava/nio/ByteBuffer;I)Ljava/nio/charset/CoderResult;
.locals 6
const/4 v0, 0x2
const/16 v1, 0x80
const/4 v2, 0x1
packed-switch p1, :pswitch_data_0
.line 82
new-instance p0, Ljava/lang/IllegalStateException;
invoke-direct {p0}, Ljava/lang/IllegalStateException;-><init>()V
throw p0
.line 76
:pswitch_0
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p1
and-int/lit16 p1, p1, 0xff
.line 77
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result v3
and-int/lit16 v3, v3, 0xff
const/16 v4, 0xf4
if-gt p1, v4, :cond_4
const/16 v5, 0xf0
if-ne p1, v5, :cond_0
const/16 v5, 0x90
if-lt v3, v5, :cond_4
const/16 v5, 0xbf
if-gt v3, v5, :cond_4
:cond_0
if-ne p1, v4, :cond_1
and-int/lit16 p1, v3, 0xf0
if-ne p1, v1, :cond_4
:cond_1
and-int/lit16 p1, v3, 0xc0
if-eq p1, v1, :cond_2
goto :goto_0
.line 79
:cond_2
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p0
and-int/lit16 p0, p0, 0xc0
if-eq p0, v1, :cond_3
invoke-static {v0}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
:cond_3
const/4 p0, 0x3
.line 80
invoke-static {p0}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
.line 78
:cond_4
:goto_0
invoke-static {v2}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
.line 72
:pswitch_1
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p1
.line 73
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p0
const/16 v3, -0x20
if-ne p1, v3, :cond_5
and-int/lit16 p1, p0, 0xe0
if-eq p1, v1, :cond_6
:cond_5
and-int/lit16 p0, p0, 0xc0
if-eq p0, v1, :cond_7
:cond_6
const/4 v0, 0x1
.line 74
:cond_7
invoke-static {v0}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
.line 70
:pswitch_2
invoke-static {v2}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
.line 41
:pswitch_3
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p1
shr-int/lit8 v0, p1, 0x2
const/4 v3, 0x5
const/4 v4, -0x2
if-ne v0, v4, :cond_b
.line 44
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->remaining()I
move-result p1
const/4 v0, 0x4
if-ge p1, v0, :cond_8
sget-object p0, Ljava/nio/charset/CoderResult;->UNDERFLOW:Ljava/nio/charset/CoderResult;
return-object p0
:cond_8
:goto_1
if-ge v2, v3, :cond_a
.line 48
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result p1
and-int/lit16 p1, p1, 0xc0
if-eq p1, v1, :cond_9
.line 49
invoke-static {v2}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
:cond_9
add-int/lit8 v2, v2, 0x1
goto :goto_1
.line 52
:cond_a
invoke-static {v3}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
:cond_b
shr-int/2addr p1, v2
if-ne p1, v4, :cond_f
.line 56
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->remaining()I
move-result p1
if-ge p1, v3, :cond_c
.line 57
sget-object p0, Ljava/nio/charset/CoderResult;->UNDERFLOW:Ljava/nio/charset/CoderResult;
return-object p0
:cond_c
const/4 p1, 0x6
:goto_2
if-ge v2, p1, :cond_e
.line 62
invoke-virtual {p0}, Ljava/nio/ByteBuffer;->get()B
move-result v0
and-int/lit16 v0, v0, 0xc0
if-eq v0, v1, :cond_d
.line 63
invoke-static {v2}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
:cond_d
add-int/lit8 v2, v2, 0x1
goto :goto_2
.line 66
:cond_e
invoke-static {p1}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
.line 68
:cond_f
invoke-static {v2}, Ljava/nio/charset/CoderResult;->malformedForLength(I)Ljava/nio/charset/CoderResult;
move-result-object p0
return-object p0
nop
:pswitch_data_0
.packed-switch 0x1
:pswitch_3
:pswitch_2
:pswitch_1
:pswitch_0
.end packed-switch
.end method
.method private static xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
.locals 0
.line 96
invoke-virtual {p0, p1}, Ljava/nio/Buffer;->position(I)Ljava/nio/Buffer;
.line 97
invoke-virtual {p3, p4}, Ljava/nio/Buffer;->position(I)Ljava/nio/Buffer;
if-eqz p5, :cond_1
sub-int/2addr p2, p1
if-ge p2, p5, :cond_0
goto :goto_0
.line 99
:cond_0
sget-object p0, Ljava/nio/charset/CoderResult;->OVERFLOW:Ljava/nio/charset/CoderResult;
goto :goto_1
:cond_1
:goto_0
sget-object p0, Ljava/nio/charset/CoderResult;->UNDERFLOW:Ljava/nio/charset/CoderResult;
:goto_1
return-object p0
.end method
# virtual methods
.method protected decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;
.locals 17
move-object/from16 v0, p1
move-object/from16 v3, p2
.line 104
invoke-virtual/range {p1 .. p1}, Ljava/nio/ByteBuffer;->array()[B
move-result-object v1
.line 105
invoke-virtual/range {p1 .. p1}, Ljava/nio/ByteBuffer;->arrayOffset()I
move-result v2
invoke-virtual/range {p1 .. p1}, Ljava/nio/ByteBuffer;->position()I
move-result v4
add-int/2addr v2, v4
.line 106
invoke-virtual/range {p1 .. p1}, Ljava/nio/ByteBuffer;->arrayOffset()I
move-result v4
invoke-virtual/range {p1 .. p1}, Ljava/nio/ByteBuffer;->limit()I
move-result v5
add-int/2addr v4, v5
.line 108
invoke-virtual/range {p2 .. p2}, Ljava/nio/CharBuffer;->array()[C
move-result-object v5
.line 109
invoke-virtual/range {p2 .. p2}, Ljava/nio/CharBuffer;->arrayOffset()I
move-result v6
invoke-virtual/range {p2 .. p2}, Ljava/nio/CharBuffer;->position()I
move-result v7
add-int/2addr v6, v7
.line 110
invoke-virtual/range {p2 .. p2}, Ljava/nio/CharBuffer;->arrayOffset()I
move-result v7
invoke-virtual/range {p2 .. p2}, Ljava/nio/CharBuffer;->limit()I
move-result v8
add-int/2addr v7, v8
sub-int v8, v4, v2
sub-int v9, v7, v6
.line 111
invoke-static {v8, v9}, Ljava/lang/Math;->min(II)I
move-result v8
add-int/2addr v8, v6
:goto_0
if-ge v6, v8, :cond_0
.line 114
aget-byte v9, v1, v2
if-ltz v9, :cond_0
add-int/lit8 v9, v6, 0x1
add-int/lit8 v10, v2, 0x1
.line 115
aget-byte v2, v1, v2
int-to-char v2, v2
aput-char v2, v5, v6
move v6, v9
move v2, v10
goto :goto_0
:cond_0
:goto_1
if-ge v2, v4, :cond_17
.line 119
aget-byte v8, v1, v2
if-ltz v8, :cond_2
if-lt v6, v7, :cond_1
const/4 v5, 0x1
move-object/from16 v0, p1
move v1, v2
move v2, v4
move-object/from16 v3, p2
move v4, v6
.line 123
invoke-static/range {v0 .. v5}, Lcom/alibaba/fastjson/util/UTF8Decoder;->xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_1
add-int/lit8 v9, v6, 0x1
int-to-char v8, v8
.line 125
aput-char v8, v5, v6
add-int/lit8 v2, v2, 0x1
move v6, v9
goto :goto_1
:cond_2
shr-int/lit8 v9, v8, 0x5
const/4 v10, 0x0
const/4 v11, -0x2
const/4 v12, 0x2
const/16 v13, 0x80
const/4 v14, 0x1
if-ne v9, v11, :cond_8
sub-int v9, v4, v2
if-lt v9, v12, :cond_7
if-lt v6, v7, :cond_3
goto :goto_4
:cond_3
add-int/lit8 v9, v2, 0x1
.line 132
aget-byte v9, v1, v9
and-int/lit8 v11, v8, 0x1e
if-eqz v11, :cond_5
and-int/lit16 v11, v9, 0xc0
if-eq v11, v13, :cond_4
goto :goto_2
:cond_4
const/4 v14, 0x0
:cond_5
:goto_2
if-eqz v14, :cond_6
.line 135
invoke-static {v0, v2, v3, v6, v12}, Lcom/alibaba/fastjson/util/UTF8Decoder;->malformed(Ljava/nio/ByteBuffer;ILjava/nio/CharBuffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_6
add-int/lit8 v10, v6, 0x1
shl-int/lit8 v8, v8, 0x6
xor-int/2addr v8, v9
xor-int/lit16 v8, v8, 0xf80
int-to-char v8, v8
.line 137
aput-char v8, v5, v6
add-int/lit8 v2, v2, 0x2
:goto_3
move v6, v10
goto :goto_1
:cond_7
:goto_4
const/4 v5, 0x2
move-object/from16 v0, p1
move v1, v2
move v2, v4
move-object/from16 v3, p2
move v4, v6
.line 130
invoke-static/range {v0 .. v5}, Lcom/alibaba/fastjson/util/UTF8Decoder;->xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_8
shr-int/lit8 v9, v8, 0x4
if-ne v9, v11, :cond_f
sub-int v9, v4, v2
const/4 v11, 0x3
if-lt v9, v11, :cond_e
if-lt v6, v7, :cond_9
goto :goto_6
:cond_9
add-int/lit8 v9, v2, 0x1
.line 144
aget-byte v9, v1, v9
add-int/lit8 v12, v2, 0x2
.line 145
aget-byte v12, v1, v12
const/16 v15, -0x20
if-ne v8, v15, :cond_a
and-int/lit16 v15, v9, 0xe0
if-eq v15, v13, :cond_c
:cond_a
and-int/lit16 v15, v9, 0xc0
if-ne v15, v13, :cond_c
and-int/lit16 v15, v12, 0xc0
if-eq v15, v13, :cond_b
goto :goto_5
:cond_b
const/4 v14, 0x0
:cond_c
:goto_5
if-eqz v14, :cond_d
.line 149
invoke-static {v0, v2, v3, v6, v11}, Lcom/alibaba/fastjson/util/UTF8Decoder;->malformed(Ljava/nio/ByteBuffer;ILjava/nio/CharBuffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_d
add-int/lit8 v10, v6, 0x1
shl-int/lit8 v8, v8, 0xc
shl-int/lit8 v9, v9, 0x6
xor-int/2addr v8, v9
xor-int/2addr v8, v12
xor-int/lit16 v8, v8, 0x1f80
int-to-char v8, v8
.line 151
aput-char v8, v5, v6
add-int/lit8 v2, v2, 0x3
goto :goto_3
:cond_e
:goto_6
const/4 v5, 0x3
move-object/from16 v0, p1
move v1, v2
move v2, v4
move-object/from16 v3, p2
move v4, v6
.line 142
invoke-static/range {v0 .. v5}, Lcom/alibaba/fastjson/util/UTF8Decoder;->xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_f
shr-int/lit8 v9, v8, 0x3
if-ne v9, v11, :cond_16
sub-int v9, v4, v2
const/4 v11, 0x4
if-lt v9, v11, :cond_15
sub-int v9, v7, v6
if-ge v9, v12, :cond_10
goto :goto_9
:cond_10
add-int/lit8 v9, v2, 0x1
.line 158
aget-byte v9, v1, v9
add-int/lit8 v12, v2, 0x2
.line 159
aget-byte v12, v1, v12
add-int/lit8 v15, v2, 0x3
.line 160
aget-byte v15, v1, v15
and-int/lit8 v8, v8, 0x7
shl-int/lit8 v8, v8, 0x12
and-int/lit8 v16, v9, 0x3f
shl-int/lit8 v16, v16, 0xc
or-int v8, v8, v16
and-int/lit8 v16, v12, 0x3f
shl-int/lit8 v16, v16, 0x6
or-int v8, v8, v16
and-int/lit8 v16, v15, 0x3f
or-int v8, v8, v16
and-int/lit16 v9, v9, 0xc0
if-ne v9, v13, :cond_12
and-int/lit16 v9, v12, 0xc0
if-ne v9, v13, :cond_12
and-int/lit16 v9, v15, 0xc0
if-eq v9, v13, :cond_11
goto :goto_7
:cond_11
const/4 v14, 0x0
:cond_12
:goto_7
if-nez v14, :cond_14
const/high16 v9, 0x10000
if-lt v8, v9, :cond_14
const v10, 0x10ffff
if-le v8, v10, :cond_13
goto :goto_8
:cond_13
add-int/lit8 v10, v6, 0x1
const v11, 0xd800
sub-int/2addr v8, v9
shr-int/lit8 v9, v8, 0xa
and-int/lit16 v9, v9, 0x3ff
or-int/2addr v9, v11
int-to-char v9, v9
.line 167
aput-char v9, v5, v6
add-int/lit8 v6, v10, 0x1
const v9, 0xdc00
and-int/lit16 v8, v8, 0x3ff
or-int/2addr v8, v9
int-to-char v8, v8
.line 168
aput-char v8, v5, v10
add-int/lit8 v2, v2, 0x4
goto/16 :goto_1
.line 165
:cond_14
:goto_8
invoke-static {v0, v2, v3, v6, v11}, Lcom/alibaba/fastjson/util/UTF8Decoder;->malformed(Ljava/nio/ByteBuffer;ILjava/nio/CharBuffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_15
:goto_9
const/4 v5, 0x4
move-object/from16 v0, p1
move v1, v2
move v2, v4
move-object/from16 v3, p2
move v4, v6
.line 156
invoke-static/range {v0 .. v5}, Lcom/alibaba/fastjson/util/UTF8Decoder;->xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
.line 171
:cond_16
invoke-static {v0, v2, v3, v6, v14}, Lcom/alibaba/fastjson/util/UTF8Decoder;->malformed(Ljava/nio/ByteBuffer;ILjava/nio/CharBuffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
:cond_17
const/4 v5, 0x0
move-object/from16 v0, p1
move v1, v2
move v2, v4
move-object/from16 v3, p2
move v4, v6
.line 174
invoke-static/range {v0 .. v5}, Lcom/alibaba/fastjson/util/UTF8Decoder;->xflow(Ljava/nio/Buffer;IILjava/nio/Buffer;II)Ljava/nio/charset/CoderResult;
move-result-object v0
return-object v0
.end method