Skip to content

Commit bca4572

Browse files
committed
Remove the environment concept from front::eval
This is the old method of conditional compilation. It is going away. Issue #489
1 parent 70a28dc commit bca4572

File tree

3 files changed

+51
-75
lines changed

3 files changed

+51
-75
lines changed

src/comp/driver/rustc.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import front::parser;
66
import front::token;
77
import front::eval;
88
import front::ast;
9+
import front::attr;
910
import middle::trans;
1011
import middle::resolve;
1112
import middle::ty;
@@ -35,22 +36,25 @@ import back::link::output_type;
3536

3637
tag pp_mode { ppm_normal; ppm_typed; ppm_identified; }
3738

38-
fn default_environment(session::session sess, str argv0, str input) ->
39-
eval::env {
39+
fn default_configuration(session::session sess, str argv0, str input) ->
40+
ast::crate_cfg {
4041
auto libc =
4142
alt (sess.get_targ_cfg().os) {
4243
case (session::os_win32) { "msvcrt.dll" }
4344
case (session::os_macos) { "libc.dylib" }
4445
case (session::os_linux) { "libc.so.6" }
4546
case (_) { "libc.so" }
4647
};
48+
49+
auto mk = attr::mk_name_value_item;
50+
4751
ret [ // Target bindings.
48-
tup("target_os", eval::val_str(std::os::target_os())),
49-
tup("target_arch", eval::val_str("x86")),
50-
tup("target_libc", eval::val_str(libc)),
52+
mk("target_os", std::os::target_os()),
53+
mk("target_arch", "x86"),
54+
mk("target_libc", libc),
5155
// Build bindings.
52-
tup("build_compiler", eval::val_str(argv0)),
53-
tup("build_input", eval::val_str(input))];
56+
mk("build_compiler", argv0),
57+
mk("build_input", input)];
5458
}
5559

5660
fn parse_input(session::session sess, parser::parser p, str input) ->
@@ -73,10 +77,10 @@ fn time[T](bool do_it, str what, fn() -> T thunk) -> T {
7377
ret rv;
7478
}
7579

76-
fn compile_input(session::session sess, eval::env env, str input,
80+
fn compile_input(session::session sess, ast::crate_cfg cfg, str input,
7781
str output) {
7882
auto time_passes = sess.get_opts().time_passes;
79-
auto p = parser::new_parser(sess, env, input, 0u, 0);
83+
auto p = parser::new_parser(sess, cfg, input, 0u, 0);
8084
auto crate =
8185
time(time_passes, "parsing", bind parse_input(sess, p, input));
8286
if (sess.get_opts().output_type == link::output_type_none) { ret; }
@@ -104,9 +108,9 @@ fn compile_input(session::session sess, eval::env env, str input,
104108
bind link::write::run_passes(sess, llmod, output));
105109
}
106110

107-
fn pretty_print_input(session::session sess, eval::env env, str input,
108-
pp_mode ppm) {
109-
auto p = front::parser::new_parser(sess, env, input, 0u, 0);
111+
fn pretty_print_input(session::session sess, ast::crate_cfg cfg,
112+
str input, pp_mode ppm) {
113+
auto p = front::parser::new_parser(sess, cfg, input, 0u, 0);
110114
auto crate = parse_input(sess, p, input);
111115
auto mode;
112116
alt (ppm) {
@@ -337,15 +341,15 @@ fn main(vec[str] args) {
337341
}
338342
auto ifile = match.free.(0);
339343
let str saved_out_filename = "";
340-
auto env = default_environment(sess, binary, ifile);
344+
auto cfg = default_configuration(sess, binary, ifile);
341345
auto pretty =
342346
option::map[str,
343347
pp_mode](bind parse_pretty(sess, _),
344348
getopts::opt_default(match, "pretty", "normal"));
345349
auto ls = opt_present(match, "ls");
346350
alt (pretty) {
347351
case (some[pp_mode](?ppm)) {
348-
pretty_print_input(sess, env, ifile, ppm);
352+
pretty_print_input(sess, cfg, ifile, ppm);
349353
ret;
350354
}
351355
case (none[pp_mode]) {/* continue */ }
@@ -371,7 +375,7 @@ fn main(vec[str] args) {
371375
case (link::output_type_exe) { parts += ["o"]; }
372376
}
373377
auto ofile = str::connect(parts, ".");
374-
compile_input(sess, env, ifile, ofile);
378+
compile_input(sess, cfg, ifile, ofile);
375379
}
376380
case (some(?ofile)) {
377381
// FIXME: what about windows? This will create a foo.exe.o.
@@ -386,7 +390,7 @@ fn main(vec[str] args) {
386390
}
387391
case (_) { temp_filename = ofile; }
388392
}
389-
compile_input(sess, env, ifile, temp_filename);
393+
compile_input(sess, cfg, ifile, temp_filename);
390394
}
391395
}
392396

src/comp/front/eval.rs

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,14 @@ tag val { val_bool(bool); val_int(int); val_str(str); }
2323

2424
tag eval_mode { mode_depend; mode_parse; }
2525

26-
type env = vec[tup(ident, val)];
27-
2826
type ctx =
2927
@rec(parser p,
3028
eval_mode mode,
3129
mutable vec[str] deps,
3230
session::session sess,
3331
mutable uint chpos,
34-
mutable int next_id);
35-
36-
fn mk_env() -> env { ret []; }
32+
mutable int next_id,
33+
ast::crate_cfg cfg);
3734

3835
fn val_is_bool(val v) -> bool {
3936
alt (v) { case (val_bool(_)) { true } case (_) { false } }
@@ -59,13 +56,6 @@ fn val_as_str(val v) -> str {
5956
alt (v) { case (val_str(?s)) { s } case (_) { fail } }
6057
}
6158

62-
fn lookup(session::session sess, env e, span sp, ident i) -> val {
63-
for (tup(ident, val) pair in e) {
64-
if (str::eq(i, pair._0)) { ret pair._1; }
65-
}
66-
sess.span_fatal(sp, "unknown variable: " + i)
67-
}
68-
6959
fn eval_lit(ctx cx, span sp, @ast::lit lit) -> val {
7060
alt (lit.node) {
7161
case (ast::lit_bool(?b)) { val_bool(b) }
@@ -75,18 +65,14 @@ fn eval_lit(ctx cx, span sp, @ast::lit lit) -> val {
7565
}
7666
}
7767

78-
fn eval_expr(ctx cx, env e, @ast::expr x) -> val {
68+
fn eval_expr(ctx cx, @ast::expr x) -> val {
7969
alt (x.node) {
8070
case (ast::expr_path(?pth)) {
81-
if (vec::len[ident](pth.node.idents) == 1u &&
82-
vec::len[@ast::ty](pth.node.types) == 0u) {
83-
ret lookup(cx.sess, e, x.span, pth.node.idents.(0));
84-
}
8571
cx.sess.span_fatal(x.span, "evaluating structured path-name");
8672
}
8773
case (ast::expr_lit(?lit)) { ret eval_lit(cx, x.span, lit); }
8874
case (ast::expr_unary(?op, ?a)) {
89-
auto av = eval_expr(cx, e, a);
75+
auto av = eval_expr(cx, a);
9076
alt (op) {
9177
case (ast::not) {
9278
if (val_is_bool(av)) { ret val_bool(!val_as_bool(av)); }
@@ -98,8 +84,8 @@ fn eval_expr(ctx cx, env e, @ast::expr x) -> val {
9884
}
9985
}
10086
case (ast::expr_binary(?op, ?a, ?b)) {
101-
auto av = eval_expr(cx, e, a);
102-
auto bv = eval_expr(cx, e, b);
87+
auto av = eval_expr(cx, a);
88+
auto bv = eval_expr(cx, b);
10389
alt (op) {
10490
case (ast::add) {
10591
if (val_is_int(av) && val_is_int(bv)) {
@@ -177,30 +163,30 @@ fn val_eq(session::session sess, span sp, val av, val bv) -> bool {
177163
} else { sess.span_fatal(sp, "bad types in comparison") }
178164
}
179165

180-
fn eval_crate_directives(ctx cx, env e, vec[@ast::crate_directive] cdirs,
166+
fn eval_crate_directives(ctx cx, vec[@ast::crate_directive] cdirs,
181167
str prefix, &mutable vec[@ast::view_item] view_items,
182168
&mutable vec[@ast::item] items) {
183169
for (@ast::crate_directive sub_cdir in cdirs) {
184-
eval_crate_directive(cx, e, sub_cdir, prefix, view_items, items);
170+
eval_crate_directive(cx, sub_cdir, prefix, view_items, items);
185171
}
186172
}
187173

188-
fn eval_crate_directives_to_mod(ctx cx, env e,
174+
fn eval_crate_directives_to_mod(ctx cx,
189175
vec[@ast::crate_directive] cdirs, str prefix)
190176
-> ast::_mod {
191177
let vec[@ast::view_item] view_items = [];
192178
let vec[@ast::item] items = [];
193-
eval_crate_directives(cx, e, cdirs, prefix, view_items, items);
179+
eval_crate_directives(cx, cdirs, prefix, view_items, items);
194180
ret rec(view_items=view_items, items=items);
195181
}
196182

197-
fn eval_crate_directive_block(ctx cx, env e, &ast::block blk, str prefix,
183+
fn eval_crate_directive_block(ctx cx, &ast::block blk, str prefix,
198184
&mutable vec[@ast::view_item] view_items,
199185
&mutable vec[@ast::item] items) {
200186
for (@ast::stmt s in blk.node.stmts) {
201187
alt (s.node) {
202188
case (ast::stmt_crate_directive(?cdir)) {
203-
eval_crate_directive(cx, e, cdir, prefix, view_items, items);
189+
eval_crate_directive(cx, cdir, prefix, view_items, items);
204190
}
205191
case (_) {
206192
cx.sess.span_fatal(s.span,
@@ -210,22 +196,22 @@ fn eval_crate_directive_block(ctx cx, env e, &ast::block blk, str prefix,
210196
}
211197
}
212198

213-
fn eval_crate_directive_expr(ctx cx, env e, @ast::expr x, str prefix,
199+
fn eval_crate_directive_expr(ctx cx, @ast::expr x, str prefix,
214200
&mutable vec[@ast::view_item] view_items,
215201
&mutable vec[@ast::item] items) {
216202
alt (x.node) {
217203
case (ast::expr_if(?cond, ?thn, ?elopt)) {
218-
auto cv = eval_expr(cx, e, cond);
204+
auto cv = eval_expr(cx, cond);
219205
if (!val_is_bool(cv)) {
220206
cx.sess.span_fatal(x.span, "bad cond type in 'if'");
221207
}
222208
if (val_as_bool(cv)) {
223-
ret eval_crate_directive_block(cx, e, thn, prefix, view_items,
209+
ret eval_crate_directive_block(cx, thn, prefix, view_items,
224210
items);
225211
}
226212
alt (elopt) {
227213
case (some(?els)) {
228-
ret eval_crate_directive_expr(cx, e, els, prefix,
214+
ret eval_crate_directive_expr(cx, els, prefix,
229215
view_items, items);
230216
}
231217
case (_) {
@@ -235,19 +221,19 @@ fn eval_crate_directive_expr(ctx cx, env e, @ast::expr x, str prefix,
235221
}
236222
}
237223
case (ast::expr_alt(?v, ?arms)) {
238-
auto vv = eval_expr(cx, e, v);
224+
auto vv = eval_expr(cx, v);
239225
for (ast::arm arm in arms) {
240226
alt (arm.pat.node) {
241227
case (ast::pat_lit(?lit, _)) {
242228
auto pv = eval_lit(cx, arm.pat.span, lit);
243229
if (val_eq(cx.sess, arm.pat.span, vv, pv)) {
244-
ret eval_crate_directive_block(cx, e, arm.block,
230+
ret eval_crate_directive_block(cx, arm.block,
245231
prefix, view_items,
246232
items);
247233
}
248234
}
249235
case (ast::pat_wild(_)) {
250-
ret eval_crate_directive_block(cx, e, arm.block,
236+
ret eval_crate_directive_block(cx, arm.block,
251237
prefix, view_items,
252238
items);
253239
}
@@ -260,24 +246,23 @@ fn eval_crate_directive_expr(ctx cx, env e, @ast::expr x, str prefix,
260246
cx.sess.span_fatal(x.span, "no cases matched in 'alt'");
261247
}
262248
case (ast::expr_block(?block)) {
263-
ret eval_crate_directive_block(cx, e, block, prefix, view_items,
249+
ret eval_crate_directive_block(cx, block, prefix, view_items,
264250
items);
265251
}
266252
case (_) { cx.sess.span_fatal(x.span, "unsupported expr type"); }
267253
}
268254
}
269255

270-
fn eval_crate_directive(ctx cx, env e, @ast::crate_directive cdir, str prefix,
256+
fn eval_crate_directive(ctx cx, @ast::crate_directive cdir, str prefix,
271257
&mutable vec[@ast::view_item] view_items,
272258
&mutable vec[@ast::item] items) {
273259
alt (cdir.node) {
274260
case (ast::cdir_let(?id, ?x, ?cdirs)) {
275-
auto v = eval_expr(cx, e, x);
276-
auto e0 = [tup(id, v)] + e;
277-
eval_crate_directives(cx, e0, cdirs, prefix, view_items, items);
261+
auto v = eval_expr(cx, x);
262+
eval_crate_directives(cx, cdirs, prefix, view_items, items);
278263
}
279264
case (ast::cdir_expr(?x)) {
280-
eval_crate_directive_expr(cx, e, x, prefix, view_items, items);
265+
eval_crate_directive_expr(cx, x, prefix, view_items, items);
281266
}
282267
case (ast::cdir_src_mod(?id, ?file_opt, ?attrs)) {
283268
auto file_path = id + ".rs";
@@ -292,7 +277,7 @@ fn eval_crate_directive(ctx cx, env e, @ast::crate_directive cdir, str prefix,
292277
};
293278
if (cx.mode == mode_depend) { cx.deps += [full_path]; ret; }
294279
auto p0 =
295-
new_parser(cx.sess, e, full_path, cx.chpos,
280+
new_parser(cx.sess, cx.cfg, full_path, cx.chpos,
296281
cx.next_id);
297282
auto inner_attrs = parse_inner_attrs_and_next(p0);
298283
auto mod_attrs = attrs + inner_attrs._0;
@@ -315,7 +300,7 @@ fn eval_crate_directive(ctx cx, env e, @ast::crate_directive cdir, str prefix,
315300
} else {
316301
prefix + std::fs::path_sep() + path
317302
};
318-
auto m0 = eval_crate_directives_to_mod(cx, e, cdirs, full_path);
303+
auto m0 = eval_crate_directives_to_mod(cx, cdirs, full_path);
319304
auto i = @rec(ident=id,
320305
attrs=attrs,
321306
id=cx.next_id,

src/comp/front/parser.rs

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ type parser =
3232
fn restrict(restriction) ;
3333
fn get_restriction() -> restriction ;
3434
fn get_file_type() -> file_type ;
35-
fn get_env() -> eval::env ;
3635
fn get_cfg() -> ast::crate_cfg;
3736
fn get_session() -> session::session ;
3837
fn get_span() -> common::span ;
@@ -50,10 +49,9 @@ type parser =
5049
fn next_id() -> ast::node_id ;
5150
};
5251

53-
fn new_parser(session::session sess, eval::env env,
52+
fn new_parser(session::session sess, ast::crate_cfg cfg,
5453
str path, uint pos, ast::node_id next_id) -> parser {
5554
obj stdio_parser(session::session sess,
56-
eval::env env,
5755
ast::crate_cfg cfg,
5856
file_type ftype,
5957
mutable token::token tok,
@@ -85,7 +83,6 @@ fn new_parser(session::session sess, eval::env env,
8583
fn get_hi_pos() -> uint { ret hi; }
8684
fn get_last_lo_pos() -> uint { ret last_lo; }
8785
fn get_file_type() -> file_type { ret ftype; }
88-
fn get_env() -> eval::env { ret env; }
8986
fn get_cfg() -> ast::crate_cfg { ret cfg; }
9087
fn get_prec_table() -> vec[op_spec] { ret precs; }
9188
fn get_str(token::str_num i) -> str {
@@ -106,17 +103,6 @@ fn new_parser(session::session sess, eval::env env,
106103
fn next_id() -> ast::node_id { ret next_id_var; }
107104
}
108105

109-
auto cfg = {
110-
fn m(&tup(ast::ident, eval::val) item) -> @ast::meta_item {
111-
auto name = item._0;
112-
auto value = eval::val_as_str(item._1);
113-
auto meta_item_ = ast::meta_name_value(name, value);
114-
ret @rec(node=meta_item_,
115-
span=rec(lo=0u,hi=0u));
116-
}
117-
vec::map(m, env)
118-
};
119-
120106
auto ftype = SOURCE_FILE;
121107
if (str::ends_with(path, ".rc")) { ftype = CRATE_FILE; }
122108
auto srdr = io::file_reader(path);
@@ -128,7 +114,7 @@ fn new_parser(session::session sess, eval::env env,
128114

129115
lexer::consume_whitespace_and_comments(rdr);
130116
auto npos = rdr.get_chpos();
131-
ret stdio_parser(sess, env, cfg, ftype, lexer::next_token(rdr),
117+
ret stdio_parser(sess, cfg, ftype, lexer::next_token(rdr),
132118
npos, npos, npos, UNRESTRICTED, rdr,
133119
prec_table(), next_id, bad_expr_word_table(),
134120
ext::syntax_expander_table());
@@ -2465,9 +2451,10 @@ fn parse_crate_from_crate_file(&parser p) -> @ast::crate {
24652451
mutable deps=deps,
24662452
sess=p.get_session(),
24672453
mutable chpos=p.get_chpos(),
2468-
mutable next_id=p.next_id());
2454+
mutable next_id=p.next_id(),
2455+
cfg = p.get_cfg());
24692456
auto m =
2470-
eval::eval_crate_directives_to_mod(cx, p.get_env(), cdirs, prefix);
2457+
eval::eval_crate_directives_to_mod(cx, cdirs, prefix);
24712458
auto hi = p.get_hi_pos();
24722459
expect(p, token::EOF);
24732460
ret @spanned(lo, hi, rec(directives=cdirs,

0 commit comments

Comments
 (0)