@@ -7418,9 +7418,9 @@ static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHA
7418
7418
#define XCLASS_HAS_TYPE 0x004
7419
7419
#define XCLASS_HAS_SCRIPT 0x008
7420
7420
#define XCLASS_HAS_SCRIPT_EXTENSION 0x010
7421
- #define XCLASS_HAS_BIDICO 0x020
7421
+ #define XCLASS_HAS_BOOL 0x020
7422
7422
#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)
7424
7424
#define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
7425
7425
#define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
7426
7426
#define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
@@ -7551,8 +7551,8 @@ while (*cc != XCL_END)
7551
7551
unicode_status |= XCLASS_SAVE_CHAR ;
7552
7552
break ;
7553
7553
7554
- case PT_BIDICO :
7555
- unicode_status |= XCLASS_HAS_BIDICO ;
7554
+ case PT_BOOL :
7555
+ unicode_status |= XCLASS_HAS_BOOL ;
7556
7556
break ;
7557
7557
7558
7558
case PT_BIDICL :
@@ -7668,6 +7668,82 @@ if (unicode_status & XCLASS_NEEDS_UCD)
7668
7668
7669
7669
ccbegin = cc ;
7670
7670
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
+
7671
7747
if (unicode_status & XCLASS_HAS_SCRIPT )
7672
7748
{
7673
7749
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)
7718
7794
7719
7795
if (unicode_status & XCLASS_SCRIPT_EXTENSION_NOTPROP )
7720
7796
{
7721
- if (unicode_status & ( XCLASS_HAS_BIDICO | XCLASS_HAS_BIDICL | XCLASS_HAS_TYPE ) )
7797
+ if (unicode_status & XCLASS_HAS_TYPE )
7722
7798
{
7723
7799
if (unicode_status & XCLASS_SAVE_CHAR )
7724
7800
{
@@ -7785,84 +7861,6 @@ if (unicode_status & XCLASS_NEEDS_UCD)
7785
7861
cc = ccbegin ;
7786
7862
}
7787
7863
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
-
7866
7864
if (unicode_status & XCLASS_SAVE_CHAR )
7867
7865
OP1 (SLJIT_MOV , TMP1 , 0 , RETURN_ADDR , 0 );
7868
7866
@@ -7975,7 +7973,7 @@ while (*cc != XCL_END)
7975
7973
7976
7974
case PT_SC :
7977
7975
case PT_SCX :
7978
- case PT_BIDICO :
7976
+ case PT_BOOL :
7979
7977
case PT_BIDICL :
7980
7978
compares ++ ;
7981
7979
/* Do nothing. */
0 commit comments