@@ -18,7 +18,6 @@ use perror::*;
18
18
use scopetable:: ScopeTable ;
19
19
use symtable:: SymTable ;
20
20
use types:: * ;
21
- use typetable:: TypeTable ;
22
21
23
22
// Function Intermediate Representation
24
23
pub struct Fir {
@@ -42,7 +41,7 @@ impl Fir {
42
41
index : u32 ,
43
42
dtbl : & DataTable ,
44
43
scopes : & Vec < ScopeTable > ,
45
- type_tables : & Vec < TypeTable > ,
44
+ types : & Vec < TypeTree > ,
46
45
oir : & mut Oir ,
47
46
) -> Function {
48
47
let sig = Signature :: new ( CallConv :: Cold ) ;
@@ -51,31 +50,18 @@ impl Fir {
51
50
let mut func = Function :: with_name_signature ( name, sig) ;
52
51
let mut builder = FunctionBuilder :: new ( & mut func, ctx) ;
53
52
let root_block = builder. create_block ( ) ;
53
+ // todo:: this is the issue with function arguments not working simple repr add case
54
54
func_def. args . iter ( ) . for_each ( |x| {
55
55
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)
64
57
. unwrap ( ) ;
65
58
builder. func . signature . params . push ( AbiParam :: new ( I64 ) ) ;
66
59
//let res = builder.block_params(root_block)[z.as_u32() as usize];
67
60
} ) ;
68
61
builder. func . signature . returns . push ( AbiParam :: new ( I64 ) ) ;
69
62
builder. append_block_params_for_function_params ( root_block) ;
70
63
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) ;
79
65
builder. seal_block ( root_block) ;
80
66
builder. finalize ( ) ;
81
67
func
@@ -86,7 +72,7 @@ impl Fir {
86
72
builder : & mut FunctionBuilder ,
87
73
dtbl : & DataTable ,
88
74
scopes : & Vec < ScopeTable > ,
89
- type_tables : & Vec < TypeTable > ,
75
+ types : & Vec < TypeTree > ,
90
76
oir : & mut Oir ,
91
77
) -> ResultFir < Variable > {
92
78
let result = self . add_var ( ) ;
@@ -99,20 +85,21 @@ impl Fir {
99
85
builder : & mut FunctionBuilder ,
100
86
dtbl : & DataTable ,
101
87
scopes : & Vec < ScopeTable > ,
102
- type_tables : & Vec < TypeTable > ,
88
+ types : & Vec < TypeTree > ,
103
89
oir : & mut Oir ,
104
90
) -> ResultFir < Variable > {
105
91
let result = self . add_var ( ) ;
106
92
builder. declare_var ( result, I64 ) ;
107
93
let temp = self
108
- . recurse ( & op. right , builder, dtbl, scopes, type_tables , oir)
94
+ . recurse ( op. right , builder, dtbl, scopes, types , oir)
109
95
. unwrap ( ) ;
110
96
// 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
111
97
let x = builder. use_var ( temp) ;
98
+ let tt = types. get ( op. left as usize ) . unwrap ( ) ;
112
99
113
100
self . sym
114
101
. table
115
- . insert ( op . left . into_symbol_init ( ) . ident . clone ( ) , temp. as_u32 ( ) ) ;
102
+ . insert ( tt . into_symbol_init ( ) . ident . clone ( ) , temp. as_u32 ( ) ) ;
116
103
builder. def_var ( temp, x) ;
117
104
Ok ( temp)
118
105
}
@@ -122,16 +109,14 @@ impl Fir {
122
109
builder : & mut FunctionBuilder ,
123
110
dtbl : & DataTable ,
124
111
scopes : & Vec < ScopeTable > ,
125
- type_tables : & Vec < TypeTable > ,
112
+ types : & Vec < TypeTree > ,
126
113
oir : & mut Oir ,
127
114
) -> ResultFir < Variable > {
128
115
let args: Vec < Value > = op
129
116
. args
130
117
. iter ( )
131
118
. 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 ( ) ;
135
120
return builder. use_var ( result) . clone ( ) ;
136
121
} )
137
122
. collect :: < Vec < Value > > ( ) ;
@@ -148,16 +133,14 @@ impl Fir {
148
133
builder : & mut FunctionBuilder ,
149
134
dtbl : & DataTable ,
150
135
scopes : & Vec < ScopeTable > ,
151
- type_tables : & Vec < TypeTable > ,
136
+ types : & Vec < TypeTree > ,
152
137
oir : & mut Oir ,
153
138
) -> ResultFir < Variable > {
154
139
let temp: Vec < Variable > = op
155
140
. exprs
156
141
. iter ( )
157
142
. 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 ( ) ;
161
144
} )
162
145
. collect ( ) ;
163
146
Ok ( * temp. last ( ) . unwrap ( ) )
@@ -172,11 +155,11 @@ impl Fir {
172
155
builder : & mut FunctionBuilder ,
173
156
dtbl : & DataTable ,
174
157
scopes : & Vec < ScopeTable > ,
175
- type_tables : & Vec < TypeTable > ,
158
+ types : & Vec < TypeTree > ,
176
159
oir : & mut Oir ,
177
160
) -> ResultFir < Variable > {
178
161
let temp = self
179
- . recurse ( & op. val , builder, dtbl, scopes, type_tables , oir)
162
+ . recurse ( op. val , builder, dtbl, scopes, types , oir)
180
163
. unwrap ( ) ;
181
164
let arg = builder. use_var ( temp) ;
182
165
builder. ins ( ) . return_ ( & [ arg] ) ;
@@ -187,7 +170,7 @@ impl Fir {
187
170
op : & SymbolAccess ,
188
171
dtbl : & DataTable ,
189
172
scopes : & Vec < ScopeTable > ,
190
- type_tables : & Vec < TypeTable > ,
173
+ types : & Vec < TypeTree > ,
191
174
oir : & mut Oir ,
192
175
builder : & mut FunctionBuilder ,
193
176
) -> ResultFir < Variable > {
@@ -227,16 +210,16 @@ impl Fir {
227
210
builder : & mut FunctionBuilder ,
228
211
dtbl : & DataTable ,
229
212
scopes : & Vec < ScopeTable > ,
230
- type_tables : & Vec < TypeTable > ,
213
+ types : & Vec < TypeTree > ,
231
214
oir : & mut Oir ,
232
215
) -> ResultFir < Variable > {
233
216
let result = self . add_var ( ) ;
234
217
builder. declare_var ( result, I64 ) ;
235
218
let left = self
236
- . recurse ( & num. left , builder, dtbl, scopes, type_tables , oir)
219
+ . recurse ( num. left , builder, dtbl, scopes, types , oir)
237
220
. unwrap ( ) ;
238
221
let right = self
239
- . recurse ( & num. right , builder, dtbl, scopes, type_tables , oir)
222
+ . recurse ( num. right , builder, dtbl, scopes, types , oir)
240
223
. unwrap ( ) ;
241
224
let arg1 = builder. use_var ( left) ;
242
225
let arg2 = builder. use_var ( right) ;
@@ -250,16 +233,16 @@ impl Fir {
250
233
builder : & mut FunctionBuilder ,
251
234
dtbl : & DataTable ,
252
235
scopes : & Vec < ScopeTable > ,
253
- type_tables : & Vec < TypeTable > ,
236
+ types : & Vec < TypeTree > ,
254
237
oir : & mut Oir ,
255
238
) -> ResultFir < Variable > {
256
239
let result = self . add_var ( ) ;
257
240
builder. declare_var ( result, I64 ) ;
258
241
let left = self
259
- . recurse ( & num. left , builder, dtbl, scopes, type_tables , oir)
242
+ . recurse ( num. left , builder, dtbl, scopes, types , oir)
260
243
. unwrap ( ) ;
261
244
let right = self
262
- . recurse ( & num. right , builder, dtbl, scopes, type_tables , oir)
245
+ . recurse ( num. right , builder, dtbl, scopes, types , oir)
263
246
. unwrap ( ) ;
264
247
let arg1 = builder. use_var ( left) ;
265
248
let arg2 = builder. use_var ( right) ;
@@ -269,30 +252,27 @@ impl Fir {
269
252
}
270
253
pub fn recurse (
271
254
& mut self ,
272
- expr : & TypeTree ,
255
+ idx : TypeTreeIndex ,
273
256
builder : & mut FunctionBuilder ,
274
257
dtbl : & DataTable ,
275
258
scopes : & Vec < ScopeTable > ,
276
- type_tables : & Vec < TypeTable > ,
259
+ types : & Vec < TypeTree > ,
277
260
oir : & mut Oir ,
278
261
) -> ResultFir < Variable > {
262
+ let expr = types. get ( idx as usize ) . unwrap ( ) ;
279
263
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) ,
287
269
TypeTree :: ReturnVoid ( _) => self . handle_ret_void ( builder) ,
288
270
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)
293
272
}
273
+ TypeTree :: ArgInit ( op) => self . handle_arg_init ( & op, builder, dtbl, scopes, types, oir) ,
294
274
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)
296
276
}
297
277
TypeTree :: U64 ( op) => self . handle_u64 ( * op, builder) ,
298
278
TypeTree :: I64 ( op) => self . handle_i64 ( * op, builder) ,
0 commit comments