@@ -18,7 +18,6 @@ use perror::*;
1818use scopetable:: ScopeTable ;
1919use symtable:: SymTable ;
2020use types:: * ;
21- use typetable:: TypeTable ;
2221
2322// Function Intermediate Representation
2423pub struct Fir {
@@ -42,7 +41,7 @@ impl Fir {
4241 index : u32 ,
4342 dtbl : & DataTable ,
4443 scopes : & Vec < ScopeTable > ,
45- type_tables : & Vec < TypeTable > ,
44+ types : & Vec < TypeTree > ,
4645 oir : & mut Oir ,
4746 ) -> Function {
4847 let sig = Signature :: new ( CallConv :: Cold ) ;
@@ -51,31 +50,18 @@ impl Fir {
5150 let mut func = Function :: with_name_signature ( name, sig) ;
5251 let mut builder = FunctionBuilder :: new ( & mut func, ctx) ;
5352 let root_block = builder. create_block ( ) ;
53+ // todo:: this is the issue with function arguments not working simple repr add case
5454 func_def. args . iter ( ) . for_each ( |x| {
5555 let z = self
56- . recurse (
57- x. as_ref ( ) . as_ref ( ) ,
58- & mut builder,
59- dtbl,
60- scopes,
61- type_tables,
62- oir,
63- )
56+ . recurse ( * x, & mut builder, dtbl, scopes, types, oir)
6457 . unwrap ( ) ;
6558 builder. func . signature . params . push ( AbiParam :: new ( I64 ) ) ;
6659 //let res = builder.block_params(root_block)[z.as_u32() as usize];
6760 } ) ;
6861 builder. func . signature . returns . push ( AbiParam :: new ( I64 ) ) ;
6962 builder. append_block_params_for_function_params ( root_block) ;
7063 builder. switch_to_block ( root_block) ;
71- let _result = self . recurse (
72- & func_def. block ,
73- & mut builder,
74- dtbl,
75- scopes,
76- type_tables,
77- oir,
78- ) ;
64+ let _result = self . recurse ( func_def. block , & mut builder, dtbl, scopes, types, oir) ;
7965 builder. seal_block ( root_block) ;
8066 builder. finalize ( ) ;
8167 func
@@ -86,7 +72,7 @@ impl Fir {
8672 builder : & mut FunctionBuilder ,
8773 dtbl : & DataTable ,
8874 scopes : & Vec < ScopeTable > ,
89- type_tables : & Vec < TypeTable > ,
75+ types : & Vec < TypeTree > ,
9076 oir : & mut Oir ,
9177 ) -> ResultFir < Variable > {
9278 let result = self . add_var ( ) ;
@@ -99,20 +85,21 @@ impl Fir {
9985 builder : & mut FunctionBuilder ,
10086 dtbl : & DataTable ,
10187 scopes : & Vec < ScopeTable > ,
102- type_tables : & Vec < TypeTable > ,
88+ types : & Vec < TypeTree > ,
10389 oir : & mut Oir ,
10490 ) -> ResultFir < Variable > {
10591 let result = self . add_var ( ) ;
10692 builder. declare_var ( result, I64 ) ;
10793 let temp = self
108- . recurse ( & op. right , builder, dtbl, scopes, type_tables , oir)
94+ . recurse ( op. right , builder, dtbl, scopes, types , oir)
10995 . unwrap ( ) ;
11096 // todo:: optimization: not all paths need declare var if value is only ever read. or something similar, this statement is in the same ballpark, but might not be totally correct
11197 let x = builder. use_var ( temp) ;
98+ let tt = types. get ( op. left as usize ) . unwrap ( ) ;
11299
113100 self . sym
114101 . table
115- . insert ( op . left . into_symbol_init ( ) . ident . clone ( ) , temp. as_u32 ( ) ) ;
102+ . insert ( tt . into_symbol_init ( ) . ident . clone ( ) , temp. as_u32 ( ) ) ;
116103 builder. def_var ( temp, x) ;
117104 Ok ( temp)
118105 }
@@ -122,16 +109,14 @@ impl Fir {
122109 builder : & mut FunctionBuilder ,
123110 dtbl : & DataTable ,
124111 scopes : & Vec < ScopeTable > ,
125- type_tables : & Vec < TypeTable > ,
112+ types : & Vec < TypeTree > ,
126113 oir : & mut Oir ,
127114 ) -> ResultFir < Variable > {
128115 let args: Vec < Value > = op
129116 . args
130117 . iter ( )
131118 . map ( |x| {
132- let result = self
133- . recurse ( & x, builder, dtbl, scopes, type_tables, oir)
134- . unwrap ( ) ;
119+ let result = self . recurse ( * x, builder, dtbl, scopes, types, oir) . unwrap ( ) ;
135120 return builder. use_var ( result) . clone ( ) ;
136121 } )
137122 . collect :: < Vec < Value > > ( ) ;
@@ -148,16 +133,14 @@ impl Fir {
148133 builder : & mut FunctionBuilder ,
149134 dtbl : & DataTable ,
150135 scopes : & Vec < ScopeTable > ,
151- type_tables : & Vec < TypeTable > ,
136+ types : & Vec < TypeTree > ,
152137 oir : & mut Oir ,
153138 ) -> ResultFir < Variable > {
154139 let temp: Vec < Variable > = op
155140 . exprs
156141 . iter ( )
157142 . map ( |x| {
158- return self
159- . recurse ( & x, builder, dtbl, scopes, type_tables, oir)
160- . unwrap ( ) ;
143+ return self . recurse ( * x, builder, dtbl, scopes, types, oir) . unwrap ( ) ;
161144 } )
162145 . collect ( ) ;
163146 Ok ( * temp. last ( ) . unwrap ( ) )
@@ -172,11 +155,11 @@ impl Fir {
172155 builder : & mut FunctionBuilder ,
173156 dtbl : & DataTable ,
174157 scopes : & Vec < ScopeTable > ,
175- type_tables : & Vec < TypeTable > ,
158+ types : & Vec < TypeTree > ,
176159 oir : & mut Oir ,
177160 ) -> ResultFir < Variable > {
178161 let temp = self
179- . recurse ( & op. val , builder, dtbl, scopes, type_tables , oir)
162+ . recurse ( op. val , builder, dtbl, scopes, types , oir)
180163 . unwrap ( ) ;
181164 let arg = builder. use_var ( temp) ;
182165 builder. ins ( ) . return_ ( & [ arg] ) ;
@@ -187,7 +170,7 @@ impl Fir {
187170 op : & SymbolAccess ,
188171 dtbl : & DataTable ,
189172 scopes : & Vec < ScopeTable > ,
190- type_tables : & Vec < TypeTable > ,
173+ types : & Vec < TypeTree > ,
191174 oir : & mut Oir ,
192175 builder : & mut FunctionBuilder ,
193176 ) -> ResultFir < Variable > {
@@ -227,16 +210,16 @@ impl Fir {
227210 builder : & mut FunctionBuilder ,
228211 dtbl : & DataTable ,
229212 scopes : & Vec < ScopeTable > ,
230- type_tables : & Vec < TypeTable > ,
213+ types : & Vec < TypeTree > ,
231214 oir : & mut Oir ,
232215 ) -> ResultFir < Variable > {
233216 let result = self . add_var ( ) ;
234217 builder. declare_var ( result, I64 ) ;
235218 let left = self
236- . recurse ( & num. left , builder, dtbl, scopes, type_tables , oir)
219+ . recurse ( num. left , builder, dtbl, scopes, types , oir)
237220 . unwrap ( ) ;
238221 let right = self
239- . recurse ( & num. right , builder, dtbl, scopes, type_tables , oir)
222+ . recurse ( num. right , builder, dtbl, scopes, types , oir)
240223 . unwrap ( ) ;
241224 let arg1 = builder. use_var ( left) ;
242225 let arg2 = builder. use_var ( right) ;
@@ -250,16 +233,16 @@ impl Fir {
250233 builder : & mut FunctionBuilder ,
251234 dtbl : & DataTable ,
252235 scopes : & Vec < ScopeTable > ,
253- type_tables : & Vec < TypeTable > ,
236+ types : & Vec < TypeTree > ,
254237 oir : & mut Oir ,
255238 ) -> ResultFir < Variable > {
256239 let result = self . add_var ( ) ;
257240 builder. declare_var ( result, I64 ) ;
258241 let left = self
259- . recurse ( & num. left , builder, dtbl, scopes, type_tables , oir)
242+ . recurse ( num. left , builder, dtbl, scopes, types , oir)
260243 . unwrap ( ) ;
261244 let right = self
262- . recurse ( & num. right , builder, dtbl, scopes, type_tables , oir)
245+ . recurse ( num. right , builder, dtbl, scopes, types , oir)
263246 . unwrap ( ) ;
264247 let arg1 = builder. use_var ( left) ;
265248 let arg2 = builder. use_var ( right) ;
@@ -269,30 +252,27 @@ impl Fir {
269252 }
270253 pub fn recurse (
271254 & mut self ,
272- expr : & TypeTree ,
255+ idx : TypeTreeIndex ,
273256 builder : & mut FunctionBuilder ,
274257 dtbl : & DataTable ,
275258 scopes : & Vec < ScopeTable > ,
276- type_tables : & Vec < TypeTable > ,
259+ types : & Vec < TypeTree > ,
277260 oir : & mut Oir ,
278261 ) -> ResultFir < Variable > {
262+ let expr = types. get ( idx as usize ) . unwrap ( ) ;
279263 match expr {
280- TypeTree :: Block ( op) => self . handle_block ( & op, builder, dtbl, scopes, type_tables, oir) ,
281- TypeTree :: Invoke ( op) => {
282- self . handle_invoke ( & op, builder, dtbl, scopes, type_tables, oir)
283- }
284- TypeTree :: Plus ( op) => self . handle_plus ( & op, builder, dtbl, scopes, type_tables, oir) ,
285- TypeTree :: Minus ( op) => self . handle_minus ( & op, builder, dtbl, scopes, type_tables, oir) ,
286- TypeTree :: Return ( op) => self . handle_ret ( & op, builder, dtbl, scopes, type_tables, oir) ,
264+ TypeTree :: Block ( op) => self . handle_block ( & op, builder, dtbl, scopes, types, oir) ,
265+ TypeTree :: Invoke ( op) => self . handle_invoke ( & op, builder, dtbl, scopes, types, oir) ,
266+ TypeTree :: Plus ( op) => self . handle_plus ( & op, builder, dtbl, scopes, types, oir) ,
267+ TypeTree :: Minus ( op) => self . handle_minus ( & op, builder, dtbl, scopes, types, oir) ,
268+ TypeTree :: Return ( op) => self . handle_ret ( & op, builder, dtbl, scopes, types, oir) ,
287269 TypeTree :: ReturnVoid ( _) => self . handle_ret_void ( builder) ,
288270 TypeTree :: ConstInit ( op) => {
289- self . handle_const_init ( & op, builder, dtbl, scopes, type_tables, oir)
290- }
291- TypeTree :: ArgInit ( op) => {
292- self . handle_arg_init ( & op, builder, dtbl, scopes, type_tables, oir)
271+ self . handle_const_init ( & op, builder, dtbl, scopes, types, oir)
293272 }
273+ TypeTree :: ArgInit ( op) => self . handle_arg_init ( & op, builder, dtbl, scopes, types, oir) ,
294274 TypeTree :: SymbolAccess ( op) => {
295- self . handle_sym_access ( & op, dtbl, scopes, type_tables , oir, builder)
275+ self . handle_sym_access ( & op, dtbl, scopes, types , oir, builder)
296276 }
297277 TypeTree :: U64 ( op) => self . handle_u64 ( * op, builder) ,
298278 TypeTree :: I64 ( op) => self . handle_i64 ( * op, builder) ,
0 commit comments