aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-11-29 14:18:26 -0800
committerGraydon Hoare <[email protected]>2010-11-29 14:18:26 -0800
commit386f363cfea72899fa3c3f2a194d00819cdbe806 (patch)
tree824eda78ba43562d964a78c62aa7e0c6d58873e8 /src
parentAdd ast.ty_mutable. (diff)
downloadrust-386f363cfea72899fa3c3f2a194d00819cdbe806.tar.xz
rust-386f363cfea72899fa3c3f2a194d00819cdbe806.zip
Change from bool to tag ast.mutability.
Diffstat (limited to 'src')
-rw-r--r--src/comp/front/ast.rs9
-rw-r--r--src/comp/front/parser.rs30
-rw-r--r--src/comp/middle/fold.rs24
-rw-r--r--src/comp/middle/trans.rs8
-rw-r--r--src/comp/middle/typeck.rs43
5 files changed, 65 insertions, 49 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index a177f301..5e34d481 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -48,6 +48,11 @@ tag pat_ {
pat_tag(ident, vec[@pat], ann);
}
+tag mutability {
+ mut;
+ imm;
+}
+
tag binop {
add;
sub;
@@ -105,7 +110,7 @@ type arm = rec(@pat pat, block block);
type expr = spanned[expr_];
tag expr_ {
expr_vec(vec[@expr], ann);
- expr_tup(vec[tup(bool /* mutability */, @expr)], ann);
+ expr_tup(vec[tup(mutability, @expr)], ann);
expr_rec(vec[tup(ident,@expr)], ann);
expr_call(@expr, vec[@expr], ann);
expr_binary(binop, @expr, @expr, ann);
@@ -147,7 +152,7 @@ tag ty_ {
ty_str;
ty_box(@ty);
ty_vec(@ty);
- ty_tup(vec[tup(bool /* mutability */, @ty)]);
+ ty_tup(vec[tup(mutability, @ty)]);
ty_fn(vec[rec(mode mode, @ty ty)], @ty); // TODO: effect
ty_path(path, option.t[def]);
ty_mutable(@ty);
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index ab0f795d..e88760f6 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -96,13 +96,14 @@ impure fn parse_ident(parser p) -> ast.ident {
}
}
-impure fn parse_possibly_mutable_ty(parser p) -> tup(bool, @ast.ty) {
+impure fn parse_possibly_mutable_ty(parser p)
+ -> tup(ast.mutability, @ast.ty) {
auto mut;
if (p.peek() == token.MUTABLE) {
p.bump();
- mut = true;
+ mut = ast.mut;
} else {
- mut = false;
+ mut = ast.imm;
}
ret tup(mut, parse_ty(p));
@@ -192,8 +193,10 @@ impure fn parse_ty(parser p) -> @ast.ty {
case (token.TUP) {
p.bump();
auto f = parse_possibly_mutable_ty; // FIXME: trans_const_lval bug
- auto elems = parse_seq[tup(bool, @ast.ty)](token.LPAREN,
- token.RPAREN, some(token.COMMA), f, p);
+ auto elems =
+ parse_seq[tup(ast.mutability, @ast.ty)]
+ (token.LPAREN,
+ token.RPAREN, some(token.COMMA), f, p);
hi = p.get_span();
t = ast.ty_tup(elems.node);
}
@@ -346,13 +349,14 @@ impure fn parse_name(parser p, ast.ident id) -> ast.name {
ret spanned(lo, tys.span, rec(ident=id, types=tys.node));
}
-impure fn parse_possibly_mutable_expr(parser p) -> tup(bool, @ast.expr) {
+impure fn parse_possibly_mutable_expr(parser p)
+ -> tup(ast.mutability, @ast.expr) {
auto mut;
if (p.peek() == token.MUTABLE) {
p.bump();
- mut = true;
+ mut = ast.mut;
} else {
- mut = false;
+ mut = ast.imm;
}
ret tup(mut, parse_expr(p));
@@ -409,10 +413,12 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
case (token.TUP) {
p.bump();
auto pf = parse_possibly_mutable_expr;
- auto es = parse_seq[tup(bool, @ast.expr)](token.LPAREN,
- token.RPAREN,
- some(token.COMMA),
- pf, p);
+ auto es =
+ parse_seq[tup(ast.mutability, @ast.expr)]
+ (token.LPAREN,
+ token.RPAREN,
+ some(token.COMMA),
+ pf, p);
hi = es.span;
ex = ast.expr_tup(es.node, ast.ann_none);
}
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 1caaa00e..7b647380 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -13,6 +13,7 @@ import front.ast;
import front.ast.ident;
import front.ast.name;
import front.ast.path;
+import front.ast.mutability;
import front.ast.ty;
import front.ast.expr;
import front.ast.stmt;
@@ -46,7 +47,7 @@ type ast_fold[ENV] =
(fn(&ENV e, &span sp, @ty t) -> @ty) fold_ty_vec,
(fn(&ENV e, &span sp,
- vec[tup(bool, @ty)] elts) -> @ty) fold_ty_tup,
+ vec[tup(mutability, @ty)] elts) -> @ty) fold_ty_tup,
(fn(&ENV e, &span sp,
vec[rec(ast.mode mode, @ty ty)] inputs,
@@ -62,7 +63,7 @@ type ast_fold[ENV] =
vec[@expr] es, ann a) -> @expr) fold_expr_vec,
(fn(&ENV e, &span sp,
- vec[tup(bool,@expr)] es,
+ vec[tup(mutability,@expr)] es,
ann a) -> @expr) fold_expr_tup,
(fn(&ENV e, &span sp,
@@ -245,8 +246,8 @@ fn fold_ty[ENV](&ENV env, ast_fold[ENV] fld, @ty t) -> @ty {
}
case (ast.ty_tup(?elts)) {
- let vec[tup(bool, @ty)] elts_ = vec();
- for (tup(bool, @ty) elt in elts) {
+ let vec[tup(mutability, @ty)] elts_ = vec();
+ for (tup(mutability, @ty) elt in elts) {
elts_ += tup(elt._0, fold_ty(env, fld, elt._1));
}
ret fld.fold_ty_tup(env_, t.span, elts);
@@ -335,8 +336,8 @@ fn fold_exprs[ENV](&ENV env, ast_fold[ENV] fld, vec[@expr] es) -> vec[@expr] {
ret exprs;
}
-fn fold_tup_entry[ENV](&ENV env, ast_fold[ENV] fld, &tup(bool,@expr) e)
- -> tup(bool,@expr) {
+fn fold_tup_entry[ENV](&ENV env, ast_fold[ENV] fld,
+ &tup(mutability,@expr) e) -> tup(mutability,@expr) {
ret tup(e._0, fold_expr(env, fld, e._1));
}
@@ -360,8 +361,8 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
}
case (ast.expr_tup(?es, ?t)) {
- let vec[tup(bool,@expr)] entries = vec();
- for (tup(bool,@expr) entry in es) {
+ let vec[tup(mutability,@expr)] entries = vec();
+ for (tup(mutability,@expr) entry in es) {
entries += fold_tup_entry[ENV](env, fld, entry);
}
ret fld.fold_expr_tup(env_, e.span, entries, t);
@@ -650,8 +651,8 @@ fn identity_fold_ty_vec[ENV](&ENV env, &span sp, @ty t) -> @ty {
ret @respan(sp, ast.ty_vec(t));
}
-fn identity_fold_ty_tup[ENV](&ENV env, &span sp, vec[tup(bool,@ty)] elts)
- -> @ty {
+fn identity_fold_ty_tup[ENV](&ENV env, &span sp,
+ vec[tup(mutability,@ty)] elts) -> @ty {
ret @respan(sp, ast.ty_tup(elts));
}
@@ -678,7 +679,8 @@ fn identity_fold_expr_vec[ENV](&ENV env, &span sp, vec[@expr] es,
ret @respan(sp, ast.expr_vec(es, a));
}
-fn identity_fold_expr_tup[ENV](&ENV env, &span sp, vec[tup(bool, @expr)] es,
+fn identity_fold_expr_tup[ENV](&ENV env, &span sp,
+ vec[tup(mutability, @expr)] es,
ann a) -> @expr {
ret @respan(sp, ast.expr_tup(es, a));
}
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 2f078f04..01e73a6e 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -275,7 +275,7 @@ fn type_of_inner(@crate_ctxt cx, @typeck.ty t) -> TypeRef {
}
case (typeck.ty_tup(?elts)) {
let vec[TypeRef] tys = vec();
- for (tup(bool, @typeck.ty) elt in elts) {
+ for (tup(ast.mutability, @typeck.ty) elt in elts) {
tys += type_of(cx, elt._1);
}
ret T_struct(tys);
@@ -493,7 +493,7 @@ fn iter_structural_ty(@block_ctxt cx,
alt (t.struct) {
case (typeck.ty_tup(?args)) {
let int i = 0;
- for (tup(bool, @typeck.ty) arg in args) {
+ for (tup(ast.mutability, @typeck.ty) arg in args) {
auto elt = r.bcx.build.GEP(v, vec(C_int(0), C_int(i)));
r = f(r.bcx, elt, arg._1);
i += 1;
@@ -1184,13 +1184,13 @@ impure fn trans_call(@block_ctxt cx, @ast.expr f,
args_res._0.build.FastCall(f_res._0.val, args_res._1));
}
-impure fn trans_tup(@block_ctxt cx, vec[tup(bool, @ast.expr)] args,
+impure fn trans_tup(@block_ctxt cx, vec[tup(ast.mutability, @ast.expr)] args,
&ast.ann ann) -> result {
auto ty = node_type(cx.fcx.ccx, ann);
auto tup_val = cx.build.Alloca(ty);
let int i = 0;
auto r = res(cx, C_nil());
- for (tup(bool, @ast.expr) arg in args) {
+ for (tup(ast.mutability, @ast.expr) arg in args) {
auto t = typeck.expr_ty(arg._1);
auto src_res = trans_expr(r.bcx, arg._1);
auto dst_elt = r.bcx.build.GEP(tup_val, vec(C_int(0), C_int(i)));
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 0fd72d9e..31917959 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -1,5 +1,6 @@
import front.ast;
import front.ast.ann;
+import front.ast.mutability;
import middle.fold;
import driver.session;
import util.common;
@@ -28,7 +29,7 @@ type arg = rec(ast.mode mode, @ty ty);
// NB: If you change this, you'll probably want to change the corresponding
// AST structure in front/ast.rs as well.
-type ty = rec(sty struct, bool mut, option.t[str] cname);
+type ty = rec(sty struct, mutability mut, option.t[str] cname);
tag sty {
ty_nil;
ty_bool;
@@ -39,7 +40,7 @@ tag sty {
ty_str;
ty_box(@ty);
ty_vec(@ty);
- ty_tup(vec[tup(bool /* mutability */, @ty)]);
+ ty_tup(vec[tup(mutability, @ty)]);
ty_fn(vec[arg], @ty); // TODO: effect
ty_var(int); // ephemeral type var
ty_local(ast.def_id); // type of a local var
@@ -65,9 +66,9 @@ type ty_getter = fn(ast.def_id) -> @ty;
// Error-reporting utility functions
fn ast_ty_to_str(&@ast.ty ty) -> str {
- fn ast_tup_elem_to_str(&tup(bool, @ast.ty) elem) -> str {
+ fn ast_tup_elem_to_str(&tup(mutability, @ast.ty) elem) -> str {
auto s;
- if (elem._0) {
+ if (elem._0 == ast.mut) {
s = "mutable ";
} else {
s = "";
@@ -102,7 +103,9 @@ fn ast_ty_to_str(&@ast.ty ty) -> str {
case (ast.ty_tup(?elems)) {
auto f = ast_tup_elem_to_str;
s = "tup(";
- s += _str.connect(_vec.map[tup(bool,@ast.ty),str](f, elems), ",");
+ s +=
+ _str.connect(_vec.map[tup(mutability,@ast.ty),str](f, elems),
+ ",");
s += ")";
}
@@ -151,9 +154,9 @@ fn path_to_str(&ast.path path) -> str {
}
fn ty_to_str(@ty typ) -> str {
- fn tup_elem_to_str(&tup(bool, @ty) elem) -> str {
+ fn tup_elem_to_str(&tup(mutability, @ty) elem) -> str {
auto s;
- if (elem._0) {
+ if (elem._0 == ast.mut) {
s = "mutable ";
} else {
s = "";
@@ -187,7 +190,7 @@ fn ty_to_str(@ty typ) -> str {
case (ty_tup(?elems)) {
auto f = tup_elem_to_str;
- auto strs = _vec.map[tup(bool,@ty),str](f, elems);
+ auto strs = _vec.map[tup(mutability,@ty),str](f, elems);
s = "tup(" + _str.connect(strs, ",") + ")";
}
@@ -217,7 +220,7 @@ fn ast_ty_to_ty(ty_getter getter, &@ast.ty ast_ty) -> @ty {
ret rec(mode=arg.mode, ty=ast_ty_to_ty(getter, arg.ty));
}
- auto mut = false;
+ auto mut = ast.imm;
auto sty;
auto cname = none[str];
alt (ast_ty.node) {
@@ -231,8 +234,8 @@ fn ast_ty_to_ty(ty_getter getter, &@ast.ty ast_ty) -> @ty {
case (ast.ty_box(?t)) { sty = ty_box(ast_ty_to_ty(getter, t)); }
case (ast.ty_vec(?t)) { sty = ty_vec(ast_ty_to_ty(getter, t)); }
case (ast.ty_tup(?fields)) {
- let vec[tup(bool,@ty)] flds = vec();
- for (tup(bool, @ast.ty) field in fields) {
+ let vec[tup(mutability,@ty)] flds = vec();
+ for (tup(mutability, @ast.ty) field in fields) {
flds += tup(field._0, ast_ty_to_ty(getter, field._1));
}
sty = ty_tup(flds);
@@ -258,7 +261,7 @@ fn ast_ty_to_ty(ty_getter getter, &@ast.ty ast_ty) -> @ty {
}
case (ast.ty_mutable(?t)) {
- mut = true;
+ mut = ast.mut;
auto t0 = ast_ty_to_ty(getter, t);
sty = t0.struct;
cname = t0.cname;
@@ -534,7 +537,7 @@ fn type_is_signed(@ty t) -> bool {
}
fn plain_ty(&sty st) -> @ty {
- ret @rec(struct=st, mut=false, cname=none[str]);
+ ret @rec(struct=st, mut=ast.imm, cname=none[str]);
}
fn ann_to_type(&ast.ann ann) -> @ty {
@@ -708,9 +711,9 @@ fn unify(&fn_ctxt fcx, @ty expected, @ty actual) -> unify_result {
alt (actual.struct) {
case (ty_tup(?actual_elems)) {
auto expected_len =
- _vec.len[tup(bool,@ty)](expected_elems);
+ _vec.len[tup(mutability,@ty)](expected_elems);
auto actual_len =
- _vec.len[tup(bool,@ty)](actual_elems);
+ _vec.len[tup(mutability,@ty)](actual_elems);
if (expected_len != actual_len) {
auto err = terr_tuple_size(expected_len,
actual_len);
@@ -719,7 +722,7 @@ fn unify(&fn_ctxt fcx, @ty expected, @ty actual) -> unify_result {
// TODO: implement an iterator that can iterate over
// two arrays simultaneously.
- let vec[tup(bool, @ty)] result_elems = vec();
+ let vec[tup(mutability, @ty)] result_elems = vec();
auto i = 0u;
while (i < expected_len) {
auto expected_elem = expected_elems.(i);
@@ -1254,10 +1257,10 @@ fn check_expr(&fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
}
case (ast.expr_tup(?args, _)) {
- let vec[tup(bool, @ast.expr)] args_1 = vec();
- let vec[tup(bool, @ty)] args_t = vec();
+ let vec[tup(mutability, @ast.expr)] args_1 = vec();
+ let vec[tup(mutability, @ty)] args_t = vec();
- for (tup(bool, @ast.expr) arg in args) {
+ for (tup(mutability, @ast.expr) arg in args) {
auto expr_1 = check_expr(fcx, arg._1);
args_1 += tup(arg._0, expr_1);
args_t += tup(arg._0, expr_ty(expr_1));
@@ -1275,7 +1278,7 @@ fn check_expr(&fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
case (ty_tup(?args)) {
let uint ix = field_num(fcx.ccx.sess,
expr.span, field);
- if (ix >= _vec.len[tup(bool,@ty)](args)) {
+ if (ix >= _vec.len[tup(mutability,@ty)](args)) {
fcx.ccx.sess.span_err(expr.span,
"bad index on tuple");
}