add loading tag for non-recursive union

This commit is contained in:
Brendan Hansknecht 2022-02-19 14:09:55 -08:00
parent 05959b0622
commit 2307be8f0a
3 changed files with 74 additions and 15 deletions

View file

@ -14,7 +14,7 @@ use roc_mono::ir::{
BranchInfo, CallType, Expr, JoinPointId, ListLiteralElement, Literal, Param, Proc, ProcLayout,
SelfRecursive, Stmt,
};
use roc_mono::layout::{Builtin, Layout, LayoutId, LayoutIds};
use roc_mono::layout::{Builtin, Layout, LayoutId, LayoutIds, UnionLayout};
mod generic64;
mod object_builder;
@ -315,6 +315,12 @@ trait Backend<'a> {
} => {
self.load_struct_at_index(sym, structure, *index, field_layouts);
}
Expr::GetTagId {
structure,
union_layout,
} => {
self.get_tag_id(sym, structure, union_layout);
}
x => todo!("the expression, {:?}", x),
}
}
@ -680,6 +686,9 @@ trait Backend<'a> {
field_layouts: &'a [Layout<'a>],
);
/// get_tag_id loads the tag id from a the union.
fn get_tag_id(&mut self, sym: &Symbol, structure: &Symbol, union_layout: &UnionLayout<'a>);
/// return_symbol moves a symbol to the correct return location for the backend and adds a jump to the end of the function.
fn return_symbol(&mut self, sym: &Symbol, layout: &Layout<'a>);