Support boolean properties in JIT (#76)
Co-authored-by: Zoltan Herczeg <hzmester@freemail.hu>
This commit is contained in:
parent
06d3a66065
commit
68fbc1982e
|
@ -7418,9 +7418,9 @@ static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHA
|
||||||
#define XCLASS_HAS_TYPE 0x004
|
#define XCLASS_HAS_TYPE 0x004
|
||||||
#define XCLASS_HAS_SCRIPT 0x008
|
#define XCLASS_HAS_SCRIPT 0x008
|
||||||
#define XCLASS_HAS_SCRIPT_EXTENSION 0x010
|
#define XCLASS_HAS_SCRIPT_EXTENSION 0x010
|
||||||
#define XCLASS_HAS_BIDICO 0x020
|
#define XCLASS_HAS_BOOL 0x020
|
||||||
#define XCLASS_HAS_BIDICL 0x040
|
#define XCLASS_HAS_BIDICL 0x040
|
||||||
#define XCLASS_NEEDS_UCD (XCLASS_HAS_TYPE | XCLASS_HAS_SCRIPT | XCLASS_HAS_SCRIPT_EXTENSION | XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL)
|
#define XCLASS_NEEDS_UCD (XCLASS_HAS_TYPE | XCLASS_HAS_SCRIPT | XCLASS_HAS_SCRIPT_EXTENSION | XCLASS_HAS_BOOL | XCLASS_HAS_BIDICL)
|
||||||
#define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
|
#define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
|
||||||
#define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
|
#define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
|
||||||
#define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
|
#define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
|
||||||
|
@ -7551,8 +7551,8 @@ while (*cc != XCL_END)
|
||||||
unicode_status |= XCLASS_SAVE_CHAR;
|
unicode_status |= XCLASS_SAVE_CHAR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PT_BIDICO:
|
case PT_BOOL:
|
||||||
unicode_status |= XCLASS_HAS_BIDICO;
|
unicode_status |= XCLASS_HAS_BOOL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PT_BIDICL:
|
case PT_BIDICL:
|
||||||
|
@ -7668,6 +7668,82 @@ if (unicode_status & XCLASS_NEEDS_UCD)
|
||||||
|
|
||||||
ccbegin = cc;
|
ccbegin = cc;
|
||||||
|
|
||||||
|
if (unicode_status & XCLASS_HAS_BIDICL)
|
||||||
|
{
|
||||||
|
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bidi));
|
||||||
|
|
||||||
|
while (*cc != XCL_END)
|
||||||
|
{
|
||||||
|
if (*cc == XCL_SINGLE)
|
||||||
|
{
|
||||||
|
cc ++;
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
}
|
||||||
|
else if (*cc == XCL_RANGE)
|
||||||
|
{
|
||||||
|
cc ++;
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
|
||||||
|
cc++;
|
||||||
|
if (*cc == PT_BIDICL)
|
||||||
|
{
|
||||||
|
compares--;
|
||||||
|
invertcmp = (compares == 0 && list != backtracks);
|
||||||
|
if (cc[-1] == XCL_NOTPROP)
|
||||||
|
invertcmp ^= 0x1;
|
||||||
|
jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
|
||||||
|
add_jump(compiler, compares > 0 ? list : backtracks, jump);
|
||||||
|
}
|
||||||
|
cc += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cc = ccbegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unicode_status & XCLASS_HAS_BOOL)
|
||||||
|
{
|
||||||
|
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bprops));
|
||||||
|
OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
|
||||||
|
|
||||||
|
while (*cc != XCL_END)
|
||||||
|
{
|
||||||
|
if (*cc == XCL_SINGLE)
|
||||||
|
{
|
||||||
|
cc ++;
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
}
|
||||||
|
else if (*cc == XCL_RANGE)
|
||||||
|
{
|
||||||
|
cc ++;
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
GETCHARINCTEST(c, cc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
|
||||||
|
cc++;
|
||||||
|
if (*cc == PT_BOOL)
|
||||||
|
{
|
||||||
|
compares--;
|
||||||
|
invertcmp = (compares == 0 && list != backtracks);
|
||||||
|
if (cc[-1] == XCL_NOTPROP)
|
||||||
|
invertcmp ^= 0x1;
|
||||||
|
|
||||||
|
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));
|
||||||
|
add_jump(compiler, compares > 0 ? list : backtracks, JUMP(SLJIT_NOT_ZERO ^ invertcmp));
|
||||||
|
}
|
||||||
|
cc += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cc = ccbegin;
|
||||||
|
}
|
||||||
|
|
||||||
if (unicode_status & XCLASS_HAS_SCRIPT)
|
if (unicode_status & XCLASS_HAS_SCRIPT)
|
||||||
{
|
{
|
||||||
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
|
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)
|
||||||
|
|
||||||
if (unicode_status & XCLASS_SCRIPT_EXTENSION_NOTPROP)
|
if (unicode_status & XCLASS_SCRIPT_EXTENSION_NOTPROP)
|
||||||
{
|
{
|
||||||
if (unicode_status & (XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL | XCLASS_HAS_TYPE))
|
if (unicode_status & XCLASS_HAS_TYPE)
|
||||||
{
|
{
|
||||||
if (unicode_status & XCLASS_SAVE_CHAR)
|
if (unicode_status & XCLASS_SAVE_CHAR)
|
||||||
{
|
{
|
||||||
|
@ -7785,84 +7861,6 @@ if (unicode_status & XCLASS_NEEDS_UCD)
|
||||||
cc = ccbegin;
|
cc = ccbegin;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unicode_status & (XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL))
|
|
||||||
{
|
|
||||||
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bidi));
|
|
||||||
|
|
||||||
if (unicode_status & XCLASS_HAS_BIDICO)
|
|
||||||
{
|
|
||||||
while (*cc != XCL_END)
|
|
||||||
{
|
|
||||||
if (*cc == XCL_SINGLE)
|
|
||||||
{
|
|
||||||
cc ++;
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
}
|
|
||||||
else if (*cc == XCL_RANGE)
|
|
||||||
{
|
|
||||||
cc ++;
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
|
|
||||||
cc++;
|
|
||||||
if (*cc == PT_BIDICO)
|
|
||||||
{
|
|
||||||
compares--;
|
|
||||||
invertcmp = (compares == 0 && list != backtracks);
|
|
||||||
if (cc[-1] == XCL_NOTPROP)
|
|
||||||
invertcmp ^= 0x1;
|
|
||||||
OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, UCD_BIDICONTROL_BIT);
|
|
||||||
jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
|
|
||||||
add_jump(compiler, compares > 0 ? list : backtracks, jump);
|
|
||||||
}
|
|
||||||
cc += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cc = ccbegin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unicode_status & XCLASS_HAS_BIDICL)
|
|
||||||
{
|
|
||||||
OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BIDICLASS_MASK);
|
|
||||||
|
|
||||||
while (*cc != XCL_END)
|
|
||||||
{
|
|
||||||
if (*cc == XCL_SINGLE)
|
|
||||||
{
|
|
||||||
cc ++;
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
}
|
|
||||||
else if (*cc == XCL_RANGE)
|
|
||||||
{
|
|
||||||
cc ++;
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
GETCHARINCTEST(c, cc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
|
|
||||||
cc++;
|
|
||||||
if (*cc == PT_BIDICL)
|
|
||||||
{
|
|
||||||
compares--;
|
|
||||||
invertcmp = (compares == 0 && list != backtracks);
|
|
||||||
if (cc[-1] == XCL_NOTPROP)
|
|
||||||
invertcmp ^= 0x1;
|
|
||||||
jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
|
|
||||||
add_jump(compiler, compares > 0 ? list : backtracks, jump);
|
|
||||||
}
|
|
||||||
cc += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cc = ccbegin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unicode_status & XCLASS_SAVE_CHAR)
|
if (unicode_status & XCLASS_SAVE_CHAR)
|
||||||
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
|
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
|
||||||
|
|
||||||
|
@ -7975,7 +7973,7 @@ while (*cc != XCL_END)
|
||||||
|
|
||||||
case PT_SC:
|
case PT_SC:
|
||||||
case PT_SCX:
|
case PT_SCX:
|
||||||
case PT_BIDICO:
|
case PT_BOOL:
|
||||||
case PT_BIDICL:
|
case PT_BIDICL:
|
||||||
compares++;
|
compares++;
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
Loading…
Reference in New Issue