diff options
| author | Marijn Haverbeke <[email protected]> | 2011-04-08 18:44:20 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <[email protected]> | 2011-04-09 01:05:18 +0200 |
| commit | 1af3174fe3b565371a5978381f604ea9c01e86d3 (patch) | |
| tree | 1690b133b0690fdf6a2c005528355c2d00313129 /src/comp/front/eval.rs | |
| parent | Make lexer buffer the whole file (diff) | |
| download | rust-1af3174fe3b565371a5978381f604ea9c01e86d3.tar.xz rust-1af3174fe3b565371a5978381f604ea9c01e86d3.zip | |
Move to single-uint file-position representation.
This makes passing them around cheaper. There is now a table (see
front/codemap.rs) that is needed to transform such an uint into an
actual filename/line/col location.
Also cleans up the span building in the parser a bit.
Diffstat (limited to 'src/comp/front/eval.rs')
| -rw-r--r-- | src/comp/front/eval.rs | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/src/comp/front/eval.rs b/src/comp/front/eval.rs index 1cd4dd49..ca350c36 100644 --- a/src/comp/front/eval.rs +++ b/src/comp/front/eval.rs @@ -25,6 +25,9 @@ tag val { } type env = vec[tup(ident, val)]; +type ctx = @rec(parser p, + session.session sess, + mutable uint chpos); fn mk_env() -> env { let env e = vec(); @@ -89,50 +92,50 @@ fn lookup(session.session sess, env e, span sp, ident i) -> val { fail; } -fn eval_lit(session.session sess, env e, span sp, @ast.lit lit) -> val { +fn eval_lit(ctx cx, span sp, @ast.lit lit) -> val { alt (lit.node) { case (ast.lit_bool(?b)) { ret val_bool(b); } case (ast.lit_int(?i)) { ret val_int(i); } case (ast.lit_str(?s)) { ret val_str(s); } case (_) { - sess.span_err(sp, "evaluating unsupported literal"); + cx.sess.span_err(sp, "evaluating unsupported literal"); } } fail; } -fn eval_expr(session.session sess, env e, @ast.expr x) -> val { +fn eval_expr(ctx cx, env e, @ast.expr x) -> val { alt (x.node) { case (ast.expr_path(?pth, _, _)) { if (_vec.len[ident](pth.node.idents) == 1u && _vec.len[@ast.ty](pth.node.types) == 0u) { - ret lookup(sess, e, x.span, pth.node.idents.(0)); + ret lookup(cx.sess, e, x.span, pth.node.idents.(0)); } - sess.span_err(x.span, "evaluating structured path-name"); + cx.sess.span_err(x.span, "evaluating structured path-name"); } case (ast.expr_lit(?lit, _)) { - ret eval_lit(sess, e, x.span, lit); + ret eval_lit(cx, x.span, lit); } case (ast.expr_unary(?op, ?a, _)) { - auto av = eval_expr(sess, e, a); + auto av = eval_expr(cx, e, a); alt (op) { case (ast.not) { if (val_is_bool(av)) { ret val_bool(!val_as_bool(av)); } - sess.span_err(x.span, "bad types in '!' expression"); + cx.sess.span_err(x.span, "bad types in '!' expression"); } case (_) { - sess.span_err(x.span, "evaluating unsupported unop"); + cx.sess.span_err(x.span, "evaluating unsupported unop"); } } } case (ast.expr_binary(?op, ?a, ?b, _)) { - auto av = eval_expr(sess, e, a); - auto bv = eval_expr(sess, e, b); + auto av = eval_expr(cx, e, a); + auto bv = eval_expr(cx, e, b); alt (op) { case (ast.add) { if (val_is_int(av) && val_is_int(bv)) { @@ -141,66 +144,66 @@ fn eval_expr(session.session sess, env e, @ast.expr x) -> val { if (val_is_str(av) && val_is_str(bv)) { ret val_str(val_as_str(av) + val_as_str(bv)); } - sess.span_err(x.span, "bad types in '+' expression"); + cx.sess.span_err(x.span, "bad types in '+' expression"); } case (ast.sub) { if (val_is_int(av) && val_is_int(bv)) { ret val_int(val_as_int(av) - val_as_int(bv)); } - sess.span_err(x.span, "bad types in '-' expression"); + cx.sess.span_err(x.span, "bad types in '-' expression"); } case (ast.mul) { if (val_is_int(av) && val_is_int(bv)) { ret val_int(val_as_int(av) * val_as_int(bv)); } - sess.span_err(x.span, "bad types in '*' expression"); + cx.sess.span_err(x.span, "bad types in '*' expression"); } case (ast.div) { if (val_is_int(av) && val_is_int(bv)) { ret val_int(val_as_int(av) / val_as_int(bv)); } - sess.span_err(x.span, "bad types in '/' expression"); + cx.sess.span_err(x.span, "bad types in '/' expression"); } case (ast.rem) { if (val_is_int(av) && val_is_int(bv)) { ret val_int(val_as_int(av) % val_as_int(bv)); } - sess.span_err(x.span, "bad types in '%' expression"); + cx.sess.span_err(x.span, "bad types in '%' expression"); } case (ast.and) { if (val_is_bool(av) && val_is_bool(bv)) { ret val_bool(val_as_bool(av) && val_as_bool(bv)); } - sess.span_err(x.span, "bad types in '&&' expression"); + cx.sess.span_err(x.span, "bad types in '&&' expression"); } case (ast.or) { if (val_is_bool(av) && val_is_bool(bv)) { ret val_bool(val_as_bool(av) || val_as_bool(bv)); } - sess.span_err(x.span, "bad types in '||' expression"); + cx.sess.span_err(x.span, "bad types in '||' expression"); } case (ast.eq) { - ret val_bool(val_eq(sess, x.span, av, bv)); + ret val_bool(val_eq(cx.sess, x.span, av, bv)); } case (ast.ne) { - ret val_bool(! val_eq(sess, x.span, av, bv)); + ret val_bool(! val_eq(cx.sess, x.span, av, bv)); } case (_) { - sess.span_err(x.span, "evaluating unsupported binop"); + cx.sess.span_err(x.span, "evaluating unsupported binop"); } } } case (_) { - sess.span_err(x.span, "evaluating unsupported expression"); + cx.sess.span_err(x.span, "evaluating unsupported expression"); } } fail; @@ -221,7 +224,7 @@ fn val_eq(session.session sess, span sp, val av, val bv) -> bool { fail; } -impure fn eval_crate_directives(parser p, +impure fn eval_crate_directives(ctx cx, env e, vec[@ast.crate_directive] cdirs, str prefix, @@ -231,28 +234,27 @@ impure fn eval_crate_directives(parser p, ast.mod_index_entry] index) { for (@ast.crate_directive sub_cdir in cdirs) { - eval_crate_directive(p, e, sub_cdir, prefix, + eval_crate_directive(cx, e, sub_cdir, prefix, view_items, items, index); } } -impure fn eval_crate_directives_to_mod(parser p, - env e, +impure fn eval_crate_directives_to_mod(ctx cx, env e, vec[@ast.crate_directive] cdirs, str prefix) -> ast._mod { let vec[@ast.view_item] view_items = vec(); let vec[@ast.item] items = vec(); auto index = new_str_hash[ast.mod_index_entry](); - eval_crate_directives(p, e, cdirs, prefix, + eval_crate_directives(cx, e, cdirs, prefix, view_items, items, index); ret rec(view_items=view_items, items=items, index=index); } -impure fn eval_crate_directive_block(parser p, +impure fn eval_crate_directive_block(ctx cx, env e, &ast.block blk, str prefix, @@ -264,19 +266,18 @@ impure fn eval_crate_directive_block(parser p, for (@ast.stmt s in blk.node.stmts) { alt (s.node) { case (ast.stmt_crate_directive(?cdir)) { - eval_crate_directive(p, e, cdir, prefix, + eval_crate_directive(cx, e, cdir, prefix, view_items, items, index); } case (_) { - auto sess = p.get_session(); - sess.span_err(s.span, - "unsupported stmt in crate-directive block"); + cx.sess.span_err(s.span, + "unsupported stmt in crate-directive block"); } } } } -impure fn eval_crate_directive_expr(parser p, +impure fn eval_crate_directive_expr(ctx cx, env e, @ast.expr x, str prefix, @@ -284,25 +285,23 @@ impure fn eval_crate_directive_expr(parser p, &mutable vec[@ast.item] items, hashmap[ast.ident, ast.mod_index_entry] index) { - auto sess = p.get_session(); - alt (x.node) { case (ast.expr_if(?cond, ?thn, ?elopt, _)) { - auto cv = eval_expr(sess, e, cond); + auto cv = eval_expr(cx, e, cond); if (!val_is_bool(cv)) { - sess.span_err(x.span, "bad cond type in 'if'"); + cx.sess.span_err(x.span, "bad cond type in 'if'"); } if (val_as_bool(cv)) { - ret eval_crate_directive_block(p, e, thn, prefix, + ret eval_crate_directive_block(cx, e, thn, prefix, view_items, items, index); } alt (elopt) { case (some[@ast.expr](?els)) { - ret eval_crate_directive_expr(p, e, els, prefix, + ret eval_crate_directive_expr(cx, e, els, prefix, view_items, items, index); } @@ -313,45 +312,44 @@ impure fn eval_crate_directive_expr(parser p, } case (ast.expr_alt(?v, ?arms, _)) { - auto vv = eval_expr(sess, e, v); + auto vv = eval_expr(cx, e, v); for (ast.arm arm in arms) { alt (arm.pat.node) { case (ast.pat_lit(?lit, _)) { - auto pv = eval_lit(sess, e, - arm.pat.span, lit); - if (val_eq(sess, arm.pat.span, vv, pv)) { + auto pv = eval_lit(cx, arm.pat.span, lit); + if (val_eq(cx.sess, arm.pat.span, vv, pv)) { ret eval_crate_directive_block - (p, e, arm.block, prefix, + (cx, e, arm.block, prefix, view_items, items, index); } } case (ast.pat_wild(_)) { ret eval_crate_directive_block - (p, e, arm.block, prefix, + (cx, e, arm.block, prefix, view_items, items, index); } case (_) { - sess.span_err(arm.pat.span, - "bad pattern type in 'alt'"); + cx.sess.span_err(arm.pat.span, + "bad pattern type in 'alt'"); } } } - sess.span_err(x.span, "no cases matched in 'alt'"); + cx.sess.span_err(x.span, "no cases matched in 'alt'"); } case (ast.expr_block(?block, _)) { - ret eval_crate_directive_block(p, e, block, prefix, + ret eval_crate_directive_block(cx, e, block, prefix, view_items, items, index); } case (_) { - sess.span_err(x.span, "unsupported expr type"); + cx.sess.span_err(x.span, "unsupported expr type"); } } } -impure fn eval_crate_directive(parser p, +impure fn eval_crate_directive(ctx cx, env e, @ast.crate_directive cdir, str prefix, @@ -362,14 +360,14 @@ impure fn eval_crate_directive(parser p, alt (cdir.node) { case (ast.cdir_let(?id, ?x, ?cdirs)) { - auto v = eval_expr(p.get_session(), e, x); + auto v = eval_expr(cx, e, x); auto e0 = vec(tup(id, v)) + e; - eval_crate_directives(p, e0, cdirs, prefix, + eval_crate_directives(cx, e0, cdirs, prefix, view_items, items, index); } case (ast.cdir_expr(?x)) { - eval_crate_directive_expr(p, e, x, prefix, + eval_crate_directive_expr(cx, e, x, prefix, view_items, items, index); } @@ -385,13 +383,15 @@ impure fn eval_crate_directive(parser p, auto full_path = prefix + std.fs.path_sep() + file_path; - auto start_id = p.next_def_id(); - auto p0 = new_parser(p.get_session(), e, start_id, full_path); + auto start_id = cx.p.next_def_id(); + auto p0 = new_parser(cx.sess, e, start_id, full_path, cx.chpos); auto m0 = parse_mod_items(p0, token.EOF); auto next_id = p0.next_def_id(); - p.set_def(next_id._1); + // Thread defids and chpos through the parsers + cx.p.set_def(next_id._1); + cx.chpos = p0.get_chpos(); auto im = ast.item_mod(id, m0, next_id); - auto i = @spanned(cdir.span, cdir.span, im); + auto i = @spanned(cdir.span.lo, cdir.span.hi, im); ast.index_item(index, i); _vec.push[@ast.item](items, i); } @@ -407,9 +407,9 @@ impure fn eval_crate_directive(parser p, } auto full_path = prefix + std.fs.path_sep() + path; - auto m0 = eval_crate_directives_to_mod(p, e, cdirs, full_path); - auto im = ast.item_mod(id, m0, p.next_def_id()); - auto i = @spanned(cdir.span, cdir.span, im); + auto m0 = eval_crate_directives_to_mod(cx, e, cdirs, full_path); + auto im = ast.item_mod(id, m0, cx.p.next_def_id()); + auto i = @spanned(cdir.span.lo, cdir.span.hi, im); ast.index_item(index, i); _vec.push[@ast.item](items, i); } |