Expand description
Explicit stack slots, which can be used for stack emplacement.
A Slot is uninitialized storage on the stack that can be manipulated
explicitly. Notionally, a Slot<T> represents a let x: T; in some
function’s stack.
Slots mut be created with the slot!() macro:
slot!(storage);
let mut x = storage.put(42);
*x /= 2;
assert_eq!(*x, 21);Unfortunately, due to the constrains of Rust today, it is not possible to
produce a Slot as part of a larger expression; since it needs to expand
to a let to bind the stack location, slot!() must be a statement, not
an expression.
Slots can also be used to implement a sort of “guaranteed RVO”:
fn returns_on_the_stack(val: i32, storage: Slot<i32>) -> Option<MoveRef<i32>> {
if val == 0 {
return None
}
Some(storage.put(val))
}
slot!(storage);
let val = returns_on_the_stack(42, storage);
assert_eq!(*val.unwrap(), 42);Slots provide a natural location for emplacing values on the stack.
The moveit!() macro is intended to make this operation
straight-forward.
§DroppingSlot
DroppingSlot is a support type similar to Slot that is used for
implementing DerefMove, but which users should otherwise not construct
themselves (despite it being otherwise perfectly safe to do so).
Structs§
- Dropping
Slot - Similar to a
Slot, but able to drop its contents. - Slot
- An empty slot on the stack into which a value could be emplaced.