mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-18 17:49:47 +00:00
add NullPointer to mono::ir::Expr
This commit is contained in:
parent
63cdd00d13
commit
09779f65ad
9 changed files with 28 additions and 3 deletions
|
@ -1289,6 +1289,11 @@ fn expr_spec<'a>(
|
||||||
|
|
||||||
match expr {
|
match expr {
|
||||||
Literal(literal) => literal_spec(builder, block, literal),
|
Literal(literal) => literal_spec(builder, block, literal),
|
||||||
|
NullPointer => {
|
||||||
|
let pointer_type = layout_spec(env, builder, interner, layout)?;
|
||||||
|
|
||||||
|
builder.add_unknown_with(block, &[], pointer_type)
|
||||||
|
}
|
||||||
Call(call) => call_spec(builder, interner, env, block, layout, call),
|
Call(call) => call_spec(builder, interner, env, block, layout, call),
|
||||||
Reuse {
|
Reuse {
|
||||||
tag_layout,
|
tag_layout,
|
||||||
|
|
|
@ -1501,6 +1501,7 @@ trait Backend<'a> {
|
||||||
self.set_last_seen(*sym, stmt);
|
self.set_last_seen(*sym, stmt);
|
||||||
match expr {
|
match expr {
|
||||||
Expr::Literal(_) => {}
|
Expr::Literal(_) => {}
|
||||||
|
Expr::NullPointer => {}
|
||||||
|
|
||||||
Expr::Call(call) => self.scan_ast_call(call, stmt),
|
Expr::Call(call) => self.scan_ast_call(call, stmt),
|
||||||
|
|
||||||
|
|
|
@ -1082,6 +1082,12 @@ pub fn build_exp_expr<'a, 'ctx, 'env>(
|
||||||
|
|
||||||
match expr {
|
match expr {
|
||||||
Literal(literal) => build_exp_literal(env, layout_interner, parent, layout, literal),
|
Literal(literal) => build_exp_literal(env, layout_interner, parent, layout, literal),
|
||||||
|
NullPointer => {
|
||||||
|
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||||
|
|
||||||
|
debug_assert!(basic_type.is_pointer_type());
|
||||||
|
basic_type.into_pointer_type().const_zero().into()
|
||||||
|
}
|
||||||
|
|
||||||
Call(call) => build_exp_call(
|
Call(call) => build_exp_call(
|
||||||
env,
|
env,
|
||||||
|
|
|
@ -1041,6 +1041,8 @@ impl<'a, 'r> WasmBackend<'a, 'r> {
|
||||||
match expr {
|
match expr {
|
||||||
Expr::Literal(lit) => self.expr_literal(lit, storage),
|
Expr::Literal(lit) => self.expr_literal(lit, storage),
|
||||||
|
|
||||||
|
Expr::NullPointer => self.expr_null_pointer(),
|
||||||
|
|
||||||
Expr::Call(roc_mono::ir::Call {
|
Expr::Call(roc_mono::ir::Call {
|
||||||
call_type,
|
call_type,
|
||||||
arguments,
|
arguments,
|
||||||
|
@ -1232,6 +1234,10 @@ impl<'a, 'r> WasmBackend<'a, 'r> {
|
||||||
elements_addr
|
elements_addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn expr_null_pointer(&mut self) {
|
||||||
|
self.code_builder.i32_const(0);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* Call expressions
|
* Call expressions
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
|
@ -761,7 +761,7 @@ impl<'a> BorrowInfState<'a> {
|
||||||
|
|
||||||
Call(call) => self.collect_call(interner, param_map, z, call),
|
Call(call) => self.collect_call(interner, param_map, z, call),
|
||||||
|
|
||||||
Literal(_) | RuntimeErrorFunction(_) => {}
|
Literal(_) | NullPointer | RuntimeErrorFunction(_) => {}
|
||||||
|
|
||||||
StructAtIndex { structure: x, .. } => {
|
StructAtIndex { structure: x, .. } => {
|
||||||
// if the structure (record/tag/array) is owned, the extracted value is
|
// if the structure (record/tag/array) is owned, the extracted value is
|
||||||
|
|
|
@ -390,6 +390,7 @@ impl<'a, 'r> Ctx<'a, 'r> {
|
||||||
fn check_expr(&mut self, e: &Expr<'a>) -> Option<InLayout<'a>> {
|
fn check_expr(&mut self, e: &Expr<'a>) -> Option<InLayout<'a>> {
|
||||||
match e {
|
match e {
|
||||||
Expr::Literal(_) => None,
|
Expr::Literal(_) => None,
|
||||||
|
Expr::NullPointer => None,
|
||||||
Expr::Call(call) => self.check_call(call),
|
Expr::Call(call) => self.check_call(call),
|
||||||
&Expr::Tag {
|
&Expr::Tag {
|
||||||
tag_layout,
|
tag_layout,
|
||||||
|
|
|
@ -213,7 +213,7 @@ pub fn occurring_variables_expr(expr: &Expr<'_>, result: &mut MutSet<Symbol>) {
|
||||||
result.insert(*symbol);
|
result.insert(*symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
EmptyArray | RuntimeErrorFunction(_) | Literal(_) => {}
|
EmptyArray | RuntimeErrorFunction(_) | Literal(_) | NullPointer => {}
|
||||||
|
|
||||||
GetTagId {
|
GetTagId {
|
||||||
structure: symbol, ..
|
structure: symbol, ..
|
||||||
|
@ -946,7 +946,7 @@ impl<'a, 'i> Context<'a, 'i> {
|
||||||
self.arena.alloc(Stmt::Let(z, v, l, b))
|
self.arena.alloc(Stmt::Let(z, v, l, b))
|
||||||
}
|
}
|
||||||
|
|
||||||
EmptyArray | Literal(_) | Reset { .. } | RuntimeErrorFunction(_) => {
|
EmptyArray | Literal(_) | Reset { .. } | NullPointer | RuntimeErrorFunction(_) => {
|
||||||
// EmptyArray is always stack-allocated function pointers are persistent
|
// EmptyArray is always stack-allocated function pointers are persistent
|
||||||
self.arena.alloc(Stmt::Let(z, v, l, b))
|
self.arena.alloc(Stmt::Let(z, v, l, b))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1878,6 +1878,7 @@ pub enum Expr<'a> {
|
||||||
arguments: &'a [Symbol],
|
arguments: &'a [Symbol],
|
||||||
},
|
},
|
||||||
Struct(&'a [Symbol]),
|
Struct(&'a [Symbol]),
|
||||||
|
NullPointer,
|
||||||
|
|
||||||
StructAtIndex {
|
StructAtIndex {
|
||||||
index: u64,
|
index: u64,
|
||||||
|
@ -2016,6 +2017,7 @@ impl<'a> Expr<'a> {
|
||||||
.append(alloc.space())
|
.append(alloc.space())
|
||||||
.append(alloc.intersperse(it, " "))
|
.append(alloc.intersperse(it, " "))
|
||||||
}
|
}
|
||||||
|
NullPointer => alloc.text("NullPointer"),
|
||||||
Reuse {
|
Reuse {
|
||||||
symbol,
|
symbol,
|
||||||
tag_id,
|
tag_id,
|
||||||
|
@ -7462,6 +7464,8 @@ fn substitute_in_expr<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NullPointer => None,
|
||||||
|
|
||||||
Reuse { .. } | Reset { .. } => unreachable!("reset/reuse have not been introduced yet"),
|
Reuse { .. } | Reset { .. } => unreachable!("reset/reuse have not been introduced yet"),
|
||||||
|
|
||||||
Struct(args) => {
|
Struct(args) => {
|
||||||
|
|
|
@ -319,6 +319,7 @@ fn insert_reset<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
Literal(_)
|
Literal(_)
|
||||||
|
| NullPointer
|
||||||
| Call(_)
|
| Call(_)
|
||||||
| Tag { .. }
|
| Tag { .. }
|
||||||
| Struct(_)
|
| Struct(_)
|
||||||
|
@ -839,6 +840,7 @@ fn has_live_var<'a>(jp_live_vars: &JPLiveVarMap, stmt: &'a Stmt<'a>, needle: Sym
|
||||||
fn has_live_var_expr<'a>(expr: &'a Expr<'a>, needle: Symbol) -> bool {
|
fn has_live_var_expr<'a>(expr: &'a Expr<'a>, needle: Symbol) -> bool {
|
||||||
match expr {
|
match expr {
|
||||||
Expr::Literal(_) => false,
|
Expr::Literal(_) => false,
|
||||||
|
Expr::NullPointer => false,
|
||||||
Expr::Call(call) => has_live_var_call(call, needle),
|
Expr::Call(call) => has_live_var_call(call, needle),
|
||||||
Expr::Array { elems: fields, .. } => {
|
Expr::Array { elems: fields, .. } => {
|
||||||
for element in fields.iter() {
|
for element in fields.iter() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue