Drop order

Rune implements the following rules when determining when a place should be dropped.

Places are distinct from values, in that they refer to a place where a value is stored, not the value itself.

The distinction becomes apparent when we note that the same value can be referenced by multiple places:

let a = 42;
let b = a;

Above, b is a distinct place that refers to the same value as a.

There are two ways for a value to be dropped:

  • All the places referencing go out of scope.
  • The value is explicitly dropped with drop(value).

The second variant causes the value to be dropped. Using any of the places referencing that value after it has been dropped will cause an error.

Variables

A variable declaration like this:

let var = 42;

Defines a place called var.

Once variables like these go out of scope, their place is dropped. However, dropping a place doesn't necessarily mean the value is dropped. This only happens when that is the last place referencing that variable.

let object = {
    let var = 42;
    let object = #{ var };
};

// object can be used here and `var` is still live.

Temporaries

Temporaries are constructed when evaluating any non-trivial expression, such as this:

let var = [42, (), "hello"];

The drop order for temporaries is not strictly defined and can be extended. But never beyond the block in which they are defined.