Skip to content

Commit 7ee0157

Browse files
catamorphismgraydon
authored andcommitted
---
yaml --- r: 1968 b: refs/heads/master c: 3130348 h: refs/heads/master v: v3
1 parent 0a27f31 commit 7ee0157

File tree

14 files changed

+815
-236
lines changed

14 files changed

+815
-236
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 69a34b992bccf0c8db8d0d45b5bdddde66874885
2+
refs/heads/master: 3130348ee177f1716488b6caca6c7852fe47754c

trunk/src/comp/driver/rustc.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import middle.trans;
88
import middle.resolve;
99
import middle.ty;
1010
import middle.typeck;
11+
import middle.typestate_check;
1112
import util.common;
1213

1314
import std.map.mk_hashmap;
@@ -63,11 +64,11 @@ impure fn compile_input(session.session sess,
6364
auto crate = parse_input(sess, p, input);
6465
crate = creader.read_crates(sess, crate, library_search_paths);
6566
crate = resolve.resolve_crate(sess, crate);
66-
6767
auto typeck_result = typeck.check_crate(sess, crate);
6868
crate = typeck_result._0;
6969
auto type_cache = typeck_result._1;
70-
70+
// FIXME: uncomment once typestate_check works
71+
// crate = typestate_check.check_crate(crate);
7172
trans.trans_crate(sess, crate, type_cache, output, shared);
7273
}
7374

trunk/src/comp/front/ast.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import util.common.span;
66
import util.common.spanned;
77
import util.common.ty_mach;
88
import util.common.filename;
9+
import util.typestate_ann.ts_ann;
910

1011
type ident = str;
1112

@@ -21,7 +22,9 @@ type ty_param = rec(ident ident, def_id id);
2122
// Annotations added during successive passes.
2223
tag ann {
2324
ann_none;
24-
ann_type(@middle.ty.t, option.t[vec[@middle.ty.t]] /* ty param substs */);
25+
ann_type(@middle.ty.t,
26+
option.t[vec[@middle.ty.t]], /* ty param substs */
27+
option.t[@ts_ann]); /* pre- and postcondition for typestate */
2528
}
2629

2730
tag def {
@@ -274,14 +277,14 @@ tag expr_ {
274277
expr_index(@expr, @expr, ann);
275278
expr_path(path, option.t[def], ann);
276279
expr_ext(path, vec[@expr], option.t[@expr], @expr, ann);
277-
expr_fail;
278-
expr_break;
279-
expr_cont;
280-
expr_ret(option.t[@expr]);
281-
expr_put(option.t[@expr]);
282-
expr_be(@expr);
283-
expr_log(@expr);
284-
expr_check_expr(@expr);
280+
expr_fail(ann);
281+
expr_break(ann);
282+
expr_cont(ann);
283+
expr_ret(option.t[@expr], ann);
284+
expr_put(option.t[@expr], ann);
285+
expr_be(@expr, ann);
286+
expr_log(@expr, ann);
287+
expr_check_expr(@expr, ann);
285288
expr_port(ann);
286289
expr_chan(@expr, ann);
287290
}

trunk/src/comp/front/lexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ impure fn scan_number(mutable char c, reader rdr) -> token.token {
419419
if (is_dec_integer) {
420420
accum_int = digits_to_string(dec_str);
421421
}
422-
422+
423423
c = rdr.curr();
424424
n = rdr.next();
425425

trunk/src/comp/front/parser.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -794,14 +794,14 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
794794

795795
case (token.FAIL) {
796796
p.bump();
797-
ex = ast.expr_fail;
797+
ex = ast.expr_fail(ast.ann_none);
798798
}
799799

800800
case (token.LOG) {
801801
p.bump();
802802
auto e = parse_expr(p);
803803
auto hi = e.span;
804-
ex = ast.expr_log(e);
804+
ex = ast.expr_log(e, ast.ann_none);
805805
}
806806

807807
case (token.CHECK) {
@@ -810,7 +810,7 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
810810
case (token.LPAREN) {
811811
auto e = parse_expr(p);
812812
auto hi = e.span;
813-
ex = ast.expr_check_expr(e);
813+
ex = ast.expr_check_expr(e, ast.ann_none);
814814
}
815815
case (_) {
816816
p.get_session().unimpl("constraint-check stmt");
@@ -822,36 +822,36 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
822822
p.bump();
823823
alt (p.peek()) {
824824
case (token.SEMI) {
825-
ex = ast.expr_ret(none[@ast.expr]);
825+
ex = ast.expr_ret(none[@ast.expr], ast.ann_none);
826826
}
827827
case (_) {
828828
auto e = parse_expr(p);
829829
hi = e.span;
830-
ex = ast.expr_ret(some[@ast.expr](e));
830+
ex = ast.expr_ret(some[@ast.expr](e), ast.ann_none);
831831
}
832832
}
833833
}
834834

835835
case (token.BREAK) {
836836
p.bump();
837-
ex = ast.expr_break;
837+
ex = ast.expr_break(ast.ann_none);
838838
}
839839

840840
case (token.CONT) {
841841
p.bump();
842-
ex = ast.expr_cont;
842+
ex = ast.expr_cont(ast.ann_none);
843843
}
844844

845845
case (token.PUT) {
846846
p.bump();
847847
alt (p.peek()) {
848848
case (token.SEMI) {
849-
ex = ast.expr_put(none[@ast.expr]);
849+
ex = ast.expr_put(none[@ast.expr], ast.ann_none);
850850
}
851851
case (_) {
852852
auto e = parse_expr(p);
853853
hi = e.span;
854-
ex = ast.expr_put(some[@ast.expr](e));
854+
ex = ast.expr_put(some[@ast.expr](e), ast.ann_none);
855855
}
856856
}
857857
}
@@ -862,7 +862,7 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
862862
// FIXME: Is this the right place for this check?
863863
if /*check*/ (ast.is_call_expr(e)) {
864864
hi = e.span;
865-
ex = ast.expr_be(e);
865+
ex = ast.expr_be(e, ast.ann_none);
866866
}
867867
else {
868868
p.err("Non-call expression in tail call");
@@ -1651,14 +1651,14 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
16511651
case (ast.expr_field(_,_,_)) { ret true; }
16521652
case (ast.expr_index(_,_,_)) { ret true; }
16531653
case (ast.expr_path(_,_,_)) { ret true; }
1654-
case (ast.expr_fail) { ret true; }
1655-
case (ast.expr_break) { ret true; }
1656-
case (ast.expr_cont) { ret true; }
1657-
case (ast.expr_ret(_)) { ret true; }
1658-
case (ast.expr_put(_)) { ret true; }
1659-
case (ast.expr_be(_)) { ret true; }
1660-
case (ast.expr_log(_)) { ret true; }
1661-
case (ast.expr_check_expr(_)) { ret true; }
1654+
case (ast.expr_fail(_)) { ret true; }
1655+
case (ast.expr_break(_)) { ret true; }
1656+
case (ast.expr_cont(_)) { ret true; }
1657+
case (ast.expr_ret(_,_)) { ret true; }
1658+
case (ast.expr_put(_,_)) { ret true; }
1659+
case (ast.expr_be(_,_)) { ret true; }
1660+
case (ast.expr_log(_,_)) { ret true; }
1661+
case (ast.expr_check_expr(_,_)) { ret true; }
16621662
}
16631663
}
16641664
// We should not be calling this on a cdir.

trunk/src/comp/middle/fold.rs

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -178,26 +178,26 @@ type ast_fold[ENV] =
178178
@expr expanded,
179179
ann a) -> @expr) fold_expr_ext,
180180

181-
(fn(&ENV e, &span sp) -> @expr) fold_expr_fail,
181+
(fn(&ENV e, &span sp, ann a) -> @expr) fold_expr_fail,
182182

183-
(fn(&ENV e, &span sp) -> @expr) fold_expr_break,
183+
(fn(&ENV e, &span sp, ann a) -> @expr) fold_expr_break,
184184

185-
(fn(&ENV e, &span sp) -> @expr) fold_expr_cont,
185+
(fn(&ENV e, &span sp, ann a) -> @expr) fold_expr_cont,
186186

187187
(fn(&ENV e, &span sp,
188-
&option.t[@expr] rv) -> @expr) fold_expr_ret,
188+
&option.t[@expr] rv, ann a) -> @expr) fold_expr_ret,
189189

190190
(fn(&ENV e, &span sp,
191-
&option.t[@expr] rv) -> @expr) fold_expr_put,
191+
&option.t[@expr] rv, ann a) -> @expr) fold_expr_put,
192192

193193
(fn(&ENV e, &span sp,
194-
@expr e) -> @expr) fold_expr_be,
194+
@expr e, ann a) -> @expr) fold_expr_be,
195195

196196
(fn(&ENV e, &span sp,
197-
@expr e) -> @expr) fold_expr_log,
197+
@expr e, ann a) -> @expr) fold_expr_log,
198198

199199
(fn(&ENV e, &span sp,
200-
@expr e) -> @expr) fold_expr_check_expr,
200+
@expr e, ann a) -> @expr) fold_expr_check_expr,
201201

202202
(fn(&ENV e, &span sp,
203203
ann a) -> @expr) fold_expr_port,
@@ -717,53 +717,53 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
717717
exp, t);
718718
}
719719

720-
case (ast.expr_fail) {
721-
ret fld.fold_expr_fail(env_, e.span);
720+
case (ast.expr_fail(?t)) {
721+
ret fld.fold_expr_fail(env_, e.span, t);
722722
}
723723

724-
case (ast.expr_break) {
725-
ret fld.fold_expr_break(env_, e.span);
724+
case (ast.expr_break(?t)) {
725+
ret fld.fold_expr_break(env_, e.span, t);
726726
}
727727

728-
case (ast.expr_cont) {
729-
ret fld.fold_expr_cont(env_, e.span);
728+
case (ast.expr_cont(?t)) {
729+
ret fld.fold_expr_cont(env_, e.span, t);
730730
}
731731

732-
case (ast.expr_ret(?oe)) {
732+
case (ast.expr_ret(?oe, ?t)) {
733733
auto oee = none[@expr];
734734
alt (oe) {
735735
case (some[@expr](?x)) {
736736
oee = some(fold_expr(env_, fld, x));
737737
}
738738
case (_) { /* fall through */ }
739739
}
740-
ret fld.fold_expr_ret(env_, e.span, oee);
740+
ret fld.fold_expr_ret(env_, e.span, oee, t);
741741
}
742742

743-
case (ast.expr_put(?oe)) {
743+
case (ast.expr_put(?oe, ?t)) {
744744
auto oee = none[@expr];
745745
alt (oe) {
746746
case (some[@expr](?x)) {
747747
oee = some(fold_expr(env_, fld, x));
748748
}
749749
case (_) { /* fall through */ }
750750
}
751-
ret fld.fold_expr_put(env_, e.span, oee);
751+
ret fld.fold_expr_put(env_, e.span, oee, t);
752752
}
753753

754-
case (ast.expr_be(?x)) {
754+
case (ast.expr_be(?x, ?t)) {
755755
auto ee = fold_expr(env_, fld, x);
756-
ret fld.fold_expr_be(env_, e.span, ee);
756+
ret fld.fold_expr_be(env_, e.span, ee, t);
757757
}
758758

759-
case (ast.expr_log(?x)) {
759+
case (ast.expr_log(?x, ?t)) {
760760
auto ee = fold_expr(env_, fld, x);
761-
ret fld.fold_expr_log(env_, e.span, ee);
761+
ret fld.fold_expr_log(env_, e.span, ee, t);
762762
}
763763

764-
case (ast.expr_check_expr(?x)) {
764+
case (ast.expr_check_expr(?x, ?t)) {
765765
auto ee = fold_expr(env_, fld, x);
766-
ret fld.fold_expr_check_expr(env_, e.span, ee);
766+
ret fld.fold_expr_check_expr(env_, e.span, ee, t);
767767
}
768768

769769
case (ast.expr_port(?t)) {
@@ -1308,38 +1308,40 @@ fn identity_fold_expr_ext[ENV](&ENV env, &span sp,
13081308
ret @respan(sp, ast.expr_ext(p, args, body, expanded, a));
13091309
}
13101310

1311-
fn identity_fold_expr_fail[ENV](&ENV env, &span sp) -> @expr {
1312-
ret @respan(sp, ast.expr_fail);
1311+
fn identity_fold_expr_fail[ENV](&ENV env, &span sp, ann a) -> @expr {
1312+
ret @respan(sp, ast.expr_fail(a));
13131313
}
13141314

1315-
fn identity_fold_expr_break[ENV](&ENV env, &span sp) -> @expr {
1316-
ret @respan(sp, ast.expr_break);
1315+
fn identity_fold_expr_break[ENV](&ENV env, &span sp, ann a) -> @expr {
1316+
ret @respan(sp, ast.expr_break(a));
13171317
}
13181318

1319-
fn identity_fold_expr_cont[ENV](&ENV env, &span sp) -> @expr {
1320-
ret @respan(sp, ast.expr_cont);
1319+
fn identity_fold_expr_cont[ENV](&ENV env, &span sp, ann a) -> @expr {
1320+
ret @respan(sp, ast.expr_cont(a));
13211321
}
13221322

13231323
fn identity_fold_expr_ret[ENV](&ENV env, &span sp,
1324-
&option.t[@expr] rv) -> @expr {
1325-
ret @respan(sp, ast.expr_ret(rv));
1324+
&option.t[@expr] rv, ann a) -> @expr {
1325+
ret @respan(sp, ast.expr_ret(rv, a));
13261326
}
13271327

13281328
fn identity_fold_expr_put[ENV](&ENV env, &span sp,
1329-
&option.t[@expr] rv) -> @expr {
1330-
ret @respan(sp, ast.expr_put(rv));
1329+
&option.t[@expr] rv, ann a) -> @expr {
1330+
ret @respan(sp, ast.expr_put(rv, a));
13311331
}
13321332

1333-
fn identity_fold_expr_be[ENV](&ENV env, &span sp, @expr x) -> @expr {
1334-
ret @respan(sp, ast.expr_be(x));
1333+
fn identity_fold_expr_be[ENV](&ENV env, &span sp, @expr x, ann a) -> @expr {
1334+
ret @respan(sp, ast.expr_be(x, a));
13351335
}
13361336

1337-
fn identity_fold_expr_log[ENV](&ENV e, &span sp, @expr x) -> @expr {
1338-
ret @respan(sp, ast.expr_log(x));
1337+
fn identity_fold_expr_log[ENV](&ENV e, &span sp, @expr x,
1338+
ann a) -> @expr {
1339+
ret @respan(sp, ast.expr_log(x, a));
13391340
}
13401341

1341-
fn identity_fold_expr_check_expr[ENV](&ENV e, &span sp, @expr x) -> @expr {
1342-
ret @respan(sp, ast.expr_check_expr(x));
1342+
fn identity_fold_expr_check_expr[ENV](&ENV e, &span sp, @expr x, ann a)
1343+
-> @expr {
1344+
ret @respan(sp, ast.expr_check_expr(x, a));
13431345
}
13441346

13451347
fn identity_fold_expr_port[ENV](&ENV e, &span sp, ann a) -> @expr {
@@ -1621,15 +1623,15 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
16211623
fold_expr_index = bind identity_fold_expr_index[ENV](_,_,_,_,_),
16221624
fold_expr_path = bind identity_fold_expr_path[ENV](_,_,_,_,_),
16231625
fold_expr_ext = bind identity_fold_expr_ext[ENV](_,_,_,_,_,_,_),
1624-
fold_expr_fail = bind identity_fold_expr_fail[ENV](_,_),
1625-
fold_expr_break = bind identity_fold_expr_break[ENV](_,_),
1626-
fold_expr_cont = bind identity_fold_expr_cont[ENV](_,_),
1627-
fold_expr_ret = bind identity_fold_expr_ret[ENV](_,_,_),
1628-
fold_expr_put = bind identity_fold_expr_put[ENV](_,_,_),
1629-
fold_expr_be = bind identity_fold_expr_be[ENV](_,_,_),
1630-
fold_expr_log = bind identity_fold_expr_log[ENV](_,_,_),
1626+
fold_expr_fail = bind identity_fold_expr_fail[ENV](_,_,_),
1627+
fold_expr_break = bind identity_fold_expr_break[ENV](_,_,_),
1628+
fold_expr_cont = bind identity_fold_expr_cont[ENV](_,_,_),
1629+
fold_expr_ret = bind identity_fold_expr_ret[ENV](_,_,_,_),
1630+
fold_expr_put = bind identity_fold_expr_put[ENV](_,_,_,_),
1631+
fold_expr_be = bind identity_fold_expr_be[ENV](_,_,_,_),
1632+
fold_expr_log = bind identity_fold_expr_log[ENV](_,_,_,_),
16311633
fold_expr_check_expr
1632-
= bind identity_fold_expr_check_expr[ENV](_,_,_),
1634+
= bind identity_fold_expr_check_expr[ENV](_,_,_,_),
16331635
fold_expr_port = bind identity_fold_expr_port[ENV](_,_,_),
16341636
fold_expr_chan = bind identity_fold_expr_chan[ENV](_,_,_,_),
16351637

0 commit comments

Comments
 (0)