mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
make the lowlevel borrow signature have a static lifetime
no more allocations, yay!
This commit is contained in:
parent
f5e4f4e4d1
commit
ae88295365
1 changed files with 50 additions and 53 deletions
|
@ -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")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue