mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
bubble up pointer_size
This commit is contained in:
parent
7fea957979
commit
657901d760
5 changed files with 81 additions and 49 deletions
|
@ -24,6 +24,7 @@ struct Env<'a, 'i> {
|
|||
pub subs: &'a Subs,
|
||||
pub home: ModuleId,
|
||||
pub ident_ids: &'i mut IdentIds,
|
||||
pub pointer_size: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
|
@ -119,12 +120,14 @@ impl<'a> Expr<'a> {
|
|||
procs: &mut Procs<'a>,
|
||||
home: ModuleId,
|
||||
ident_ids: &mut IdentIds,
|
||||
pointer_size: u32,
|
||||
) -> Self {
|
||||
let mut env = Env {
|
||||
arena,
|
||||
subs,
|
||||
home,
|
||||
ident_ids,
|
||||
pointer_size,
|
||||
};
|
||||
|
||||
from_can(&mut env, can_expr, procs, None)
|
||||
|
@ -256,8 +259,8 @@ fn from_can<'a>(
|
|||
args.push(from_can(env, loc_arg.value, procs, None));
|
||||
}
|
||||
|
||||
let layout =
|
||||
Layout::from_var(env.arena, fn_var, env.subs).unwrap_or_else(|err| {
|
||||
let layout = Layout::from_var(env.arena, fn_var, env.subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| {
|
||||
panic!("TODO turn fn_var into a RuntimeError {:?}", err)
|
||||
});
|
||||
Expr::CallByPointer(&*env.arena.alloc(ptr), args.into_bump_slice(), layout)
|
||||
|
@ -283,7 +286,7 @@ fn from_can<'a>(
|
|||
field_bodies.push((label, expr));
|
||||
}
|
||||
|
||||
let struct_layout = match Layout::from_var(arena, ext_var, subs) {
|
||||
let struct_layout = match Layout::from_var(arena, ext_var, subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
// Invalid field!
|
||||
|
@ -306,7 +309,7 @@ fn from_can<'a>(
|
|||
let subs = env.subs;
|
||||
let arena = env.arena;
|
||||
|
||||
let struct_layout = match Layout::from_var(arena, ext_var, subs) {
|
||||
let struct_layout = match Layout::from_var(arena, ext_var, subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
// Invalid field!
|
||||
|
@ -314,7 +317,7 @@ fn from_can<'a>(
|
|||
}
|
||||
};
|
||||
|
||||
let field_layout = match Layout::from_var(arena, field_var, subs) {
|
||||
let field_layout = match Layout::from_var(arena, field_var, subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
// Invalid field!
|
||||
|
@ -335,7 +338,7 @@ fn from_can<'a>(
|
|||
} => {
|
||||
let subs = env.subs;
|
||||
let arena = env.arena;
|
||||
let elem_layout = match Layout::from_var(arena, elem_var, subs) {
|
||||
let elem_layout = match Layout::from_var(arena, elem_var, subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
panic!("TODO gracefully handle List with invalid element layout");
|
||||
|
@ -360,7 +363,7 @@ fn from_can<'a>(
|
|||
let subs = &env.subs;
|
||||
let arena = env.arena;
|
||||
|
||||
match Layout::from_var(arena, variant_var, subs) {
|
||||
match Layout::from_var(arena, variant_var, subs, env.pointer_size) {
|
||||
Ok(Layout::Builtin(Builtin::Bool(_smaller, larger))) => Expr::Bool(name == larger),
|
||||
Ok(Layout::Builtin(Builtin::Byte(tags))) => match tags.get(&name) {
|
||||
Some(v) => Expr::Byte(*v),
|
||||
|
@ -386,7 +389,7 @@ fn add_closure<'a>(
|
|||
let mut proc_args = Vec::with_capacity_in(loc_args.len(), arena);
|
||||
|
||||
for (arg_var, loc_arg) in loc_args.iter() {
|
||||
let layout = match Layout::from_var(arena, *arg_var, subs) {
|
||||
let layout = match Layout::from_var(arena, *arg_var, subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
// Invalid closure!
|
||||
|
@ -406,7 +409,7 @@ fn add_closure<'a>(
|
|||
proc_args.push((layout, arg_name));
|
||||
}
|
||||
|
||||
let ret_layout = Layout::from_var(arena, ret_var, subs)
|
||||
let ret_layout = Layout::from_var(arena, ret_var, subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| panic!("TODO handle invalid function {:?}", err));
|
||||
|
||||
let proc = Proc {
|
||||
|
@ -431,7 +434,7 @@ fn store_pattern<'a>(
|
|||
) {
|
||||
use roc_can::pattern::Pattern::*;
|
||||
|
||||
let layout = match Layout::from_var(env.arena, var, env.subs) {
|
||||
let layout = match Layout::from_var(env.arena, var, env.subs, env.pointer_size) {
|
||||
Ok(layout) => layout,
|
||||
Err(()) => {
|
||||
panic!("TODO gen a runtime error here");
|
||||
|
@ -525,8 +528,8 @@ fn from_can_when<'a>(
|
|||
let cond_rhs = arena.alloc(Expr::Int(*int));
|
||||
let pass = arena.alloc(from_can(env, loc_then.value, procs, None));
|
||||
let fail = arena.alloc(from_can(env, loc_else.value, procs, None));
|
||||
let ret_layout =
|
||||
Layout::from_var(arena, expr_var, env.subs).unwrap_or_else(|err| {
|
||||
let ret_layout = Layout::from_var(arena, expr_var, env.subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| {
|
||||
panic!("TODO turn this into a RuntimeError {:?}", err)
|
||||
});
|
||||
|
||||
|
@ -544,8 +547,8 @@ fn from_can_when<'a>(
|
|||
let cond_rhs = arena.alloc(Expr::Float(*float));
|
||||
let pass = arena.alloc(from_can(env, loc_then.value, procs, None));
|
||||
let fail = arena.alloc(from_can(env, loc_else.value, procs, None));
|
||||
let ret_layout =
|
||||
Layout::from_var(arena, expr_var, env.subs).unwrap_or_else(|err| {
|
||||
let ret_layout = Layout::from_var(arena, expr_var, env.subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| {
|
||||
panic!("TODO turn this into a RuntimeError {:?}", err)
|
||||
});
|
||||
|
||||
|
@ -568,7 +571,7 @@ fn from_can_when<'a>(
|
|||
let arena = env.arena;
|
||||
let cond = from_can(env, loc_cond.value, procs, None);
|
||||
let subs = &env.subs;
|
||||
let layout = Layout::from_var(arena, cond_var, subs)
|
||||
let layout = Layout::from_var(arena, cond_var, subs, env.pointer_size)
|
||||
.unwrap_or_else(|_| panic!("TODO generate a runtime error in from_can_when here!"));
|
||||
|
||||
// We can Switch on integers and tags, because they both have
|
||||
|
@ -649,12 +652,12 @@ fn from_can_when<'a>(
|
|||
debug_assert!(opt_default_branch.is_some());
|
||||
let default_branch = opt_default_branch.unwrap();
|
||||
|
||||
let cond_layout =
|
||||
Layout::from_var(arena, cond_var, env.subs).unwrap_or_else(|err| {
|
||||
let cond_layout = Layout::from_var(arena, cond_var, env.subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| {
|
||||
panic!("TODO turn cond_layout into a RuntimeError {:?}", err)
|
||||
});
|
||||
let ret_layout =
|
||||
Layout::from_var(arena, expr_var, env.subs).unwrap_or_else(|err| {
|
||||
let ret_layout = Layout::from_var(arena, expr_var, env.subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| {
|
||||
panic!("TODO turn ret_layout into a RuntimeError {:?}", err)
|
||||
});
|
||||
|
||||
|
@ -694,7 +697,7 @@ fn call_by_name<'a>(
|
|||
let arena = env.arena;
|
||||
|
||||
for (var, loc_arg) in loc_args {
|
||||
let layout = Layout::from_var(arena, var, subs)
|
||||
let layout = Layout::from_var(arena, var, subs, env.pointer_size)
|
||||
.unwrap_or_else(|err| panic!("TODO gracefully handle bad layout: {:?}", err));
|
||||
|
||||
args.push((from_can(env, loc_arg.value, procs, None), layout));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue