Skip to content

Commit 268f192

Browse files
committed
---
yaml --- r: 1011 b: refs/heads/master c: 0c19c8e h: refs/heads/master i: 1009: 38769c0 1007: 2b42d1a v: v3
1 parent 6b1efd4 commit 268f192

File tree

5 files changed

+78
-16
lines changed

5 files changed

+78
-16
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: afd3af9bb58f19323c584417d359d83742ba889f
2+
refs/heads/master: 0c19c8e18f5e145c379fe4b50e5ea8d44fe4969f

trunk/src/comp/front/ast.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ tag mutability {
5555
imm;
5656
}
5757

58+
tag layer {
59+
layer_value;
60+
layer_state;
61+
layer_gc;
62+
}
63+
64+
tag effect {
65+
eff_pure;
66+
eff_impure;
67+
eff_unsafe;
68+
}
69+
5870
tag binop {
5971
add;
6072
sub;
@@ -85,6 +97,11 @@ tag unop {
8597
neg;
8698
}
8799

100+
tag mode {
101+
val;
102+
alias;
103+
}
104+
88105
type stmt = spanned[stmt_];
89106
tag stmt_ {
90107
stmt_decl(@decl);
@@ -146,7 +163,9 @@ tag lit_ {
146163

147164
// NB: If you change this, you'll probably want to change the corresponding
148165
// type structure in middle/typeck.rs as well.
166+
149167
type ty_field = rec(ident ident, @ty ty);
168+
type ty_arg = rec(mode mode, @ty ty);
150169
type ty = spanned[ty_];
151170
tag ty_ {
152171
ty_nil;
@@ -160,18 +179,14 @@ tag ty_ {
160179
ty_vec(@ty);
161180
ty_tup(vec[@ty]);
162181
ty_rec(vec[ty_field]);
163-
ty_fn(vec[rec(mode mode, @ty ty)], @ty); // TODO: effect
182+
ty_fn(vec[ty_arg], @ty); // TODO: effect
164183
ty_path(path, option.t[def]);
165184
ty_mutable(@ty);
166185
}
167186

168-
tag mode {
169-
val;
170-
alias;
171-
}
172-
173187
type arg = rec(mode mode, @ty ty, ident ident, def_id id);
174-
type _fn = rec(vec[arg] inputs,
188+
type _fn = rec(effect effect,
189+
vec[arg] inputs,
175190
@ty output,
176191
block body);
177192

trunk/src/comp/front/parser.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ impure fn parse_ty_params(parser p) -> vec[ast.ty_param] {
11611161
ret ty_params;
11621162
}
11631163

1164-
impure fn parse_item_fn(parser p) -> @ast.item {
1164+
impure fn parse_item_fn(parser p, ast.effect eff) -> @ast.item {
11651165
auto lo = p.get_span();
11661166
expect(p, token.FN);
11671167
auto id = parse_ident(p);
@@ -1187,7 +1187,8 @@ impure fn parse_item_fn(parser p) -> @ast.item {
11871187

11881188
auto body = parse_block(p);
11891189

1190-
let ast._fn f = rec(inputs = inputs.node,
1190+
let ast._fn f = rec(effect = eff,
1191+
inputs = inputs.node,
11911192
output = output,
11921193
body = body);
11931194

@@ -1305,18 +1306,61 @@ impure fn parse_item_tag(parser p) -> @ast.item {
13051306
ret @spanned(lo, hi, item);
13061307
}
13071308

1309+
impure fn parse_layer(parser p) -> ast.layer {
1310+
alt (p.peek()) {
1311+
case (token.STATE) {
1312+
p.bump();
1313+
ret ast.layer_state;
1314+
}
1315+
case (token.GC) {
1316+
p.bump();
1317+
ret ast.layer_gc;
1318+
}
1319+
case (_) {
1320+
ret ast.layer_value;
1321+
}
1322+
}
1323+
fail;
1324+
}
1325+
1326+
1327+
impure fn parse_effect(parser p) -> ast.effect {
1328+
alt (p.peek()) {
1329+
case (token.IMPURE) {
1330+
p.bump();
1331+
ret ast.eff_impure;
1332+
}
1333+
case (token.UNSAFE) {
1334+
p.bump();
1335+
ret ast.eff_unsafe;
1336+
}
1337+
case (_) {
1338+
ret ast.eff_pure;
1339+
}
1340+
}
1341+
fail;
1342+
}
1343+
13081344
impure fn parse_item(parser p) -> @ast.item {
1345+
let ast.effect eff = parse_effect(p);
1346+
let ast.layer lyr = parse_layer(p);
1347+
13091348
alt (p.peek()) {
13101349
case (token.FN) {
1311-
ret parse_item_fn(p);
1350+
check (lyr == ast.layer_value);
1351+
ret parse_item_fn(p, eff);
13121352
}
13131353
case (token.MOD) {
1354+
check (eff == ast.eff_pure);
1355+
check (lyr == ast.layer_value);
13141356
ret parse_item_mod(p);
13151357
}
13161358
case (token.TYPE) {
1359+
check (eff == ast.eff_pure);
13171360
ret parse_item_type(p);
13181361
}
13191362
case (token.TAG) {
1363+
check (eff == ast.eff_pure);
13201364
ret parse_item_tag(p);
13211365
}
13221366
case (?t) {

trunk/src/comp/middle/fold.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ type ast_fold[ENV] =
185185
(fn(&ENV e, &span sp,
186186
&ast.block_) -> block) fold_block,
187187

188-
(fn(&ENV e, vec[arg] inputs,
188+
(fn(&ENV e, ast.effect effect,
189+
vec[arg] inputs,
189190
@ty output, &block body) -> ast._fn) fold_fn,
190191

191192
(fn(&ENV e, &ast._mod m) -> ast._mod) fold_mod,
@@ -570,7 +571,7 @@ fn fold_fn[ENV](&ENV env, ast_fold[ENV] fld, &ast._fn f) -> ast._fn {
570571
auto output = fold_ty[ENV](env, fld, f.output);
571572
auto body = fold_block[ENV](env, fld, f.body);
572573

573-
ret fld.fold_fn(env, inputs, output, body);
574+
ret fld.fold_fn(env, f.effect, inputs, output, body);
574575
}
575576

576577
fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item {
@@ -891,10 +892,11 @@ fn identity_fold_block[ENV](&ENV e, &span sp, &ast.block_ blk) -> block {
891892
}
892893

893894
fn identity_fold_fn[ENV](&ENV e,
895+
ast.effect effect,
894896
vec[arg] inputs,
895897
@ast.ty output,
896898
&block body) -> ast._fn {
897-
ret rec(inputs=inputs, output=output, body=body);
899+
ret rec(effect=effect, inputs=inputs, output=output, body=body);
898900
}
899901

900902
fn identity_fold_mod[ENV](&ENV e, &ast._mod m) -> ast._mod {
@@ -1007,7 +1009,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
10071009
fold_item_tag = bind identity_fold_item_tag[ENV](_,_,_,_,_,_),
10081010

10091011
fold_block = bind identity_fold_block[ENV](_,_,_),
1010-
fold_fn = bind identity_fold_fn[ENV](_,_,_,_),
1012+
fold_fn = bind identity_fold_fn[ENV](_,_,_,_,_),
10111013
fold_mod = bind identity_fold_mod[ENV](_,_),
10121014
fold_crate = bind identity_fold_crate[ENV](_,_,_),
10131015

trunk/src/comp/middle/typeck.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1643,7 +1643,8 @@ fn check_fn(&@crate_ctxt ccx, &span sp, ast.ident ident, &ast._fn f,
16431643
auto block_t = check_block(fcx, f.body);
16441644
auto block_wb = writeback(fcx, block_t);
16451645

1646-
auto fn_t = rec(inputs=f.inputs, output=f.output, body=block_wb);
1646+
auto fn_t = rec(effect=f.effect, inputs=f.inputs, output=f.output,
1647+
body=block_wb);
16471648
auto item = ast.item_fn(ident, fn_t, ty_params, id, fn_ann);
16481649
ret @fold.respan[ast.item_](sp, item);
16491650
}

0 commit comments

Comments
 (0)