mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 20:28:02 +00:00
Load as a stack pointer
This commit is contained in:
parent
fde75d5432
commit
8d9c6d09b9
7 changed files with 32 additions and 27 deletions
|
@ -842,6 +842,15 @@ impl<'a, 'r> Ctx<'a, 'r> {
|
|||
});
|
||||
}
|
||||
}
|
||||
ErasedField::ValuePtr => {
|
||||
let repr = self.interner.get_repr(target_layout);
|
||||
if !matches!(repr, LayoutRepr::Ptr(_)) {
|
||||
self.problem(ProblemKind::ErasedLoadValueNotBoxed {
|
||||
symbol,
|
||||
target_layout,
|
||||
});
|
||||
}
|
||||
}
|
||||
ErasedField::Callee => {
|
||||
let repr = self.interner.get_repr(target_layout);
|
||||
if !matches!(repr, LayoutRepr::FunctionPointer(_)) {
|
||||
|
|
|
@ -508,6 +508,7 @@ fn format_use_kind(use_kind: UseKind) -> &'static str {
|
|||
UseKind::ExpectLookup => "lookup for an expect",
|
||||
UseKind::ErasedMake(kind) => match kind {
|
||||
ErasedField::Value => "erased value field",
|
||||
ErasedField::ValuePtr => "erased value pointer",
|
||||
ErasedField::Callee => "erased callee field",
|
||||
},
|
||||
UseKind::Erased => "erasure",
|
||||
|
|
|
@ -903,7 +903,7 @@ fn insert_refcount_operations_binding<'a>(
|
|||
|
||||
match field {
|
||||
ErasedField::Value => inc_owned!([*symbol], new_let),
|
||||
ErasedField::Callee => new_let,
|
||||
ErasedField::Callee | ErasedField::ValuePtr => new_let,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1844,7 +1844,10 @@ pub struct ReuseToken {
|
|||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum ErasedField {
|
||||
/// Load a dereferenceable pointer to the value.
|
||||
Value,
|
||||
/// Load a non-dereferenceable pointer to the value.
|
||||
ValuePtr,
|
||||
Callee,
|
||||
}
|
||||
|
||||
|
@ -2130,6 +2133,7 @@ impl<'a> Expr<'a> {
|
|||
ErasedLoad { symbol, field } => {
|
||||
let field = match field {
|
||||
ErasedField::Value => ".Value",
|
||||
ErasedField::ValuePtr => ".ValuePtr",
|
||||
ErasedField::Callee => ".Callee",
|
||||
};
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ fn build_function_pointer<'a>(
|
|||
/// f = compile(f)
|
||||
/// joinpoint join result:
|
||||
/// <hole>
|
||||
/// f_value: Box<[]> = ErasedLoad(f, .value)
|
||||
/// f_value: Ptr<[]> = ErasedLoad(f, .value_ptr)
|
||||
/// f_callee: Ptr<[]> = ErasedLoad(f, .callee)
|
||||
/// if (f_value != nullptr) {
|
||||
/// f_callee = Cast(f_callee, (..params, Erased) -> ret);
|
||||
|
@ -164,8 +164,13 @@ pub fn call_erased_function<'a>(
|
|||
|
||||
// f_value = ErasedLoad(f, .value)
|
||||
let f_value = env.unique_symbol();
|
||||
let let_f_value =
|
||||
index_erased_function(arena, f_value, f, ErasedField::Value, Layout::OPAQUE_PTR);
|
||||
let let_f_value = index_erased_function(
|
||||
arena,
|
||||
f_value,
|
||||
f,
|
||||
ErasedField::ValuePtr,
|
||||
Layout::OPAQUE_STACK_PTR,
|
||||
);
|
||||
|
||||
let mut build_closure_data_branch = |env: &mut Env, pass_closure| {
|
||||
// f_callee = Cast(f_callee, (..params) -> ret);
|
||||
|
@ -211,7 +216,7 @@ pub fn call_erased_function<'a>(
|
|||
};
|
||||
|
||||
let value_is_null = env.unique_symbol();
|
||||
let let_value_is_null = is_null(env, arena, value_is_null, f_value, Layout::OPAQUE_PTR);
|
||||
let let_value_is_null = is_null(env, arena, value_is_null, f_value, Layout::OPAQUE_STACK_PTR);
|
||||
|
||||
let call_and_jump_on_value = let_value_is_null(
|
||||
//
|
||||
|
|
|
@ -2624,20 +2624,8 @@ impl<'a> LayoutRepr<'a> {
|
|||
pub const F64: Self = LayoutRepr::Builtin(Builtin::Float(FloatWidth::F64));
|
||||
pub const DEC: Self = LayoutRepr::Builtin(Builtin::Decimal);
|
||||
pub const STR: Self = LayoutRepr::Builtin(Builtin::Str);
|
||||
<<<<<<< HEAD
|
||||
pub const OPAQUE_PTR: Self = LayoutRepr::Ptr(Layout::VOID);
|
||||
pub const ERASED: Self = Self::struct_(&[
|
||||
// .value
|
||||
Layout::OPAQUE_PTR,
|
||||
// .callee
|
||||
Layout::OPAQUE_PTR,
|
||||
// .refcounter
|
||||
Layout::OPAQUE_PTR,
|
||||
]);
|
||||
=======
|
||||
pub const OPAQUE_PTR: Self = LayoutRepr::Boxed(Layout::VOID);
|
||||
pub const ERASED: Self = LayoutRepr::Erased(Erased);
|
||||
>>>>>>> 0ff7ccbb9 (Add Layout::Erased)
|
||||
|
||||
pub const fn struct_(field_layouts: &'a [InLayout<'a>]) -> Self {
|
||||
Self::Struct(field_layouts)
|
||||
|
@ -2868,6 +2856,8 @@ impl<'a> LayoutRepr<'a> {
|
|||
|
||||
Builtin(List(_)) | Builtin(Str) => true,
|
||||
|
||||
Erased(_) => true,
|
||||
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,32 +60,28 @@ procedure Test.0 ():
|
|||
joinpoint Test.8 Test.5:
|
||||
ret Test.5;
|
||||
in
|
||||
let Test.9 : Boxed([]) = ErasedLoad Test.7 .Value;
|
||||
let Test.11 : Boxed([]) = NullPointer;
|
||||
let Test.9 : Ptr([]) = ErasedLoad Test.7 .ValuePtr;
|
||||
let Test.11 : Ptr([]) = NullPointer;
|
||||
let Test.10 : Int1 = lowlevel Eq Test.9 Test.11;
|
||||
dec Test.11;
|
||||
dec Test.9;
|
||||
if Test.10 then
|
||||
dec Test.7;
|
||||
let Test.12 : FunPtr(({}) -> Str) = ErasedLoad Test.7 .Callee;
|
||||
let Test.13 : Str = CallByPtr Test.12 Test.6;
|
||||
jump Test.8 Test.13;
|
||||
else
|
||||
inc Test.7;
|
||||
let Test.14 : FunPtr(({}, ?Erased) -> Str) = ErasedLoad Test.7 .Callee;
|
||||
let Test.15 : Str = CallByPtr Test.14 Test.6 Test.7;
|
||||
jump Test.8 Test.15;
|
||||
in
|
||||
let Test.19 : Boxed([]) = ErasedLoad Test.17 .Value;
|
||||
let Test.21 : Boxed([]) = NullPointer;
|
||||
let Test.19 : Ptr([]) = ErasedLoad Test.17 .ValuePtr;
|
||||
let Test.21 : Ptr([]) = NullPointer;
|
||||
let Test.20 : Int1 = lowlevel Eq Test.19 Test.21;
|
||||
dec Test.21;
|
||||
dec Test.19;
|
||||
if Test.20 then
|
||||
dec Test.17;
|
||||
let Test.22 : FunPtr((Str) -> ?Erased) = ErasedLoad Test.17 .Callee;
|
||||
let Test.23 : ?Erased = CallByPtr Test.22 Test.16;
|
||||
jump Test.18 Test.23;
|
||||
else
|
||||
inc Test.17;
|
||||
let Test.24 : FunPtr((Str, ?Erased) -> ?Erased) = ErasedLoad Test.17 .Callee;
|
||||
let Test.25 : ?Erased = CallByPtr Test.24 Test.16 Test.17;
|
||||
jump Test.18 Test.25;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue