@@ -507,6 +507,7 @@ jump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks;
507507sljit_uw c , charoffset ;
508508sljit_u32 max = READ_CHAR_MAX , min = 0 ;
509509struct sljit_jump * jump = NULL ;
510+ PCRE2_UCHAR flags ;
510511PCRE2_SPTR ccbegin ;
511512sljit_u32 compares , invertcmp , depth ;
512513sljit_u32 first_item , last_item , mid_item ;
@@ -522,11 +523,11 @@ int typereg = TMP1;
522523
523524SLJIT_ASSERT (common -> locals_size >= SSIZE_OF (sw ));
524525/* Scanning the necessary info. */
525- cc ++ ;
526+ flags = * cc ++ ;
526527ccbegin = cc ;
527528compares = 0 ;
528529
529- if (cc [ -1 ] & XCL_MAP )
530+ if (flags & XCL_MAP )
530531 cc += 32 / sizeof (PCRE2_UCHAR );
531532
532533#ifdef SUPPORT_UNICODE
@@ -638,7 +639,7 @@ if (*cc != XCL_END)
638639 {
639640 SLJIT_ASSERT (category_list == 0 );
640641 max = 0 ;
641- min = (ccbegin [ -1 ] & XCL_MAP ) != 0 ? 0 : READ_CHAR_MAX ;
642+ min = (flags & XCL_MAP ) != 0 ? 0 : READ_CHAR_MAX ;
642643 xclass_update_min_max (common , cc , & min , & max );
643644 }
644645#endif
@@ -658,7 +659,7 @@ SLJIT_ASSERT(compares > 0);
658659cc = ccbegin ;
659660if (!(status & XCLASS_IS_ECLASS ))
660661 {
661- if ((cc [ -1 ] & XCL_NOT ) != 0 )
662+ if ((flags & XCL_NOT ) != 0 )
662663 read_char (common , min , max , backtracks , READ_CHAR_UPDATE_STR_PTR );
663664 else
664665 {
@@ -670,7 +671,7 @@ if (!(status & XCLASS_IS_ECLASS))
670671 }
671672 }
672673
673- if ((cc [ -1 ] & XCL_MAP ) != 0 )
674+ if ((flags & XCL_MAP ) != 0 )
674675 {
675676 SLJIT_ASSERT (!(status & XCLASS_IS_ECLASS ));
676677 xclass_check_bitset (common , (const sljit_u8 * )cc , & found , backtracks );
@@ -1092,10 +1093,14 @@ if (ranges.range_count == 2)
10921093 }
10931094
10941095range_start = ranges .ranges [0 ];
1095- range_end = ranges .ranges [ranges .range_count - 1 ];
10961096SET_CHAR_OFFSET (range_start );
1097- add_jump (compiler , (ccbegin [-1 ] & XCL_NOT ) == 0 ? backtracks : & found ,
1098- CMP (SLJIT_GREATER , TMP1 , 0 , SLJIT_IMM , (sljit_sw )(range_end - range_start )));
1097+ if (ranges .range_count >= 6 )
1098+ {
1099+ /* Early fail. */
1100+ range_end = ranges .ranges [ranges .range_count - 1 ];
1101+ add_jump (compiler , (flags & XCL_NOT ) == 0 ? backtracks : & found ,
1102+ CMP (SLJIT_GREATER , TMP1 , 0 , SLJIT_IMM , (sljit_sw )(range_end - range_start )));
1103+ }
10991104
11001105depth = 0 ;
11011106first_item = 0 ;
0 commit comments