@@ -1108,22 +1108,39 @@ function loadDatabase(hooks) {
11081108 const id2 = id1 + ( ( nodeid [ 4 ] << 8 ) | nodeid [ 5 ] ) ;
11091109 leaves = RoaringBitmap . makeSingleton ( id1 )
11101110 . union ( RoaringBitmap . makeSingleton ( id2 ) ) ;
1111+ } else if ( ! isWhole && ( nodeid [ 0 ] & 0xf0 ) === 0x80 ) {
1112+ const id1 = ( ( nodeid [ 0 ] & 0x0f ) << 16 ) | ( nodeid [ 1 ] << 8 ) | nodeid [ 2 ] ;
1113+ const id2 = id1 + ( ( nodeid [ 3 ] << 4 ) | ( ( nodeid [ 4 ] >> 4 ) & 0x0f ) ) ;
1114+ const id3 = id2 + ( ( ( nodeid [ 4 ] & 0x0f ) << 8 ) | nodeid [ 5 ] ) ;
1115+ leaves = RoaringBitmap . makeSingleton ( id1 )
1116+ . union ( RoaringBitmap . makeSingleton ( id2 ) )
1117+ . union ( RoaringBitmap . makeSingleton ( id3 ) ) ;
11111118 } else {
11121119 leaves = RoaringBitmap . makeSingleton (
11131120 ( nodeid [ 2 ] << 24 ) | ( nodeid [ 3 ] << 16 ) |
11141121 ( nodeid [ 4 ] << 8 ) | nodeid [ 5 ] ,
11151122 ) ;
11161123 }
1117- const data = ( nodeid [ 0 ] & 0x20 ) !== 0 ?
1118- Uint8Array . of ( ( ( nodeid [ 0 ] & 0x0f ) << 4 ) | ( nodeid [ 1 ] >> 4 ) ) :
1119- EMPTY_UINT8 ;
1120- newPromise = Promise . resolve ( new PrefixSearchTree (
1121- EMPTY_SEARCH_TREE_BRANCHES ,
1122- EMPTY_SEARCH_TREE_BRANCHES ,
1123- data ,
1124- isWhole ? leaves : EMPTY_BITMAP ,
1125- isWhole ? EMPTY_BITMAP : leaves ,
1126- ) ) ;
1124+ if ( isWhole ) {
1125+ const data = ( nodeid [ 0 ] & 0x20 ) !== 0 ?
1126+ Uint8Array . of ( ( ( nodeid [ 0 ] & 0x0f ) << 4 ) | ( nodeid [ 1 ] >> 4 ) ) :
1127+ EMPTY_UINT8 ;
1128+ newPromise = Promise . resolve ( new PrefixSearchTree (
1129+ EMPTY_SEARCH_TREE_BRANCHES ,
1130+ EMPTY_SEARCH_TREE_BRANCHES ,
1131+ data ,
1132+ leaves ,
1133+ EMPTY_BITMAP ,
1134+ ) ) ;
1135+ } else {
1136+ const data = ( nodeid [ 0 ] & 0xf0 ) === 0x80 ? 0 : (
1137+ ( ( nodeid [ 0 ] & 0x0f ) << 4 ) | ( nodeid [ 1 ] >> 4 ) ) ;
1138+ newPromise = Promise . resolve ( new SuffixSearchTree (
1139+ EMPTY_SEARCH_TREE_BRANCHES ,
1140+ data ,
1141+ leaves ,
1142+ ) ) ;
1143+ }
11271144 } else {
11281145 const hashHex = makeHexFromUint8Array ( nodeid ) ;
11291146 newPromise = new Promise ( ( resolve , reject ) => {
@@ -2748,6 +2765,7 @@ function loadDatabase(hooks) {
27482765 // because that's the canonical, hashed version of the data
27492766 let compression_tag = input [ i ] ;
27502767 const is_pure_suffixes_only_node = ( compression_tag & 0x01 ) !== 0 ;
2768+ let no_leaves_flag ;
27512769 if ( compression_tag > 1 ) {
27522770 // compressed node
27532771 const is_long_compressed = ( compression_tag & 0x04 ) !== 0 ;
@@ -2759,7 +2777,8 @@ function loadDatabase(hooks) {
27592777 compression_tag |= input [ i ] << 16 ;
27602778 i += 1 ;
27612779 }
2762- let dlen = input [ i ] ;
2780+ let dlen = input [ i ] & 0x7F ;
2781+ no_leaves_flag = input [ i ] & 0x80 ;
27632782 i += 1 ;
27642783 if ( is_data_compressed ) {
27652784 data = data_history [ data_history . length - dlen - 1 ] ;
@@ -2786,10 +2805,15 @@ function loadDatabase(hooks) {
27862805 let whole ;
27872806 let suffix ;
27882807 if ( is_pure_suffixes_only_node ) {
2789- suffix = input [ i ] === 0 ?
2790- EMPTY_BITMAP1 :
2791- new RoaringBitmap ( input , i ) ;
2792- i += suffix . consumed_len_bytes ;
2808+ if ( no_leaves_flag ) {
2809+ whole = EMPTY_BITMAP ;
2810+ suffix = EMPTY_BITMAP ;
2811+ } else {
2812+ suffix = input [ i ] === 0 ?
2813+ EMPTY_BITMAP1 :
2814+ new RoaringBitmap ( input , i ) ;
2815+ i += suffix . consumed_len_bytes ;
2816+ }
27932817 tree = new SuffixSearchTree (
27942818 branches ,
27952819 dlen ,
@@ -2807,7 +2831,7 @@ function loadDatabase(hooks) {
28072831 let ci = 0 ;
28082832 canonical [ ci ] = 1 ;
28092833 ci += 1 ;
2810- canonical [ ci ] = dlen ;
2834+ canonical [ ci ] = dlen | no_leaves_flag ;
28112835 ci += 1 ;
28122836 canonical [ ci ] = input [ coffset ] ; // suffix child count
28132837 ci += 1 ;
@@ -2821,10 +2845,9 @@ function loadDatabase(hooks) {
28212845 }
28222846 siphashOfBytes ( canonical . subarray ( 0 , clen ) , 0 , 0 , 0 , 0 , hash ) ;
28232847 } else {
2824- if ( input [ i ] === 0xff ) {
2848+ if ( no_leaves_flag ) {
28252849 whole = EMPTY_BITMAP ;
2826- suffix = EMPTY_BITMAP1 ;
2827- i += 1 ;
2850+ suffix = EMPTY_BITMAP ;
28282851 } else {
28292852 whole = input [ i ] === 0 ?
28302853 EMPTY_BITMAP1 :
@@ -2856,7 +2879,7 @@ function loadDatabase(hooks) {
28562879 let ci = 0 ;
28572880 canonical [ ci ] = 0 ;
28582881 ci += 1 ;
2859- canonical [ ci ] = dlen ;
2882+ canonical [ ci ] = dlen | no_leaves_flag ;
28602883 ci += 1 ;
28612884 canonical . set ( data , ci ) ;
28622885 ci += data . length ;
@@ -2880,9 +2903,11 @@ function loadDatabase(hooks) {
28802903 }
28812904 hash [ 2 ] &= 0x7f ;
28822905 } else {
2906+ i += 1 ;
28832907 // uncompressed node
2884- const dlen = input [ i + 1 ] ;
2885- i += 2 ;
2908+ const dlen = input [ i ] & 0x7F ;
2909+ no_leaves_flag = input [ i ] & 0x80 ;
2910+ i += 1 ;
28862911 if ( dlen === 0 || is_pure_suffixes_only_node ) {
28872912 data = EMPTY_UINT8 ;
28882913 } else {
@@ -2897,16 +2922,15 @@ function loadDatabase(hooks) {
28972922 i += branches_consumed_len_bytes ;
28982923 let whole ;
28992924 let suffix ;
2900- if ( is_pure_suffixes_only_node ) {
2925+ if ( no_leaves_flag ) {
2926+ whole = EMPTY_BITMAP ;
2927+ suffix = EMPTY_BITMAP ;
2928+ } else if ( is_pure_suffixes_only_node ) {
29012929 whole = EMPTY_BITMAP ;
29022930 suffix = input [ i ] === 0 ?
29032931 EMPTY_BITMAP1 :
29042932 new RoaringBitmap ( input , i ) ;
29052933 i += suffix . consumed_len_bytes ;
2906- } else if ( input [ i ] === 0xff ) {
2907- whole = EMPTY_BITMAP ;
2908- suffix = EMPTY_BITMAP ;
2909- i += 1 ;
29102934 } else {
29112935 whole = input [ i ] === 0 ?
29122936 EMPTY_BITMAP1 :
0 commit comments