11use std:: fs;
22use std:: io:: Write ;
33use std:: path:: Path ;
4+ use std:: collections:: HashMap ;
45use clap:: Args ;
56use anyhow:: Context ;
67
@@ -12,29 +13,34 @@ impl CodegenCmd {
1213 let dir = Path :: new ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
1314 let dir = dir. parent ( ) . unwrap ( ) ;
1415
15- es_minifier_js_environment_props ( dir)
16+ es_preset_env_corejs3_entry ( dir)
1617 }
1718}
1819
19- fn es_minifier_js_environment_props ( dir : & Path ) -> anyhow:: Result < ( ) > {
20- let crate_dir = dir . join ( "crates/swc_ecma_minifier/" ) ;
20+ fn es_preset_env_corejs3_entry ( dir : & Path ) -> anyhow:: Result < ( ) > {
21+ use std :: collections :: BTreeMap ;
2122
22- let domprops = fs:: read_to_string ( crate_dir. join ( "src/lists/domprops.json" ) ) ?;
23- let jsprops = fs:: read_to_string ( crate_dir. join ( "src/lists/jsprops.json" ) ) ?;
23+ let crate_dir = dir. join ( "crates/swc_ecma_preset_env/" ) ;
24+
25+ let entry_data = fs:: read_to_string ( crate_dir. join ( "data/core-js-compat/entries.json" ) ) ?;
26+ let entry_data: BTreeMap < & str , Vec < & str > > = serde_json:: from_str ( & entry_data)
27+ . context ( "failed to parse entries.json from core js 3" ) ?;
28+ let ( keys, values) : ( Vec < _ > , Vec < _ > ) = entry_data. into_iter ( ) . unzip ( ) ;
2429
25- let props = {
26- let mut domprops: Vec < & str > = serde_json:: from_str ( & domprops)
27- . context ( "failed to parse domprops.json for property mangler" ) ?;
28- let mut jsprops: Vec < & str > = serde_json:: from_str ( & jsprops)
29- . context ( "Failed to parse jsprops.json for property mangler" ) ?;
30- domprops. append ( & mut jsprops) ;
31- domprops. sort_unstable ( ) ;
32- domprops. dedup ( ) ;
33- domprops
34- } ;
30+ let mut strpool = StrPool :: default ( ) ;
31+ let mut values_strid = Vec :: new ( ) ;
32+ let mut values_index = Vec :: new ( ) ;
33+ for list in values {
34+ let start: u32 = values_strid. len ( ) . try_into ( ) . unwrap ( ) ;
35+ for s in list {
36+ values_strid. push ( strpool. insert ( s) ) ;
37+ }
38+ let end: u32 = values_strid. len ( ) . try_into ( ) . unwrap ( ) ;
39+ values_index. push ( start..end) ;
40+ }
3541
36- let mapout = precomputed_map:: builder:: MapBuilder :: new ( & props )
37- . set_ord ( & | & x , & y| x . cmp ( & y ) )
42+ let mapout = precomputed_map:: builder:: MapBuilder :: new ( & keys )
43+ . set_seed ( 16416001479773392852 )
3844 . set_hash ( & |seed, & v| {
3945 use std:: hash:: { Hash , Hasher } ;
4046
@@ -43,33 +49,59 @@ fn es_minifier_js_environment_props(dir: &Path) -> anyhow::Result<()> {
4349 hasher. finish ( )
4450 } )
4551 . set_next_seed ( |seed, c| {
46- dbg ! ( c) ;
4752 xxhash_rust:: xxh3:: xxh3_64_with_seed ( & c. to_le_bytes ( ) , seed)
4853 } )
4954 . build ( ) ?;
55+ println ! ( "seed: {:?}" , mapout. seed( ) ) ;
56+
5057 let mut builder = precomputed_map:: builder:: CodeBuilder :: new (
51- "props " . into ( ) ,
58+ "corejs3_entries " . into ( ) ,
5259 "SwcXxh3" . into ( ) ,
5360 crate_dir. join ( "src/generated" )
5461 ) ;
5562
5663 let _ = fs:: create_dir ( crate_dir. join ( "src/generated" ) ) ;
5764
58- let k = builder. create_str_seq ( "PROPS_KEYS" . into ( ) , mapout. reorder ( & props) ) ?;
59- mapout. create_map ( "PROPS" . into ( ) , k, & mut builder) ?;
65+ let k = builder. create_str_seq ( "ENTRY_KEYS" . into ( ) , mapout. reorder ( & keys) ) ?;
66+ builder. create_u32_seq ( "ENTRY_VALUES_STRING_ID" . into ( ) , values_strid. iter ( ) . copied ( ) ) ?;
67+ mapout. create_map ( "ENTRY_INDEX" . into ( ) , k, & mut builder) ?;
6068
61- let mut codeout = fs:: File :: create ( crate_dir. join ( "src/generated/props .rs" ) ) ?;
69+ let mut codeout = fs:: File :: create ( crate_dir. join ( "src/generated/corejs3_entries .rs" ) ) ?;
6270 builder. write_to ( & mut codeout) ?;
6371
72+ fs:: write ( crate_dir. join ( "src/generated/corejs3_entries.strpool" ) , strpool. pool . as_bytes ( ) ) ?;
73+
6474 writeln ! ( codeout,
65- r#"
66- use crate::util::SwcXxh3;
67-
68- pub fn is_exist(name: &str) -> bool {{
69- PROPS.get(name).is_some()
70- }}
71- "#
75+ "static ENTRY_VALUES_STRING_STORE: &str = include_str!(\" corejs3_entries.strpool\" );
76+ static ENTRY_VALUES_LIST: &[Range<u32>] = &["
7277 ) ?;
78+ for range in mapout. reorder ( & values_index) {
79+ writeln ! ( codeout, "{}..{}," , range. start, range. end) ?;
80+ }
81+ writeln ! ( codeout, "];" ) ?;
7382
7483 Ok ( ( ) )
7584}
85+
86+ #[ derive( Default ) ]
87+ struct StrPool < ' s > {
88+ pool : String ,
89+ map : HashMap < & ' s str , u32 > ,
90+ }
91+
92+ impl < ' s > StrPool < ' s > {
93+ pub fn insert ( & mut self , s : & ' s str ) -> u32 {
94+ * self . map . entry ( s) . or_insert_with ( || {
95+ let offset = self . pool . len ( ) ;
96+ self . pool . push_str ( & s) ;
97+ let len: u8 = ( self . pool . len ( ) - offset) . try_into ( ) . unwrap ( ) ;
98+ let offset: u32 = offset. try_into ( ) . unwrap ( ) ;
99+
100+ if offset > ( 1 << 24 ) {
101+ panic ! ( "string too large" ) ;
102+ }
103+
104+ offset | ( u32:: from ( len) << 24 )
105+ } )
106+ }
107+ }
0 commit comments