@@ -42,6 +42,11 @@ struct IncludedCodeTable<'src, 'ast> {
4242 data : & ' ast [ u8 ] ,
4343}
4444
45+ struct ProgramDataDeps < ' src , ' ast > {
46+ included_macros : Vec < IncludedMacro < ' src > > ,
47+ included_code_tables : Vec < IncludedCodeTable < ' src , ' ast > > ,
48+ }
49+
4550impl < ' src , ' ast > IncludedCodeTable < ' src , ' ast > {
4651 fn size_ref ( & self ) -> MarkRef {
4752 MarkRef {
@@ -75,7 +80,7 @@ pub fn generate_for_entrypoint<'src, 'ast: 'src>(
7580 start_id,
7681 end_id,
7782 } ) ;
78- let mut included_code_tables: Vec < IncludedCodeTable < ' src , ' ast > > = globals
83+ let included_code_tables: Vec < IncludedCodeTable < ' src , ' ast > > = globals
7984 . defs
8085 . iter ( )
8186 . filter_map ( |( _, def) | {
@@ -92,6 +97,11 @@ pub fn generate_for_entrypoint<'src, 'ast: 'src>(
9297 } )
9398 . collect ( ) ;
9499
100+ let mut program_data_deps = ProgramDataDeps {
101+ included_macros,
102+ included_code_tables,
103+ } ;
104+
95105 let mut asm = Vec :: with_capacity ( 10_000 ) ;
96106 asm. push ( Asm :: Mark ( start_id) ) ;
97107 generate_for_macro (
@@ -100,24 +110,28 @@ pub fn generate_for_entrypoint<'src, 'ast: 'src>(
100110 Box :: new ( [ ] ) ,
101111 & mut mark_tracker,
102112 & mut label_stack,
103- & mut included_macros,
104- & mut included_code_tables,
113+ & mut program_data_deps,
105114 & mut asm,
106115 ) ;
107116
108- included_macros. into_iter ( ) . skip ( 1 ) . for_each ( |included| {
109- let section_macro =
110- if let Some ( Definition :: Macro ( section_macro) ) = globals. defs . get ( included. name ) {
111- section_macro
112- } else {
113- panic ! ( "Section macro {} not found" , included. name) ;
114- } ;
115- asm. push ( Asm :: Mark ( included. start_id ) ) ;
116- asm. push ( Asm :: Data ( generate_for_entrypoint ( globals, section_macro) ) ) ;
117- asm. push ( Asm :: Mark ( included. end_id ) ) ;
118- } ) ;
117+ program_data_deps
118+ . included_macros
119+ . into_iter ( )
120+ . skip ( 1 )
121+ . for_each ( |included| {
122+ let section_macro =
123+ if let Some ( Definition :: Macro ( section_macro) ) = globals. defs . get ( included. name ) {
124+ section_macro
125+ } else {
126+ panic ! ( "Section macro {} not found" , included. name) ;
127+ } ;
128+ asm. push ( Asm :: Mark ( included. start_id ) ) ;
129+ asm. push ( Asm :: Data ( generate_for_entrypoint ( globals, section_macro) ) ) ;
130+ asm. push ( Asm :: Mark ( included. end_id ) ) ;
131+ } ) ;
119132
120- included_code_tables
133+ program_data_deps
134+ . included_code_tables
121135 . into_iter ( )
122136 . filter ( |t| t. referenced )
123137 . for_each ( |included| {
@@ -191,8 +205,7 @@ fn generate_for_macro<'src: 'cmp, 'cmp, 'ast>(
191205 arg_values : Box < [ Asm ] > ,
192206 mark_tracker : & mut MarkTracker ,
193207 label_stack : & ' cmp mut LabelStack < ' src , usize > ,
194- included_macros : & ' cmp mut Vec < IncludedMacro < ' src > > ,
195- included_code_tables : & ' cmp mut Vec < IncludedCodeTable < ' src , ' ast > > ,
208+ program_data_deps : & ' cmp mut ProgramDataDeps < ' src , ' ast > ,
196209 asm : & mut Vec < Asm > ,
197210) {
198211 let current_args: BTreeMap < & str , Asm > = BTreeMap :: from_iter (
@@ -236,14 +249,15 @@ fn generate_for_macro<'src: 'cmp, 'cmp, 'ast>(
236249 . collect ( ) ,
237250 mark_tracker,
238251 label_stack,
239- included_macros,
240- included_code_tables,
252+ program_data_deps,
241253 asm,
242254 )
243255 }
244256 Invoke :: BuiltinCodeSize ( code_ref) => {
245- let mref: MarkRef = if let Some ( included) =
246- included_macros. iter ( ) . find ( |m| m. name == code_ref. ident ( ) )
257+ let mref: MarkRef = if let Some ( included) = program_data_deps
258+ . included_macros
259+ . iter ( )
260+ . find ( |m| m. name == code_ref. ident ( ) )
247261 {
248262 included. size_ref ( )
249263 } else {
@@ -255,14 +269,16 @@ fn generate_for_macro<'src: 'cmp, 'cmp, 'ast>(
255269 end_id,
256270 } ;
257271 let mref = included. size_ref ( ) ;
258- included_macros. push ( included) ;
272+ program_data_deps . included_macros . push ( included) ;
259273 mref
260274 } ;
261275 asm. push ( Asm :: Ref ( mref) ) ;
262276 }
263277 Invoke :: BuiltinCodeOffset ( code_ref) => {
264- let mref: MarkRef = if let Some ( included) =
265- included_macros. iter ( ) . find ( |m| m. name == code_ref. ident ( ) )
278+ let mref: MarkRef = if let Some ( included) = program_data_deps
279+ . included_macros
280+ . iter ( )
281+ . find ( |m| m. name == code_ref. ident ( ) )
266282 {
267283 included. start_ref ( )
268284 } else {
@@ -274,21 +290,23 @@ fn generate_for_macro<'src: 'cmp, 'cmp, 'ast>(
274290 end_id,
275291 } ;
276292 let mref = included. start_ref ( ) ;
277- included_macros. push ( included) ;
293+ program_data_deps . included_macros . push ( included) ;
278294 mref
279295 } ;
280296 asm. push ( Asm :: Ref ( mref) ) ;
281297 }
282298 Invoke :: BuiltinTableStart ( table_ref) => {
283- let target_table = included_code_tables
299+ let target_table = program_data_deps
300+ . included_code_tables
284301 . iter_mut ( )
285302 . find ( |t| t. name == table_ref. ident ( ) )
286303 . expect ( "Table not found (might be jumptable)" ) ;
287304 target_table. referenced = true ;
288305 asm. push ( Asm :: Ref ( target_table. start_ref ( ) ) ) ;
289306 }
290307 Invoke :: BuiltinTableSize ( table_ref) => {
291- let target_table = included_code_tables
308+ let target_table = program_data_deps
309+ . included_code_tables
292310 . iter_mut ( )
293311 . find ( |t| t. name == table_ref. ident ( ) )
294312 . expect ( "Table not found (might be jumptable)" ) ;
0 commit comments