2
0
Fork 0
mirror of https://github.com/ii64/sonic.git synced 2026-06-22 09:26:44 +08:00

fix: correct htmlescape chars check (#190)

* fix: correct htmlescape chars check

* fix: continuous html escape chars

* tmp: compile clang13

* fix: check single xe2 char

* fix: htmlescape no mem test

* fix: htmlescape zero check bug

* fix: htmlescape bug

* build: clang12

Co-authored-by: liuqiang <liuqiang.06@bytedance.com>
Co-authored-by: duanyi.aster <duanyi.aster@bytedance.com>
This commit is contained in:
liu 2022-02-22 11:43:58 +08:00 committed by GitHub
parent 7475b256ce
commit ce41dd9636
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 901 additions and 774 deletions

View file

@ -197,7 +197,7 @@ func TestEncoder_TextMarshaler(t *testing.T) {
require.Equal(t, `{"V":{"X":"{\"a\"}"}}`, string(ret3)) require.Equal(t, `{"V":{"X":"{\"a\"}"}}`, string(ret3))
} }
func TestEncoder_EscapeHTML(t *testing.T) { func TestEncoder_Marshal_EscapeHTML(t *testing.T) {
v := map[string]TextMarshalerImpl{"&&":{"<>"}} v := map[string]TextMarshalerImpl{"&&":{"<>"}}
ret, err := Encode(v, EscapeHTML) ret, err := Encode(v, EscapeHTML)
require.NoError(t, err) require.NoError(t, err)
@ -205,9 +205,36 @@ func TestEncoder_EscapeHTML(t *testing.T) {
ret, err = Encode(v, 0) ret, err = Encode(v, 0)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, `{"&&":{"X":"<>"}}`, string(ret)) require.Equal(t, `{"&&":{"X":"<>"}}`, string(ret))
// “ is \xe2\x80\x9c, and ” is \xe2\x80\x9d,
// similar as HTML escaped chars \u2028(\xe2\x80\xa8) and \u2029(\xe2\x80\xa9)
m := map[string]string{"test": "“123”"}
ret, err = Encode(m, EscapeHTML)
require.Equal(t, string(ret), `{"test":"“123”"}`)
require.NoError(t, err)
m = map[string]string{"K": "\u2028\u2028\xe2"}
ret, err = Encode(m, EscapeHTML)
require.Equal(t, string(ret), "{\"K\":\"\\u2028\\u2028\xe2\"}")
require.NoError(t, err)
} }
func TestEncoder_EscapeHTML_LargeJson(t *testing.T) { func TestEncoder_EscapeHTML(t *testing.T) {
// test data from libfuzzer
test := []string{
"&&&&&&&&&&&&&&&&&&&&&&&\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
"{\"\"\u2028\x94\xe2\x00\x00\x00\x00\x00\x00\x00\x00\u2028\x80\u2028\x80\u2028\xe2\u2028\x8a\u2028⑀\xa8\x8a\xa8\xe2\u2028\xe2\u2028\xe2\u2028\xe2\u2000\x8d\xe2\u2028\xe2\u2028\xe2\xe2\xa8\"}",
}
for _, s := range(test) {
data := []byte(s)
sdst := HTMLEscape(nil, data)
var dst bytes.Buffer
json.HTMLEscape(&dst, data)
require.Equal(t, string(sdst), dst.String())
}
}
func TestEncoder_Marshal_EscapeHTML_LargeJson(t *testing.T) {
buf1, err1 := Encode(&_BindingValue, SortMapKeys | EscapeHTML) buf1, err1 := Encode(&_BindingValue, SortMapKeys | EscapeHTML)
require.NoError(t, err1) require.NoError(t, err1)
buf2, err2 :=json.Marshal(&_BindingValue) buf2, err2 :=json.Marshal(&_BindingValue)

View file

@ -291,7 +291,7 @@ LBB2_5:
LONG $0x4fdc6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r12d, %ebx LONG $0x4fdc6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r12d, %ebx
MOVQ R12, AX MOVQ R12, AX
SHLQ $4, AX SHLQ $4, AX
LONG $0xd10d8d48; WORD $0x007c; BYTE $0x00 // leaq $31953(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */ LONG $0x1b0d8d48; WORD $0x007d; BYTE $0x00 // leaq $32027(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */
MOVQ R8, DI MOVQ R8, DI
ORQ $2, DI ORQ $2, DI
MOVQ 0(AX)(CX*1), R10 MOVQ 0(AX)(CX*1), R10
@ -378,7 +378,7 @@ LBB2_12:
SHRL $19, BX SHRL $19, BX
MOVLQSX AX, SI MOVLQSX AX, SI
SHLQ $4, SI SHLQ $4, SI
LONG $0xfc158d4c; WORD $0x0090; BYTE $0x00 // leaq $37116(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */ LONG $0x46158d4c; WORD $0x0091; BYTE $0x00 // leaq $37190(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */
MOVQ R8, DI MOVQ R8, DI
ORQ $2, DI ORQ $2, DI
MOVQ 0(SI)(R10*1), R14 MOVQ 0(SI)(R10*1), R14
@ -791,7 +791,7 @@ LBB2_61:
LEAQ 1(R13), BX LEAQ 1(R13), BX
MOVQ BX, SI MOVQ BX, SI
MOVL R15, DX MOVL R15, DX
LONG $0x00466fe8; BYTE $0x00 // callq _print_mantissa LONG $0x0046b9e8; BYTE $0x00 // callq _print_mantissa
MOVB 1(R13), AX MOVB 1(R13), AX
MOVB AX, 0(R13) MOVB AX, 0(R13)
MOVL $1, AX MOVL $1, AX
@ -820,7 +820,7 @@ LBB2_66:
LEAL 0(CX)(CX*1), AX LEAL 0(CX)(CX*1), AX
LEAL 0(AX)(AX*4), AX LEAL 0(AX)(AX*4), AX
SUBL AX, R14 SUBL AX, R14
LONG $0xce058d48; WORD $0x009f; BYTE $0x00 // leaq $40910(%rip), %rax /* _Digits(%rip) */ LONG $0x18058d48; WORD $0x00a0; BYTE $0x00 // leaq $40984(%rip), %rax /* _Digits(%rip) */
MOVWLZX 0(AX)(CX*2), AX MOVWLZX 0(AX)(CX*2), AX
MOVL BX, CX MOVL BX, CX
MOVW AX, 0(R13)(CX*1) MOVW AX, 0(R13)(CX*1)
@ -856,7 +856,7 @@ LBB2_70:
CMPL R14, $10 CMPL R14, $10
JL LBB2_85 JL LBB2_85
MOVLQSX R14, AX MOVLQSX R14, AX
LONG $0x600d8d48; WORD $0x009f; BYTE $0x00 // leaq $40800(%rip), %rcx /* _Digits(%rip) */ LONG $0xaa0d8d48; WORD $0x009f; BYTE $0x00 // leaq $40874(%rip), %rcx /* _Digits(%rip) */
MOVWLZX 0(CX)(AX*2), AX MOVWLZX 0(CX)(AX*2), AX
MOVL BX, CX MOVL BX, CX
MOVW AX, 0(R13)(CX*1) MOVW AX, 0(R13)(CX*1)
@ -875,7 +875,7 @@ LBB2_74:
MOVL BX, SI MOVL BX, SI
ADDQ -64(BP), SI ADDQ -64(BP), SI
MOVL R15, DX MOVL R15, DX
LONG $0x00456be8; BYTE $0x00 // callq _print_mantissa LONG $0x0045b5e8; BYTE $0x00 // callq _print_mantissa
TESTL R13, R13 TESTL R13, R13
JE LBB2_78 JE LBB2_78
LEAL 0(R13)(BX*1), AX LEAL 0(R13)(BX*1), AX
@ -1079,7 +1079,7 @@ LBB2_105:
MOVQ R13, SI MOVQ R13, SI
MOVL R15, DX MOVL R15, DX
WORD $0xf8c5; BYTE $0x77 // vzeroupper WORD $0xf8c5; BYTE $0x77 // vzeroupper
LONG $0x004259e8; BYTE $0x00 // callq _print_mantissa LONG $0x0042a3e8; BYTE $0x00 // callq _print_mantissa
ADDL BX, R15 ADDL BX, R15
MOVL R15, BX MOVL R15, BX
@ -1172,7 +1172,7 @@ _u64toa:
ADDQ AX, AX ADDQ AX, AX
CMPL SI, $1000 CMPL SI, $1000
JB LBB4_3 JB LBB4_3
LONG $0x220d8d48; WORD $0x009b; BYTE $0x00 // leaq $39714(%rip), %rcx /* _Digits(%rip) */ LONG $0x6c0d8d48; WORD $0x009b; BYTE $0x00 // leaq $39788(%rip), %rcx /* _Digits(%rip) */
MOVB 0(DX)(CX*1), CX MOVB 0(DX)(CX*1), CX
MOVB CX, 0(DI) MOVB CX, 0(DI)
MOVL $1, CX MOVL $1, CX
@ -1186,14 +1186,14 @@ LBB4_3:
LBB4_4: LBB4_4:
MOVWLZX DX, DX MOVWLZX DX, DX
ORQ $1, DX ORQ $1, DX
LONG $0x01358d48; WORD $0x009b; BYTE $0x00 // leaq $39681(%rip), %rsi /* _Digits(%rip) */ LONG $0x4b358d48; WORD $0x009b; BYTE $0x00 // leaq $39755(%rip), %rsi /* _Digits(%rip) */
MOVB 0(DX)(SI*1), DX MOVB 0(DX)(SI*1), DX
MOVL CX, SI MOVL CX, SI
INCL CX INCL CX
MOVB DX, 0(DI)(SI*1) MOVB DX, 0(DI)(SI*1)
LBB4_6: LBB4_6:
LONG $0xf0158d48; WORD $0x009a; BYTE $0x00 // leaq $39664(%rip), %rdx /* _Digits(%rip) */ LONG $0x3a158d48; WORD $0x009b; BYTE $0x00 // leaq $39738(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), DX MOVB 0(AX)(DX*1), DX
MOVL CX, SI MOVL CX, SI
INCL CX INCL CX
@ -1202,7 +1202,7 @@ LBB4_6:
LBB4_7: LBB4_7:
MOVWLZX AX, AX MOVWLZX AX, AX
ORQ $1, AX ORQ $1, AX
LONG $0xd8158d48; WORD $0x009a; BYTE $0x00 // leaq $39640(%rip), %rdx /* _Digits(%rip) */ LONG $0x22158d48; WORD $0x009b; BYTE $0x00 // leaq $39714(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), AX MOVB 0(AX)(DX*1), AX
MOVL CX, DX MOVL CX, DX
INCL CX INCL CX
@ -1249,7 +1249,7 @@ LBB4_8:
ADDQ R11, R11 ADDQ R11, R11
CMPL SI, $10000000 CMPL SI, $10000000
JB LBB4_11 JB LBB4_11
LONG $0x41058d48; WORD $0x009a; BYTE $0x00 // leaq $39489(%rip), %rax /* _Digits(%rip) */ LONG $0x8b058d48; WORD $0x009a; BYTE $0x00 // leaq $39563(%rip), %rax /* _Digits(%rip) */
MOVB 0(R10)(AX*1), AX MOVB 0(R10)(AX*1), AX
MOVB AX, 0(DI) MOVB AX, 0(DI)
MOVL $1, CX MOVL $1, CX
@ -1263,14 +1263,14 @@ LBB4_11:
LBB4_12: LBB4_12:
MOVL R10, AX MOVL R10, AX
ORQ $1, AX ORQ $1, AX
LONG $0x1c358d48; WORD $0x009a; BYTE $0x00 // leaq $39452(%rip), %rsi /* _Digits(%rip) */ LONG $0x66358d48; WORD $0x009a; BYTE $0x00 // leaq $39526(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX MOVB 0(AX)(SI*1), AX
MOVL CX, SI MOVL CX, SI
INCL CX INCL CX
MOVB AX, 0(DI)(SI*1) MOVB AX, 0(DI)(SI*1)
LBB4_14: LBB4_14:
LONG $0x0b058d48; WORD $0x009a; BYTE $0x00 // leaq $39435(%rip), %rax /* _Digits(%rip) */ LONG $0x55058d48; WORD $0x009a; BYTE $0x00 // leaq $39509(%rip), %rax /* _Digits(%rip) */
MOVB 0(R9)(AX*1), AX MOVB 0(R9)(AX*1), AX
MOVL CX, SI MOVL CX, SI
INCL CX INCL CX
@ -1279,7 +1279,7 @@ LBB4_14:
LBB4_15: LBB4_15:
MOVWLZX R9, AX MOVWLZX R9, AX
ORQ $1, AX ORQ $1, AX
LONG $0xf1358d48; WORD $0x0099; BYTE $0x00 // leaq $39409(%rip), %rsi /* _Digits(%rip) */ LONG $0x3b358d48; WORD $0x009a; BYTE $0x00 // leaq $39483(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX MOVB 0(AX)(SI*1), AX
MOVL CX, DX MOVL CX, DX
MOVB AX, 0(DX)(DI*1) MOVB AX, 0(DX)(DI*1)
@ -1361,7 +1361,7 @@ LBB4_16:
MOVL $16, CX MOVL $16, CX
SUBL AX, CX SUBL AX, CX
SHLQ $4, AX SHLQ $4, AX
LONG $0x66158d48; WORD $0x0099; BYTE $0x00 // leaq $39270(%rip), %rdx /* _VecShiftShuffles(%rip) */ LONG $0xb0158d48; WORD $0x0099; BYTE $0x00 // leaq $39344(%rip), %rdx /* _VecShiftShuffles(%rip) */
LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0 LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0
LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi) LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi)
MOVL CX, AX MOVL CX, AX
@ -1387,7 +1387,7 @@ LBB4_20:
CMPL DX, $99 CMPL DX, $99
JA LBB4_22 JA LBB4_22
MOVL DX, AX MOVL DX, AX
LONG $0x490d8d48; WORD $0x0098; BYTE $0x00 // leaq $38985(%rip), %rcx /* _Digits(%rip) */ LONG $0x930d8d48; WORD $0x0098; BYTE $0x00 // leaq $39059(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX MOVB 1(CX)(AX*2), AX
MOVB DX, 0(DI) MOVB DX, 0(DI)
@ -1412,7 +1412,7 @@ LBB4_22:
WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx
SUBL CX, AX SUBL CX, AX
MOVWLZX AX, AX MOVWLZX AX, AX
LONG $0xf80d8d48; WORD $0x0097; BYTE $0x00 // leaq $38904(%rip), %rcx /* _Digits(%rip) */ LONG $0x420d8d48; WORD $0x0098; BYTE $0x00 // leaq $38978(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX MOVB 1(CX)(AX*2), AX
MOVB DX, 1(DI) MOVB DX, 1(DI)
@ -1424,7 +1424,7 @@ LBB4_24:
WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx
SUBL CX, DX SUBL CX, DX
MOVWLZX AX, AX MOVWLZX AX, AX
LONG $0xd5058d4c; WORD $0x0097; BYTE $0x00 // leaq $38869(%rip), %r8 /* _Digits(%rip) */ LONG $0x1f058d4c; WORD $0x0098; BYTE $0x00 // leaq $38943(%rip), %r8 /* _Digits(%rip) */
MOVB 0(R8)(AX*2), CX MOVB 0(R8)(AX*2), CX
MOVB 1(R8)(AX*2), AX MOVB 1(R8)(AX*2), AX
MOVB CX, 0(DI) MOVB CX, 0(DI)
@ -1509,8 +1509,8 @@ _quote:
SUBQ $32, SP SUBQ $32, SP
MOVQ DX, R10 MOVQ DX, R10
TESTB $1, R8 TESTB $1, R8
LONG $0xd7058d48; WORD $0x0097; BYTE $0x00 // leaq $38871(%rip), %rax /* __SingleQuoteTab(%rip) */ LONG $0x21058d48; WORD $0x0098; BYTE $0x00 // leaq $38945(%rip), %rax /* __SingleQuoteTab(%rip) */
LONG $0xd0158d48; WORD $0x00a7; BYTE $0x00 // leaq $42960(%rip), %rdx /* __DoubleQuoteTab(%rip) */ LONG $0x1a158d48; WORD $0x00a8; BYTE $0x00 // leaq $43034(%rip), %rdx /* __DoubleQuoteTab(%rip) */
LONG $0xd0440f48 // cmoveq %rax, %rdx LONG $0xd0440f48 // cmoveq %rax, %rdx
MOVQ R10, R8 MOVQ R10, R8
MOVQ DI, AX MOVQ DI, AX
@ -1600,7 +1600,7 @@ LBB5_10:
TESTQ R10, R10 TESTQ R10, R10
MOVQ -48(BP), CX MOVQ -48(BP), CX
MOVQ -56(BP), DI MOVQ -56(BP), DI
LONG $0x852d8d4c; WORD $0x0096; BYTE $0x00 // leaq $38533(%rip), %r13 /* __SingleQuoteTab(%rip) */ LONG $0xcf2d8d4c; WORD $0x0096; BYTE $0x00 // leaq $38607(%rip), %r13 /* __SingleQuoteTab(%rip) */
JLE LBB5_39 JLE LBB5_39
LBB5_35: LBB5_35:
@ -1867,7 +1867,7 @@ _unquote:
MOVQ R8, -72(BP) MOVQ R8, -72(BP)
MOVL R8, R10 MOVL R8, R10
ANDL $1, R10 ANDL $1, R10
LONG $0xa6058d4c; WORD $0x00b3; BYTE $0x00 // leaq $45990(%rip), %r8 /* __UnquoteTab(%rip) */ LONG $0xf0058d4c; WORD $0x00b3; BYTE $0x00 // leaq $46064(%rip), %r8 /* __UnquoteTab(%rip) */
QUAD $0xffffffb2056ffac5 // vmovdqu $-78(%rip), %xmm0 /* LCPI6_0(%rip) */ QUAD $0xffffffb2056ffac5 // vmovdqu $-78(%rip), %xmm0 /* LCPI6_0(%rip) */
MOVQ DI, R9 MOVQ DI, R9
MOVQ SI, R13 MOVQ SI, R13
@ -2535,51 +2535,44 @@ _html_escape:
WORD $0x5441 // pushq %r12 WORD $0x5441 // pushq %r12
BYTE $0x53 // pushq %rbx BYTE $0x53 // pushq %rbx
SUBQ $24, SP SUBQ $24, SP
MOVQ CX, -56(BP) MOVQ CX, -64(BP)
MOVQ DX, R10 MOVQ DX, R10
MOVQ DX, -48(BP) MOVQ DX, -56(BP)
MOVQ DI, -64(BP) MOVQ DI, -48(BP)
MOVQ DI, AX MOVQ DI, AX
TESTQ SI, SI TESTQ SI, SI
JE LBB7_56 JLE LBB7_59
MOVQ SI, R11
MOVQ -56(BP), AX
MOVQ 0(AX), R9
QUAD $0xffffff82056ffac5 // vmovdqu $-126(%rip), %xmm0 /* LCPI7_0(%rip) */
QUAD $0xffffff8a0d6ffac5 // vmovdqu $-118(%rip), %xmm1 /* LCPI7_1(%rip) */
QUAD $0xffffff92156ffac5 // vmovdqu $-110(%rip), %xmm2 /* LCPI7_2(%rip) */
QUAD $0xffffff9a1d6ffac5 // vmovdqu $-102(%rip), %xmm3 /* LCPI7_3(%rip) */
MOVQ $5764607797912141824, R14
LONG $0x0a3d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44042(%rip), %r15 /* __HtmlQuoteTab(%rip) */
MOVQ $12884901889, DI
MOVQ -64(BP), AX MOVQ -64(BP), AX
MOVQ -48(BP), R10 MOVQ 0(AX), R9
JMP LBB7_2 QUAD $0xffffff85056ffac5 // vmovdqu $-123(%rip), %xmm0 /* LCPI7_0(%rip) */
QUAD $0xffffff8d0d6ffac5 // vmovdqu $-115(%rip), %xmm1 /* LCPI7_1(%rip) */
LBB7_55: QUAD $0xffffff95156ffac5 // vmovdqu $-107(%rip), %xmm2 /* LCPI7_2(%rip) */
INCQ AX QUAD $0xffffff9d1d6ffac5 // vmovdqu $-99(%rip), %xmm3 /* LCPI7_3(%rip) */
ADDQ SI, R10 MOVQ $5764607797912141824, R14
DECQ R11 LONG $0x571d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44119(%rip), %r11 /* __HtmlQuoteTab(%rip) */
JE LBB7_56 MOVQ -48(BP), R15
MOVQ -56(BP), R10
LBB7_2: LBB7_2:
CMPQ R11, $15 TESTQ R9, R9
SETGT CX JLE LBB7_61
MOVQ R9, R13 CMPQ SI, $15
SETGT BX
MOVQ R9, R12
MOVQ R10, R8 MOVQ R10, R8
MOVQ R11, SI MOVQ SI, AX
MOVQ AX, R12 MOVQ R15, R13
CMPQ R9, $16 CMPQ R9, $16
JL LBB7_9 JL LBB7_9
CMPQ R11, $16 CMPQ SI, $16
JL LBB7_9 JL LBB7_9
MOVQ AX, R12 MOVQ R15, R13
MOVQ R11, SI MOVQ SI, AX
MOVQ R10, R8 MOVQ R10, R8
MOVQ R9, BX MOVQ R9, CX
LBB7_5: LBB7_6:
LONG $0x6f7ac1c4; WORD $0x2424 // vmovdqu (%r12), %xmm4 LONG $0x6f7ac1c4; WORD $0x0065 // vmovdqu (%r13), %xmm4
LONG $0xe874d9c5 // vpcmpeqb %xmm0, %xmm4, %xmm5 LONG $0xe874d9c5 // vpcmpeqb %xmm0, %xmm4, %xmm5
LONG $0xf174d9c5 // vpcmpeqb %xmm1, %xmm4, %xmm6 LONG $0xf174d9c5 // vpcmpeqb %xmm1, %xmm4, %xmm6
LONG $0xedebc9c5 // vpor %xmm5, %xmm6, %xmm5 LONG $0xedebc9c5 // vpor %xmm5, %xmm6, %xmm5
@ -2587,251 +2580,312 @@ LBB7_5:
LONG $0xf374c9c5 // vpcmpeqb %xmm3, %xmm6, %xmm6 LONG $0xf374c9c5 // vpcmpeqb %xmm3, %xmm6, %xmm6
LONG $0xeeebd1c5 // vpor %xmm6, %xmm5, %xmm5 LONG $0xeeebd1c5 // vpor %xmm6, %xmm5, %xmm5
LONG $0x7f7ac1c4; BYTE $0x20 // vmovdqu %xmm4, (%r8) LONG $0x7f7ac1c4; BYTE $0x20 // vmovdqu %xmm4, (%r8)
LONG $0xcdd7f9c5 // vpmovmskb %xmm5, %ecx LONG $0xd5d7f9c5 // vpmovmskb %xmm5, %edx
TESTW CX, CX TESTW DX, DX
JNE LBB7_6 JNE LBB7_21
ADDQ $16, R12 ADDQ $16, R13
ADDQ $16, R8 ADDQ $16, R8
LEAQ -16(BX), R13 LEAQ -16(CX), R12
CMPQ SI, $31 CMPQ AX, $31
SETGT CX SETGT BX
CMPQ SI, $32 CMPQ AX, $32
LEAQ -16(SI), SI LEAQ -16(AX), AX
JL LBB7_9 JL LBB7_9
CMPQ BX, $31 CMPQ CX, $31
MOVQ R13, BX MOVQ R12, CX
JG LBB7_5 JG LBB7_6
LBB7_9: LBB7_9:
TESTB CX, CX TESTB BX, BX
JE LBB7_10 JE LBB7_13
MOVQ R14, DX MOVQ R14, DX
LONG $0x6f7ac1c4; WORD $0x2424 // vmovdqu (%r12), %xmm4 LONG $0x6f7ac1c4; WORD $0x0065 // vmovdqu (%r13), %xmm4
LONG $0xe874d9c5 // vpcmpeqb %xmm0, %xmm4, %xmm5 LONG $0xe874d9c5 // vpcmpeqb %xmm0, %xmm4, %xmm5
LONG $0xf174d9c5 // vpcmpeqb %xmm1, %xmm4, %xmm6 LONG $0xf174d9c5 // vpcmpeqb %xmm1, %xmm4, %xmm6
LONG $0xedebc9c5 // vpor %xmm5, %xmm6, %xmm5 LONG $0xedebc9c5 // vpor %xmm5, %xmm6, %xmm5
LONG $0xf2ebd9c5 // vpor %xmm2, %xmm4, %xmm6 LONG $0xf2ebd9c5 // vpor %xmm2, %xmm4, %xmm6
LONG $0xf374c9c5 // vpcmpeqb %xmm3, %xmm6, %xmm6 LONG $0xf374c9c5 // vpcmpeqb %xmm3, %xmm6, %xmm6
LONG $0xeeebd1c5 // vpor %xmm6, %xmm5, %xmm5 LONG $0xeeebd1c5 // vpor %xmm6, %xmm5, %xmm5
LONG $0xcdd7f9c5 // vpmovmskb %xmm5, %ecx LONG $0xc5d7f9c5 // vpmovmskb %xmm5, %eax
ORL $65536, CX ORL $65536, AX
BSFL CX, R14 BSFL AX, R14
LONG $0x7ef9e1c4; BYTE $0xe1 // vmovq %xmm4, %rcx LONG $0x7ef9e1c4; BYTE $0xe0 // vmovq %xmm4, %rax
CMPQ R13, R14 CMPQ R12, R14
JGE LBB7_18 JGE LBB7_22
CMPQ R13, $8 CMPQ R12, $8
JB LBB7_29 JB LBB7_25
MOVQ CX, 0(R8) MOVQ AX, 0(R8)
LEAQ 8(R12), SI LEAQ 8(R13), R14
ADDQ $8, R8 ADDQ $8, R8
LEAQ -8(R13), CX LEAQ -8(R12), AX
MOVQ DX, R14 CMPQ AX, $4
CMPQ CX, $4 JAE LBB7_26
JAE LBB7_32 JMP LBB7_27
JMP LBB7_33
LBB7_10:
TESTQ R13, R13
JLE LBB7_16
TESTQ SI, SI
JLE LBB7_16
LBB7_12:
MOVBLZX 0(R12), CX
CMPQ CX, $62
JA LBB7_13
BTQ CX, R14
JB LBB7_39
LBB7_13: LBB7_13:
TESTQ R12, R12
JLE LBB7_20
TESTQ AX, AX
JLE LBB7_20
LBB7_15:
MOVBLZX 0(R13), CX
CMPQ CX, $62
JA LBB7_17
BTQ CX, R14
JB LBB7_24
LBB7_17:
CMPB CX, $-30 CMPB CX, $-30
JE LBB7_39 JE LBB7_24
INCQ R12 INCQ R13
MOVB CX, 0(R8) MOVB CX, 0(R8)
CMPQ SI, $2 CMPQ AX, $2
LEAQ -1(SI), SI LEAQ -1(AX), AX
JL LBB7_16 JL LBB7_20
INCQ R8 INCQ R8
CMPQ R13, $1 CMPQ R12, $1
LEAQ -1(R13), R13 LEAQ -1(R12), R12
JG LBB7_12 JG LBB7_15
LBB7_16: LBB7_20:
SUBQ AX, R12 SUBQ R15, R13
NEGQ SI NEGQ AX
SBBQ R13, R13 SBBQ R12, R12
XORQ R12, R13 XORQ R13, R12
JMP LBB7_40 TESTQ R12, R12
JNS LBB7_37
JMP LBB7_57
LBB7_6: LBB7_21:
MOVWLZX CX, CX MOVWLZX DX, AX
SUBQ AX, R12 SUBQ R15, R13
BSFL CX, R13 BSFL AX, R12
ADDQ R12, R13 ADDQ R13, R12
JMP LBB7_40 TESTQ R12, R12
JNS LBB7_37
JMP LBB7_57
LBB7_18: LBB7_22:
CMPL R14, $8 CMPL R14, $8
JB LBB7_19 JB LBB7_31
MOVQ CX, 0(R8) MOVQ AX, 0(R8)
LEAQ 8(R12), R13 LEAQ 8(R13), R12
ADDQ $8, R8 ADDQ $8, R8
LEAQ -8(R14), SI LEAQ -8(R14), AX
CMPQ SI, $4 CMPQ AX, $4
JAE LBB7_22 JAE LBB7_32
JMP LBB7_23 JMP LBB7_33
LBB7_24:
SUBQ R15, R13
MOVQ R13, R12
TESTQ R12, R12
JNS LBB7_37
JMP LBB7_57
LBB7_25:
MOVQ R13, R14
MOVQ R12, AX
CMPQ AX, $4
JB LBB7_27
LBB7_26:
MOVL 0(R14), CX
MOVL CX, 0(R8)
ADDQ $4, R14
ADDQ $4, R8
ADDQ $-4, AX
LBB7_27:
CMPQ AX, $2
JB LBB7_28
MOVWLZX 0(R14), CX
MOVW CX, 0(R8)
ADDQ $2, R14
ADDQ $2, R8
ADDQ $-2, AX
TESTQ AX, AX
JNE LBB7_29
JMP LBB7_30
LBB7_28:
TESTQ AX, AX
JE LBB7_30
LBB7_29: LBB7_29:
MOVQ R12, SI MOVB 0(R14), AX
MOVQ R13, CX MOVB AX, 0(R8)
MOVQ DX, R14
CMPQ CX, $4 LBB7_30:
SUBQ R15, R12
ADDQ R13, R12
NOTQ R12
MOVQ DX, R14
TESTQ R12, R12
JNS LBB7_37
JMP LBB7_57
LBB7_31:
MOVQ R13, R12
MOVQ R14, AX
CMPQ AX, $4
JB LBB7_33 JB LBB7_33
LBB7_32: LBB7_32:
MOVL 0(SI), DX MOVL 0(R12), CX
MOVL DX, 0(R8) MOVL CX, 0(R8)
ADDQ $4, SI ADDQ $4, R12
ADDQ $4, R8 ADDQ $4, R8
ADDQ $-4, CX ADDQ $-4, AX
LBB7_33: LBB7_33:
CMPQ CX, $2 CMPQ AX, $2
JAE LBB7_34 JB LBB7_34
TESTQ CX, CX MOVWLZX 0(R12), CX
JE LBB7_37 MOVW CX, 0(R8)
ADDQ $2, R12
LBB7_36: ADDQ $2, R8
MOVB 0(SI), CX ADDQ $-2, AX
MOVB CX, 0(R8) TESTQ AX, AX
JNE LBB7_35
LBB7_37: JMP LBB7_36
SUBQ AX, R13
ADDQ R12, R13
NOTQ R13
JMP LBB7_40
LBB7_39:
SUBQ AX, R12
MOVQ R12, R13
JMP LBB7_40
LBB7_19:
MOVQ R12, R13
MOVQ R14, SI
CMPQ SI, $4
JB LBB7_23
LBB7_22:
MOVL 0(R13), CX
MOVL CX, 0(R8)
ADDQ $4, R13
ADDQ $4, R8
ADDQ $-4, SI
LBB7_23:
CMPQ SI, $2
JAE LBB7_24
TESTQ SI, SI
JE LBB7_27
LBB7_26:
MOVB 0(R13), CX
MOVB CX, 0(R8)
LBB7_27:
SUBQ AX, R12
ADDQ R14, R12
MOVQ R12, R13
MOVQ DX, R14
LBB7_40:
TESTQ R13, R13
JS LBB7_41
ADDQ R13, AX
ADDQ R13, R10
SUBQ R13, R11
JLE LBB7_56
SUBQ R13, R9
CMPQ R11, $3
JL LBB7_46
MOVL 0(AX), CX
MOVL $16711679, DX
ANDL DX, CX
CMPL CX, $11043042
JNE LBB7_46
ADDQ $2, AX
ADDQ $-2, R11
LBB7_46:
MOVBLZX 0(AX), DX
SHLQ $4, DX
MOVQ 0(DX)(R15*1), BX
MOVLQSX BX, SI
SUBQ SI, R9
JL LBB7_47
SHLQ $32, BX
LEAQ 8(DX)(R15*1), CX
CMPQ BX, DI
JL LBB7_49
MOVL 0(CX), CX
MOVL CX, 0(R10)
LEAQ 12(DX)(R15*1), CX
LEAQ 4(R10), BX
LEAQ -4(SI), DX
CMPQ DX, $2
JGE LBB7_52
JMP LBB7_53
LBB7_49:
MOVQ R10, BX
MOVQ SI, DX
CMPQ DX, $2
JL LBB7_53
LBB7_52:
MOVQ DI, R8
MOVWLZX 0(CX), DI
MOVW DI, 0(BX)
MOVQ R8, DI
ADDQ $2, CX
ADDQ $2, BX
ADDQ $-2, DX
LBB7_53:
TESTQ DX, DX
JLE LBB7_55
MOVB 0(CX), CX
MOVB CX, 0(BX)
JMP LBB7_55
LBB7_34: LBB7_34:
MOVWLZX 0(SI), DX TESTQ AX, AX
JE LBB7_36
LBB7_35:
MOVB 0(R12), AX
MOVB AX, 0(R8)
LBB7_36:
SUBQ R15, R13
ADDQ R14, R13
MOVQ R13, R12
MOVQ DX, R14
TESTQ R12, R12
JS LBB7_57
LBB7_37:
ADDQ R12, R15
ADDQ R12, R10
SUBQ R12, SI
JLE LBB7_58
SUBQ R12, R9
MOVB 0(R15), CX
CMPB CX, $-30
JE LBB7_51
MOVQ R15, AX
LBB7_40:
MOVBLZX CX, DX
SHLQ $4, DX
MOVQ 0(DX)(R11*1), DI
MOVLQSX DI, BX
SUBQ BX, R9
JL LBB7_60
SHLQ $32, DI
LEAQ 8(DX)(R11*1), R15
MOVQ $12884901889, CX
CMPQ DI, CX
JL LBB7_43
MOVL 0(R15), CX
MOVL CX, 0(R10)
LEAQ 12(DX)(R11*1), R15
LEAQ 4(R10), R8
LEAQ -4(BX), DI
CMPQ DI, $2
JGE LBB7_44
JMP LBB7_45
LBB7_43:
MOVQ R10, R8
MOVQ BX, DI
CMPQ DI, $2
JL LBB7_45
LBB7_44:
MOVWLZX 0(R15), DX
MOVW DX, 0(R8) MOVW DX, 0(R8)
ADDQ $2, SI ADDQ $2, R15
ADDQ $2, R8 ADDQ $2, R8
ADDQ $-2, CX ADDQ $-2, DI
TESTQ CX, CX
JNE LBB7_36
JMP LBB7_37
LBB7_24: LBB7_45:
MOVWLZX 0(R13), CX TESTQ DI, DI
MOVW CX, 0(R8) JLE LBB7_47
ADDQ $2, R13 MOVB 0(R15), CX
ADDQ $2, R8 MOVB CX, 0(R8)
ADDQ $-2, SI
TESTQ SI, SI
JNE LBB7_26
JMP LBB7_27
LBB7_56: LBB7_47:
SUBQ -48(BP), R10 ADDQ BX, R10
MOVQ -56(BP), CX
MOVQ R10, 0(CX) LBB7_48:
SUBQ -64(BP), AX INCQ AX
MOVQ AX, R15
CMPQ SI, $1
LEAQ -1(SI), SI
JG LBB7_2
JMP LBB7_59
LBB7_51:
CMPQ SI, $3
JL LBB7_55
CMPB 1(R15), $-128
JNE LBB7_55
MOVB 2(R15), CX
MOVL CX, AX
ANDB $-2, AX
CMPB AX, $-88
JNE LBB7_55
LEAQ 2(R15), AX
ADDQ $-2, SI
JMP LBB7_40
LBB7_55:
TESTQ R9, R9
JLE LBB7_61
MOVB $-30, 0(R10)
INCQ R10
DECQ R9
MOVQ R15, AX
JMP LBB7_48
LBB7_57: LBB7_57:
SUBQ -56(BP), R10
NOTQ R12
ADDQ R12, R10
MOVQ -64(BP), AX
MOVQ R10, 0(AX)
SUBQ -48(BP), R15
ADDQ R12, R15
NOTQ R15
JMP LBB7_62
LBB7_58:
MOVQ R15, AX
LBB7_59:
SUBQ -56(BP), R10
MOVQ -64(BP), CX
MOVQ R10, 0(CX)
SUBQ -48(BP), AX
JMP LBB7_63
LBB7_60:
SUBQ -56(BP), R10
MOVQ -64(BP), AX
MOVQ R10, 0(AX)
LBB7_61:
NOTQ R15
ADDQ -48(BP), R15
LBB7_62:
MOVQ R15, AX
LBB7_63:
ADDQ $24, SP ADDQ $24, SP
BYTE $0x5b // popq %rbx BYTE $0x5b // popq %rbx
WORD $0x5c41 // popq %r12 WORD $0x5c41 // popq %r12
@ -2841,25 +2895,6 @@ LBB7_57:
BYTE $0x5d // popq %rbp BYTE $0x5d // popq %rbp
RET RET
LBB7_41:
SUBQ -48(BP), R10
NOTQ R13
ADDQ R13, R10
MOVQ -56(BP), CX
MOVQ R10, 0(CX)
SUBQ -64(BP), AX
ADDQ R13, AX
NOTQ AX
JMP LBB7_57
LBB7_47:
SUBQ -48(BP), R10
MOVQ -56(BP), CX
MOVQ R10, 0(CX)
NOTQ AX
ADDQ -64(BP), AX
JMP LBB7_57
_atof_eisel_lemire64: _atof_eisel_lemire64:
BYTE $0x55 // pushq %rbp BYTE $0x55 // pushq %rbp
WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp
@ -11515,7 +11550,7 @@ _skip_array:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ m+16(FP), DX MOVQ m+16(FP), DX
CALL ·__native_entry__+17296(SB) // _skip_array CALL ·__native_entry__+17370(SB) // _skip_array
MOVQ AX, ret+24(FP) MOVQ AX, ret+24(FP)
RET RET
@ -11536,7 +11571,7 @@ _skip_object:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ m+16(FP), DX MOVQ m+16(FP), DX
CALL ·__native_entry__+17333(SB) // _skip_object CALL ·__native_entry__+17407(SB) // _skip_object
MOVQ AX, ret+24(FP) MOVQ AX, ret+24(FP)
RET RET
@ -11557,7 +11592,7 @@ _skip_one:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ m+16(FP), DX MOVQ m+16(FP), DX
CALL ·__native_entry__+15444(SB) // _skip_one CALL ·__native_entry__+15518(SB) // _skip_one
MOVQ AX, ret+24(FP) MOVQ AX, ret+24(FP)
RET RET
@ -11621,7 +11656,7 @@ _validate_one:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ m+16(FP), DX MOVQ m+16(FP), DX
CALL ·__native_entry__+20414(SB) // _validate_one CALL ·__native_entry__+20488(SB) // _validate_one
MOVQ AX, ret+24(FP) MOVQ AX, ret+24(FP)
RET RET
@ -11644,7 +11679,7 @@ _value:
MOVQ p+16(FP), DX MOVQ p+16(FP), DX
MOVQ v+24(FP), CX MOVQ v+24(FP), CX
MOVQ allow_control+32(FP), R8 MOVQ allow_control+32(FP), R8
CALL ·__native_entry__+10806(SB) // _value CALL ·__native_entry__+10880(SB) // _value
MOVQ AX, ret+40(FP) MOVQ AX, ret+40(FP)
RET RET
@ -11665,7 +11700,7 @@ _vnumber:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ v+16(FP), DX MOVQ v+16(FP), DX
LEAQ ·__native_entry__+13602(SB), AX // _vnumber LEAQ ·__native_entry__+13676(SB), AX // _vnumber
JMP AX JMP AX
_stack_grow: _stack_grow:
@ -11685,7 +11720,7 @@ _vsigned:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ v+16(FP), DX MOVQ v+16(FP), DX
LEAQ ·__native_entry__+14916(SB), AX // _vsigned LEAQ ·__native_entry__+14990(SB), AX // _vsigned
JMP AX JMP AX
_stack_grow: _stack_grow:
@ -11705,7 +11740,7 @@ _vstring:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ v+16(FP), DX MOVQ v+16(FP), DX
LEAQ ·__native_entry__+12567(SB), AX // _vstring LEAQ ·__native_entry__+12641(SB), AX // _vstring
JMP AX JMP AX
_stack_grow: _stack_grow:
@ -11725,7 +11760,7 @@ _vunsigned:
MOVQ s+0(FP), DI MOVQ s+0(FP), DI
MOVQ p+8(FP), SI MOVQ p+8(FP), SI
MOVQ v+16(FP), DX MOVQ v+16(FP), DX
LEAQ ·__native_entry__+15175(SB), AX // _vunsigned LEAQ ·__native_entry__+15249(SB), AX // _vunsigned
JMP AX JMP AX
_stack_grow: _stack_grow:

View file

@ -228,7 +228,7 @@ func TestNative_HTMLEscapeNoMem(t *testing.T) {
dp := (*rt.GoSlice)(unsafe.Pointer(&d)) dp := (*rt.GoSlice)(unsafe.Pointer(&d))
sp := (*rt.GoString)(unsafe.Pointer(&s)) sp := (*rt.GoString)(unsafe.Pointer(&s))
rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len) rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len)
assert.Equal(t, -8, rv) assert.Equal(t, -6, rv)
assert.Equal(t, 5, len(d)) assert.Equal(t, 5, len(d))
assert.Equal(t, `hello`, string(d)) assert.Equal(t, `hello`, string(d))
} }

View file

@ -15,17 +15,17 @@ var (
_subr__lspace = __native_entry__() + 301 _subr__lspace = __native_entry__() + 301
_subr__lzero = __native_entry__() + 13 _subr__lzero = __native_entry__() + 13
_subr__quote = __native_entry__() + 4955 _subr__quote = __native_entry__() + 4955
_subr__skip_array = __native_entry__() + 17296 _subr__skip_array = __native_entry__() + 17370
_subr__skip_object = __native_entry__() + 17333 _subr__skip_object = __native_entry__() + 17407
_subr__skip_one = __native_entry__() + 15444 _subr__skip_one = __native_entry__() + 15518
_subr__u64toa = __native_entry__() + 3735 _subr__u64toa = __native_entry__() + 3735
_subr__unquote = __native_entry__() + 6005 _subr__unquote = __native_entry__() + 6005
_subr__validate_one = __native_entry__() + 20414 _subr__validate_one = __native_entry__() + 20488
_subr__value = __native_entry__() + 10806 _subr__value = __native_entry__() + 10880
_subr__vnumber = __native_entry__() + 13602 _subr__vnumber = __native_entry__() + 13676
_subr__vsigned = __native_entry__() + 14916 _subr__vsigned = __native_entry__() + 14990
_subr__vstring = __native_entry__() + 12567 _subr__vstring = __native_entry__() + 12641
_subr__vunsigned = __native_entry__() + 15175 _subr__vunsigned = __native_entry__() + 15249
) )
const ( const (

File diff suppressed because it is too large Load diff

View file

@ -228,7 +228,7 @@ func TestNative_HTMLEscapeNoMem(t *testing.T) {
dp := (*rt.GoSlice)(unsafe.Pointer(&d)) dp := (*rt.GoSlice)(unsafe.Pointer(&d))
sp := (*rt.GoString)(unsafe.Pointer(&s)) sp := (*rt.GoString)(unsafe.Pointer(&s))
rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len) rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len)
assert.Equal(t, -8, rv) assert.Equal(t, -6, rv)
assert.Equal(t, 5, len(d)) assert.Equal(t, 5, len(d))
assert.Equal(t, `hello`, string(d)) assert.Equal(t, `hello`, string(d))
} }

View file

@ -15,22 +15,22 @@ var (
_subr__lspace = __native_entry__() + 429 _subr__lspace = __native_entry__() + 429
_subr__lzero = __native_entry__() + 13 _subr__lzero = __native_entry__() + 13
_subr__quote = __native_entry__() + 5328 _subr__quote = __native_entry__() + 5328
_subr__skip_array = __native_entry__() + 21301 _subr__skip_array = __native_entry__() + 21375
_subr__skip_object = __native_entry__() + 21338 _subr__skip_object = __native_entry__() + 21412
_subr__skip_one = __native_entry__() + 18201 _subr__skip_one = __native_entry__() + 18275
_subr__u64toa = __native_entry__() + 4008 _subr__u64toa = __native_entry__() + 4008
_subr__unquote = __native_entry__() + 7080 _subr__unquote = __native_entry__() + 7080
_subr__validate_one = __native_entry__() + 24949 _subr__validate_one = __native_entry__() + 25023
_subr__value = __native_entry__() + 13707 _subr__value = __native_entry__() + 13781
_subr__vnumber = __native_entry__() + 16359 _subr__vnumber = __native_entry__() + 16433
_subr__vsigned = __native_entry__() + 17673 _subr__vsigned = __native_entry__() + 17747
_subr__vstring = __native_entry__() + 15482 _subr__vstring = __native_entry__() + 15556
_subr__vunsigned = __native_entry__() + 17932 _subr__vunsigned = __native_entry__() + 18006
) )
const ( const (
_stack__f64toa = 120 _stack__f64toa = 120
_stack__html_escape = 56 _stack__html_escape = 72
_stack__i64toa = 24 _stack__i64toa = 24
_stack__lspace = 8 _stack__lspace = 8
_stack__lzero = 8 _stack__lzero = 8

View file

@ -226,7 +226,7 @@ func TestNative_HTMLEscapeNoMem(t *testing.T) {
dp := (*rt.GoSlice)(unsafe.Pointer(&d)) dp := (*rt.GoSlice)(unsafe.Pointer(&d))
sp := (*rt.GoString)(unsafe.Pointer(&s)) sp := (*rt.GoString)(unsafe.Pointer(&s))
rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len) rv := __html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len)
assert.Equal(t, -8, rv) assert.Equal(t, -6, rv)
assert.Equal(t, 5, len(d)) assert.Equal(t, 5, len(d))
assert.Equal(t, `hello`, string(d)) assert.Equal(t, `hello`, string(d))
} }

View file

@ -15,6 +15,7 @@
*/ */
#include "native.h" #include "native.h"
#include <stdint.h>
/** String Quoting **/ /** String Quoting **/
@ -760,13 +761,19 @@ ssize_t html_escape(const char *sp, ssize_t nb, char *dp, ssize_t *dn) {
const quoted_t * tab = _HtmlQuoteTab; const quoted_t * tab = _HtmlQuoteTab;
/* find the special characters, copy on the fly */ /* find the special characters, copy on the fly */
while (nb != 0) { while (nb > 0) {
int nc = 0; int nc = 0;
uint8_t ch = 0; uint8_t ch = 0;
ssize_t rb = memcchr_html_quote(sp, nb, dp, nd); ssize_t rb = 0;
const char * cur = 0;
/* not enough buffer space */ /* not enough buffer space */
if (rb < 0) { if (nd <= 0) {
return -(sp - ss) - 1;
}
/* find and copy */
if ((rb = memcchr_html_quote(sp, nb, dp, nd)) < 0) {
*dn = dp - ds - rb - 1; *dn = dp - ds - rb - 1;
return -(sp - ss - rb - 1) - 1; return -(sp - ss - rb - 1) - 1;
} }
@ -782,10 +789,20 @@ ssize_t html_escape(const char *sp, ssize_t nb, char *dp, ssize_t *dn) {
break; break;
} }
/* check for \u2028 and \u2029, [e2 80 a8] and [e2 80 a9] */ /* mark cur postion */
if (nb >= 3 && 0xa880e2 == (*(uint32_t *)sp & 0xfeffff)) { cur = sp;
sp += 2;
nb -= 2; /* check for \u2028 and \u2029, binary is \xe2\x80\xa8 and \xe2\x80\xa9 */
if (unlikely(*sp == '\xe2')) {
if (nb >= 3 && *(sp+1) == '\x80' && (*(sp+2) == '\xa8' || *(sp+2) == '\xa9')) {
sp += 2, nb -= 2;
} else if (nd > 0) {
*dp++ = *sp++;
nb--, nd--;
continue;
} else {
return -(sp - ss) - 1;
}
} }
/* get the escape entry, handle consecutive quotes */ /* get the escape entry, handle consecutive quotes */
@ -796,7 +813,7 @@ ssize_t html_escape(const char *sp, ssize_t nb, char *dp, ssize_t *dn) {
/* check for buffer space */ /* check for buffer space */
if (nd < nc) { if (nd < nc) {
*dn = dp - ds; *dn = dp - ds;
return -(sp - ss) - 1; return -(cur - ss) - 1;
} }
/* copy the quoted value */ /* copy the quoted value */