Skip to content

Commit

Permalink
A revised, improved alias-checker
Browse files Browse the repository at this point in the history
The old system tried to ensure that the location an alias pointed at
would retain its type. That turned out to not be strong enough in the
face of aliases to the inside of tags.

The new system instead proves that values pointed to by aliases are
not replaced (or invalidated in some other way) at all. It knows of
two sufficient conditions for this, and tries to prove at least of
them:

A) The alias is 'immutably rooted' in a local, and this local is not
   reassigned for the lifetime of the alias. Immutably rooted means
   the alias refers to the local itself, or to something reachable
   from the local through immutable dereferencing.

B) No value whose type might include the type of the 'inner mutable
   element' of the thing the alias refers to (for example, the box in
   rec(mutable x = @mutable int)) is from the outer scope is accessed
   for the lifetime of the alias. This means for functions, no other
   argument types may include the alias's inner mutable type. For alt,
   for each, and for, it means the body does not refer to any locals
   originating from outside their scope that include this type.

The lifetime of an alias in an alt, for each, or for body is defined
as the range from its definition to its last use, not to the point
where it goes out of scope. This makes working around these
restrictions somewhat less annoying. For example, you can assign to
your alt-ed value you don't refer to any bindings afterwards.
  • Loading branch information
marijnh committed Jun 9, 2011
1 parent 43fbb07 commit beda82d
Show file tree
Hide file tree
Showing 6 changed files with 423 additions and 154 deletions.
4 changes: 4 additions & 0 deletions src/comp/front/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ type ident = str;
type path_ = rec(vec[ident] idents, vec[@ty] types);
type path = spanned[path_];

fn path_name(&path p) -> str {
ret str::connect(p.node.idents, "::");
}

type crate_num = int;
const crate_num local_crate = 0;
type def_num = int;
Expand Down
Loading

0 comments on commit beda82d

Please sign in to comment.