diff options
| author | Tim Chevalier <[email protected]> | 2011-04-20 12:11:01 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-04-28 13:26:19 -0700 |
| commit | 7c4f8cb45924326e21547d19cbed683115657616 (patch) | |
| tree | 9b27e94ec87c7bec6f1e4bd4e15c742d7d241d7e /src/lib | |
| parent | Add a very minimal set of .cfi_* statements to get part of backtraces (diff) | |
| download | rust-7c4f8cb45924326e21547d19cbed683115657616.tar.xz rust-7c4f8cb45924326e21547d19cbed683115657616.zip | |
Further work on typestate_check
Lots of work on typestate_check, seems to get a lot of the way
through checking the standard library.
* Added for, for_each, assign_op, bind, cast, put, check, break,
and cont. (I'm not sure break and cont are actually handled correctly.)
* Fixed side-effect bug in seq_preconds so that unioning the
preconditions of a sequence of statements or expressions
is handled correctly.
* Pass poststate correctly through a stmt_decl.
* Handle expr_ret and expr_fail properly (after execution of a ret
or fail, everything is true -- this is needed to handle ifs and alts
where one branch is a ret or fail)
* Fixed bug in set_prestate_ann where a thing that needed to be
mutated wasn't getting passed as an alias
* Fixed bug in how expr_alt was treated (zero is not the identity
for intersect, who knew, right?)
* Update logging to reflect log_err vs. log
* Fixed find_locals so as to return all local decls and exclude
function arguments.
* Make union_postconds work on an empty vector (needed to handle
empty blocks correctly)
* Added _vec.cat_options, which takes a list of option[T] to a list
of T, ignoring any Nones
* Added two test cases.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/_vec.rs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs index ab222be9..3718ac35 100644 --- a/src/lib/_vec.rs +++ b/src/lib/_vec.rs @@ -282,6 +282,21 @@ fn plus_option[T](&vec[T] v, &option.t[T] o) -> () { } } +fn cat_options[T](&vec[option.t[T]] v) -> vec[T] { + let vec[T] res = vec(); + + for (option.t[T] o in v) { + alt (o) { + case (none[T]) { } + case (some[T](?t)) { + res += vec(t); + } + } + } + + ret res; +} + // TODO: Remove in favor of built-in "freeze" operation when it's implemented. fn freeze[T](vec[mutable T] v) -> vec[T] { let vec[T] result = vec(); |