make the lowlevel borrow signature have a static lifetime

no more allocations, yay!
This commit is contained in:
Folkert 2024-03-13 19:25:05 +01:00
parent f5e4f4e4d1
commit ae88295365
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -1025,7 +1025,7 @@ fn insert_refcount_operations_binding<'a>(
} }
// Otherwise, perform regular reference counting using the lowlevel borrow signature. // Otherwise, perform regular reference counting using the lowlevel borrow signature.
_ => { _ => {
let borrow_signature = lowlevel_borrow_signature(arena, operator); let borrow_signature = lowlevel_borrow_signature(operator);
let arguments_with_borrow_signature = arguments let arguments_with_borrow_signature = arguments
.iter() .iter()
.copied() .copied()
@ -1265,15 +1265,14 @@ fn insert_dec_stmt<'a>(
/** /**
* Retrieve the borrow signature of a low-level operation. * Retrieve the borrow signature of a low-level operation.
*/ */
fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[Ownership] { fn lowlevel_borrow_signature(op: LowLevel) -> &'static [Ownership] {
use LowLevel::*; use LowLevel::*;
// TODO is true or false more efficient for non-refcounted layouts? const IRRELEVANT: Ownership = Ownership::Owned;
let irrelevant = Ownership::Owned; const FUNCTION: Ownership = IRRELEVANT;
let function = irrelevant; const CLOSURE_DATA: Ownership = IRRELEVANT;
let closure_data = irrelevant; const OWNED: Ownership = Ownership::Owned;
let owned = Ownership::Owned; const BORROWED: Ownership = Ownership::Borrowed;
let borrowed = Ownership::Borrowed;
// Here we define the borrow signature of low-level operations // Here we define the borrow signature of low-level operations
// //
@ -1281,46 +1280,44 @@ fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[Ownership] {
// - arguments that we may want to update destructively must be Owned // - arguments that we may want to update destructively must be Owned
// - other refcounted arguments are Borrowed // - other refcounted arguments are Borrowed
match op { match op {
Unreachable => arena.alloc_slice_copy(&[irrelevant]), Unreachable => &[IRRELEVANT],
DictPseudoSeed => arena.alloc_slice_copy(&[irrelevant]), DictPseudoSeed => &[IRRELEVANT],
ListLenU64 | ListLenUsize | StrIsEmpty | StrCountUtf8Bytes | ListGetCapacity => { ListLenU64 | ListLenUsize | StrIsEmpty | StrCountUtf8Bytes | ListGetCapacity => &[BORROWED],
arena.alloc_slice_copy(&[borrowed]) ListWithCapacity | StrWithCapacity => &[IRRELEVANT],
} ListReplaceUnsafe => &[OWNED, IRRELEVANT, IRRELEVANT],
ListWithCapacity | StrWithCapacity => arena.alloc_slice_copy(&[irrelevant]), StrGetUnsafe | ListGetUnsafe => &[BORROWED, IRRELEVANT],
ListReplaceUnsafe => arena.alloc_slice_copy(&[owned, irrelevant, irrelevant]), ListConcat => &[OWNED, OWNED],
StrGetUnsafe | ListGetUnsafe => arena.alloc_slice_copy(&[borrowed, irrelevant]), StrConcat => &[OWNED, BORROWED],
ListConcat => arena.alloc_slice_copy(&[owned, owned]), StrSubstringUnsafe => &[OWNED, IRRELEVANT, IRRELEVANT],
StrConcat => arena.alloc_slice_copy(&[owned, borrowed]), StrReserve => &[OWNED, IRRELEVANT],
StrSubstringUnsafe => arena.alloc_slice_copy(&[owned, irrelevant, irrelevant]), StrTrim => &[OWNED],
StrReserve => arena.alloc_slice_copy(&[owned, irrelevant]), StrTrimStart => &[OWNED],
StrTrim => arena.alloc_slice_copy(&[owned]), StrTrimEnd => &[OWNED],
StrTrimStart => arena.alloc_slice_copy(&[owned]), StrSplit => &[BORROWED, BORROWED],
StrTrimEnd => arena.alloc_slice_copy(&[owned]), StrToNum => &[BORROWED],
StrSplit => arena.alloc_slice_copy(&[borrowed, borrowed]), ListPrepend => &[OWNED, OWNED],
StrToNum => arena.alloc_slice_copy(&[borrowed]), StrJoinWith => &[BORROWED, BORROWED],
ListPrepend => arena.alloc_slice_copy(&[owned, owned]), ListMap => &[OWNED, FUNCTION, CLOSURE_DATA],
StrJoinWith => arena.alloc_slice_copy(&[borrowed, borrowed]), ListMap2 => &[OWNED, OWNED, FUNCTION, CLOSURE_DATA],
ListMap => arena.alloc_slice_copy(&[owned, function, closure_data]), ListMap3 => &[OWNED, OWNED, OWNED, FUNCTION, CLOSURE_DATA],
ListMap2 => arena.alloc_slice_copy(&[owned, owned, function, closure_data]), ListMap4 => &[OWNED, OWNED, OWNED, OWNED, FUNCTION, CLOSURE_DATA],
ListMap3 => arena.alloc_slice_copy(&[owned, owned, owned, function, closure_data]), ListSortWith => &[OWNED, FUNCTION, CLOSURE_DATA],
ListMap4 => arena.alloc_slice_copy(&[owned, owned, owned, owned, function, closure_data]), ListAppendUnsafe => &[OWNED, OWNED],
ListSortWith => arena.alloc_slice_copy(&[owned, function, closure_data]), ListReserve => &[OWNED, IRRELEVANT],
ListAppendUnsafe => arena.alloc_slice_copy(&[owned, owned]), ListSublist => &[OWNED, IRRELEVANT, IRRELEVANT],
ListReserve => arena.alloc_slice_copy(&[owned, irrelevant]), ListDropAt => &[OWNED, IRRELEVANT],
ListSublist => arena.alloc_slice_copy(&[owned, irrelevant, irrelevant]), ListSwap => &[OWNED, IRRELEVANT, IRRELEVANT],
ListDropAt => arena.alloc_slice_copy(&[owned, irrelevant]), ListReleaseExcessCapacity => &[OWNED],
ListSwap => arena.alloc_slice_copy(&[owned, irrelevant, irrelevant]), StrReleaseExcessCapacity => &[OWNED],
ListReleaseExcessCapacity => arena.alloc_slice_copy(&[owned]),
StrReleaseExcessCapacity => arena.alloc_slice_copy(&[owned]),
Eq | NotEq => arena.alloc_slice_copy(&[borrowed, borrowed]), Eq | NotEq => &[BORROWED, BORROWED],
And | Or | NumAdd | NumAddWrap | NumAddChecked | NumAddSaturated | NumSub | NumSubWrap And | Or | NumAdd | NumAddWrap | NumAddChecked | NumAddSaturated | NumSub | NumSubWrap
| NumSubChecked | NumSubSaturated | NumMul | NumMulWrap | NumMulSaturated | NumSubChecked | NumSubSaturated | NumMul | NumMulWrap | NumMulSaturated
| NumMulChecked | NumGt | NumGte | NumLt | NumLte | NumCompare | NumDivFrac | NumMulChecked | NumGt | NumGte | NumLt | NumLte | NumCompare | NumDivFrac
| NumDivTruncUnchecked | NumDivCeilUnchecked | NumRemUnchecked | NumIsMultipleOf | NumDivTruncUnchecked | NumDivCeilUnchecked | NumRemUnchecked | NumIsMultipleOf
| NumPow | NumPowInt | NumBitwiseAnd | NumBitwiseXor | NumBitwiseOr | NumShiftLeftBy | NumPow | NumPowInt | NumBitwiseAnd | NumBitwiseXor | NumBitwiseOr | NumShiftLeftBy
| NumShiftRightBy | NumShiftRightZfBy => arena.alloc_slice_copy(&[irrelevant, irrelevant]), | NumShiftRightBy | NumShiftRightZfBy => &[IRRELEVANT, IRRELEVANT],
NumToStr NumToStr
| NumAbs | NumAbs
@ -1348,24 +1345,24 @@ fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[Ownership] {
| NumCountLeadingZeroBits | NumCountLeadingZeroBits
| NumCountTrailingZeroBits | NumCountTrailingZeroBits
| NumCountOneBits | NumCountOneBits
| I128OfDec => arena.alloc_slice_copy(&[irrelevant]), | I128OfDec => &[IRRELEVANT],
StrStartsWith | StrEndsWith => arena.alloc_slice_copy(&[borrowed, borrowed]), StrStartsWith | StrEndsWith => &[BORROWED, BORROWED],
StrFromUtf8 => arena.alloc_slice_copy(&[owned]), StrFromUtf8 => &[OWNED],
StrToUtf8 => arena.alloc_slice_copy(&[owned]), StrToUtf8 => &[OWNED],
StrRepeat => arena.alloc_slice_copy(&[borrowed, irrelevant]), StrRepeat => &[BORROWED, IRRELEVANT],
StrFromInt | StrFromFloat => arena.alloc_slice_copy(&[irrelevant]), StrFromInt | StrFromFloat => &[IRRELEVANT],
Hash => arena.alloc_slice_copy(&[borrowed, irrelevant]), Hash => &[BORROWED, IRRELEVANT],
ListIsUnique => arena.alloc_slice_copy(&[borrowed]), ListIsUnique => &[BORROWED],
ListClone => arena.alloc_slice_copy(&[owned]), ListClone => &[OWNED],
BoxExpr | UnboxExpr => { BoxExpr | UnboxExpr => {
unreachable!("These lowlevel operations are turned into mono Expr's") unreachable!("These lowlevel operations are turned into mono Expr's")
} }
PtrStore => arena.alloc_slice_copy(&[owned, owned]), PtrStore => &[OWNED, OWNED],
PtrLoad => arena.alloc_slice_copy(&[owned]), PtrLoad => &[OWNED],
PtrCast => arena.alloc_slice_copy(&[owned]), PtrCast => &[OWNED],
SetJmp | LongJmp | SetLongJmpBuffer => { SetJmp | LongJmp | SetLongJmpBuffer => {
unreachable!("only inserted in dev backend codegen") unreachable!("only inserted in dev backend codegen")