Quellcode durchsuchen

Split the uts46 table into one more table to avoid storing slices

`MAPPING_TABLE` were pretty large from the last commit as it contains
two pointers for each element. By converting it into a index to another
table + a single element indicator to recover most of it
(6000 * 8 - 1500 * 4 =) 42kb reduction.
Markus Westerlind vor 8 Jahren
Ursprung
Commit
281958c0de
3 geänderte Dateien mit 15 neuen und 15 gelöschten Zeilen
  1. 11 5
      idna/src/make_uts46_mapping_table.py
  2. 4 4
      idna/src/uts46.rs
  3. 0 6
      idna/src/uts46_mapping_table.rs

+ 11 - 5
idna/src/make_uts46_mapping_table.py

@@ -155,17 +155,23 @@ for ranges in optimized_ranges:
 
 print("];\n")
 
-print("static MAPPING_TABLE: &'static [&[Mapping]] = &[")
+print("static INDEX_TABLE: &'static [(u16, bool)] = &[")
 
+offset = 0
 for ranges in optimized_ranges:
-    print("&[", end='')
+    block_len = len(ranges)
+    print("(%s, %s), " % (offset, "true" if block_len == 1 else "false"))
+    offset += block_len
 
+print("];\n")
+
+print("static MAPPING_TABLE: &'static [Mapping] = &[")
+
+for ranges in optimized_ranges:
     for (first, last, mapping, unicode_str) in ranges:
         if unicode_str is not None:
             mapping += rust_slice(strtab_slice(unicode_str))
-        print("%s, " % mapping, end='')
-
-    print("],")
+        print("%s, " % mapping)
 
 print("];\n")
 

+ 4 - 4
idna/src/uts46.rs

@@ -68,11 +68,11 @@ fn find_char(codepoint: char) -> &'static Mapping {
         }
     });
     r.ok().map(|i| {
-        let xs = &MAPPING_TABLE[i];
-        if xs.len() == 1 {
-            &xs[0]
+        let (offset, single) = INDEX_TABLE[i];
+        if single {
+            &MAPPING_TABLE[offset as usize]
         } else {
-            &xs[codepoint as usize - TABLE[i].from as usize]
+            &MAPPING_TABLE[(offset + codepoint as u16 - TABLE[i].from as u16) as usize]
         }
     }).unwrap()
 }

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 6
idna/src/uts46_mapping_table.rs


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.