Skip to content

Commit 5092ce5

Browse files
author
Zoltan Herczeg
committed
Support boolean properties in JIT
1 parent 06d3a66 commit 5092ce5

File tree

1 file changed

+82
-84
lines changed

1 file changed

+82
-84
lines changed

src/pcre2_jit_compile.c

Lines changed: 82 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -7418,9 +7418,9 @@ static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHA
74187418
#define XCLASS_HAS_TYPE 0x004
74197419
#define XCLASS_HAS_SCRIPT 0x008
74207420
#define XCLASS_HAS_SCRIPT_EXTENSION 0x010
7421-
#define XCLASS_HAS_BIDICO 0x020
7421+
#define XCLASS_HAS_BOOL 0x020
74227422
#define XCLASS_HAS_BIDICL 0x040
7423-
#define XCLASS_NEEDS_UCD (XCLASS_HAS_TYPE | XCLASS_HAS_SCRIPT | XCLASS_HAS_SCRIPT_EXTENSION | XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL)
7423+
#define XCLASS_NEEDS_UCD (XCLASS_HAS_TYPE | XCLASS_HAS_SCRIPT | XCLASS_HAS_SCRIPT_EXTENSION | XCLASS_HAS_BOOL | XCLASS_HAS_BIDICL)
74247424
#define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
74257425
#define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
74267426
#define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
@@ -7551,8 +7551,8 @@ while (*cc != XCL_END)
75517551
unicode_status |= XCLASS_SAVE_CHAR;
75527552
break;
75537553

7554-
case PT_BIDICO:
7555-
unicode_status |= XCLASS_HAS_BIDICO;
7554+
case PT_BOOL:
7555+
unicode_status |= XCLASS_HAS_BOOL;
75567556
break;
75577557

75587558
case PT_BIDICL:
@@ -7668,6 +7668,82 @@ if (unicode_status & XCLASS_NEEDS_UCD)
76687668

76697669
ccbegin = cc;
76707670

7671+
if (unicode_status & XCLASS_HAS_BIDICL)
7672+
{
7673+
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bidi));
7674+
7675+
while (*cc != XCL_END)
7676+
{
7677+
if (*cc == XCL_SINGLE)
7678+
{
7679+
cc ++;
7680+
GETCHARINCTEST(c, cc);
7681+
}
7682+
else if (*cc == XCL_RANGE)
7683+
{
7684+
cc ++;
7685+
GETCHARINCTEST(c, cc);
7686+
GETCHARINCTEST(c, cc);
7687+
}
7688+
else
7689+
{
7690+
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
7691+
cc++;
7692+
if (*cc == PT_BIDICL)
7693+
{
7694+
compares--;
7695+
invertcmp = (compares == 0 && list != backtracks);
7696+
if (cc[-1] == XCL_NOTPROP)
7697+
invertcmp ^= 0x1;
7698+
jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
7699+
add_jump(compiler, compares > 0 ? list : backtracks, jump);
7700+
}
7701+
cc += 2;
7702+
}
7703+
}
7704+
7705+
cc = ccbegin;
7706+
}
7707+
7708+
if (unicode_status & XCLASS_HAS_BOOL)
7709+
{
7710+
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bprops));
7711+
OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
7712+
7713+
while (*cc != XCL_END)
7714+
{
7715+
if (*cc == XCL_SINGLE)
7716+
{
7717+
cc ++;
7718+
GETCHARINCTEST(c, cc);
7719+
}
7720+
else if (*cc == XCL_RANGE)
7721+
{
7722+
cc ++;
7723+
GETCHARINCTEST(c, cc);
7724+
GETCHARINCTEST(c, cc);
7725+
}
7726+
else
7727+
{
7728+
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
7729+
cc++;
7730+
if (*cc == PT_BOOL)
7731+
{
7732+
compares--;
7733+
invertcmp = (compares == 0 && list != backtracks);
7734+
if (cc[-1] == XCL_NOTPROP)
7735+
invertcmp ^= 0x1;
7736+
7737+
OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP1), (sljit_sw)(PRIV(ucd_boolprop_sets) + (cc[1] >> 5)), SLJIT_IMM, (sljit_sw)1 << (cc[1] & 0x1f));
7738+
add_jump(compiler, compares > 0 ? list : backtracks, JUMP(SLJIT_NOT_ZERO ^ invertcmp));
7739+
}
7740+
cc += 2;
7741+
}
7742+
}
7743+
7744+
cc = ccbegin;
7745+
}
7746+
76717747
if (unicode_status & XCLASS_HAS_SCRIPT)
76727748
{
76737749
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
@@ -7718,7 +7794,7 @@ if (unicode_status & XCLASS_NEEDS_UCD)
77187794

77197795
if (unicode_status & XCLASS_SCRIPT_EXTENSION_NOTPROP)
77207796
{
7721-
if (unicode_status & (XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL | XCLASS_HAS_TYPE))
7797+
if (unicode_status & XCLASS_HAS_TYPE)
77227798
{
77237799
if (unicode_status & XCLASS_SAVE_CHAR)
77247800
{
@@ -7785,84 +7861,6 @@ if (unicode_status & XCLASS_NEEDS_UCD)
77857861
cc = ccbegin;
77867862
}
77877863

7788-
if (unicode_status & (XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL))
7789-
{
7790-
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bidi));
7791-
7792-
if (unicode_status & XCLASS_HAS_BIDICO)
7793-
{
7794-
while (*cc != XCL_END)
7795-
{
7796-
if (*cc == XCL_SINGLE)
7797-
{
7798-
cc ++;
7799-
GETCHARINCTEST(c, cc);
7800-
}
7801-
else if (*cc == XCL_RANGE)
7802-
{
7803-
cc ++;
7804-
GETCHARINCTEST(c, cc);
7805-
GETCHARINCTEST(c, cc);
7806-
}
7807-
else
7808-
{
7809-
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
7810-
cc++;
7811-
if (*cc == PT_BIDICO)
7812-
{
7813-
compares--;
7814-
invertcmp = (compares == 0 && list != backtracks);
7815-
if (cc[-1] == XCL_NOTPROP)
7816-
invertcmp ^= 0x1;
7817-
OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, UCD_BIDICONTROL_BIT);
7818-
jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
7819-
add_jump(compiler, compares > 0 ? list : backtracks, jump);
7820-
}
7821-
cc += 2;
7822-
}
7823-
}
7824-
7825-
cc = ccbegin;
7826-
}
7827-
7828-
if (unicode_status & XCLASS_HAS_BIDICL)
7829-
{
7830-
OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BIDICLASS_MASK);
7831-
7832-
while (*cc != XCL_END)
7833-
{
7834-
if (*cc == XCL_SINGLE)
7835-
{
7836-
cc ++;
7837-
GETCHARINCTEST(c, cc);
7838-
}
7839-
else if (*cc == XCL_RANGE)
7840-
{
7841-
cc ++;
7842-
GETCHARINCTEST(c, cc);
7843-
GETCHARINCTEST(c, cc);
7844-
}
7845-
else
7846-
{
7847-
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
7848-
cc++;
7849-
if (*cc == PT_BIDICL)
7850-
{
7851-
compares--;
7852-
invertcmp = (compares == 0 && list != backtracks);
7853-
if (cc[-1] == XCL_NOTPROP)
7854-
invertcmp ^= 0x1;
7855-
jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
7856-
add_jump(compiler, compares > 0 ? list : backtracks, jump);
7857-
}
7858-
cc += 2;
7859-
}
7860-
}
7861-
7862-
cc = ccbegin;
7863-
}
7864-
}
7865-
78667864
if (unicode_status & XCLASS_SAVE_CHAR)
78677865
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
78687866

@@ -7975,7 +7973,7 @@ while (*cc != XCL_END)
79757973

79767974
case PT_SC:
79777975
case PT_SCX:
7978-
case PT_BIDICO:
7976+
case PT_BOOL:
79797977
case PT_BIDICL:
79807978
compares++;
79817979
/* Do nothing. */

0 commit comments

Comments
 (0)