Load as a stack pointer

This commit is contained in:
Ayaz Hafiz 2023-07-12 13:25:27 -05:00
parent fde75d5432
commit 8d9c6d09b9
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
7 changed files with 32 additions and 27 deletions

View file

@ -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(_)) {

View file

@ -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",

View file

@ -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,
}
}

View file

@ -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",
};

View file

@ -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(
//

View file

@ -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,
}
}

View file

@ -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;