提交 348c77c3 编写于 作者: G Graydon Hoare

Populate default compilation environment as in rustboot.

上级 0761c5f4
......@@ -2,6 +2,7 @@
import front.parser;
import front.token;
import front.eval;
import middle.trans;
import middle.resolve;
import middle.typeck;
......@@ -13,6 +14,30 @@
import std._str;
import std._vec;
fn default_environment(session.session sess,
str argv0,
str input) -> eval.env {
auto libc = "libc.so";
alt (sess.get_targ_cfg().os) {
case (session.os_win32) { libc = "msvcrt.dll"; }
case (session.os_macos) { libc = "libc.dylib"; }
case (session.os_linux) { libc = "libc.so.6"; }
}
ret
vec(
// Target bindings.
tup("target_os", eval.val_str(std.os.target_os())),
tup("target_arch", eval.val_str("x86")),
tup("target_libc", eval.val_str(libc)),
// Build bindings.
tup("build_compiler", eval.val_str(argv0)),
tup("build_input", eval.val_str(input))
);
}
impure fn parse_input(session.session sess,
parser.parser p,
str input) -> @front.ast.crate {
......@@ -25,9 +50,11 @@
fail;
}
impure fn compile_input(session.session sess, str input, str output,
impure fn compile_input(session.session sess,
eval.env env,
str input, str output,
bool shared) {
auto p = parser.new_parser(sess, 0, input);
auto p = parser.new_parser(sess, env, 0, input);
auto crate = parse_input(sess, p, input);
crate = resolve.resolve_crate(sess, crate);
crate = typeck.check_crate(sess, crate);
......@@ -131,16 +158,19 @@ fn get_os() -> session.os {
sess.err("no input filename");
}
case (some[str](?ifile)) {
auto env = default_environment(sess, args.(0), ifile);
alt (output_file) {
case (none[str]) {
let vec[str] parts = _str.split(ifile, '.' as u8);
parts = _vec.pop[str](parts);
parts += ".bc";
auto ofile = _str.concat(parts);
compile_input(sess, ifile, ofile, shared);
compile_input(sess, env, ifile, ofile, shared);
}
case (some[str](?ofile)) {
compile_input(sess, ifile, ofile, shared);
compile_input(sess, env, ifile, ofile, shared);
}
}
}
......
......@@ -393,7 +393,7 @@ fn val_eq(session.session sess, span sp, val av, val bv) -> bool {
auto full_path = prefix + std.os.path_sep() + file_path;
auto p0 = new_parser(p.get_session(), 0, full_path);
auto p0 = new_parser(p.get_session(), e, 0, full_path);
auto m0 = parse_mod_items(p0, token.EOF);
auto im = ast.item_mod(id, m0, p.next_def_id());
auto i = @spanned(cdir.span, cdir.span, im);
......
......@@ -31,15 +31,18 @@
impure fn restrict(restriction r);
fn get_restriction() -> restriction;
fn get_file_type() -> file_type;
fn get_env() -> eval.env;
fn get_session() -> session.session;
fn get_span() -> common.span;
fn next_def_id() -> ast.def_id;
};
impure fn new_parser(session.session sess,
eval.env env,
ast.crate_num crate,
str path) -> parser {
state obj stdio_parser(session.session sess,
eval.env env,
file_type ftype,
mutable token.token tok,
mutable common.pos lo,
......@@ -93,6 +96,10 @@ fn get_file_type() -> file_type {
ret ftype;
}
fn get_env() -> eval.env {
ret env;
}
}
auto ftype = SOURCE_FILE;
if (_str.ends_with(path, ".rc")) {
......@@ -101,7 +108,7 @@ fn get_file_type() -> file_type {
auto srdr = io.new_stdio_reader(path);
auto rdr = lexer.new_reader(srdr, path);
auto npos = rdr.get_curr_pos();
ret stdio_parser(sess, ftype, lexer.next_token(rdr),
ret stdio_parser(sess, env, ftype, lexer.next_token(rdr),
npos, npos, 0, UNRESTRICTED, crate, rdr);
}
......@@ -2279,7 +2286,7 @@ fn is_use_or_import(token.token t) -> bool {
auto hi = lo;
auto prefix = std.path.dirname(lo.filename);
auto cdirs = parse_crate_directives(p, token.EOF);
auto m = eval.eval_crate_directives_to_mod(p, eval.mk_env(),
auto m = eval.eval_crate_directives_to_mod(p, p.get_env(),
cdirs, prefix);
hi = p.get_span();
expect(p, token.EOF);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册