Skip to content

Commit a5d9fb6

Browse files
Scopes refactor (#40)
* scope table refactored!
1 parent 5f1e008 commit a5d9fb6

File tree

9 files changed

+433
-442
lines changed

9 files changed

+433
-442
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ members = [
2121
"fir",
2222
"oir",
2323
"scir",
24-
"datatable", "repr",
24+
"datatable",
25+
"repr",
26+
"infotable",
2527
]
2628
resolver = "2"
2729

fir/src/lib.rs

Lines changed: 33 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use perror::*;
1818
use scopetable::ScopeTable;
1919
use symtable::SymTable;
2020
use types::*;
21-
use typetable::TypeTable;
2221

2322
// Function Intermediate Representation
2423
pub 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),

infotable/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "infotable"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

infotable/src/lib.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
pub fn add(left: u64, right: u64) -> u64 {
2+
left + right
3+
}
4+
5+
#[cfg(test)]
6+
mod tests {
7+
use super::*;
8+
9+
#[test]
10+
fn it_works() {
11+
let result = add(2, 2);
12+
assert_eq!(result, 4);
13+
}
14+
}

0 commit comments

Comments
 (0)