.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 ()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 ()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;->(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;->()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