aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-02-21 17:42:23 -0800
committerGraydon Hoare <[email protected]>2011-02-21 17:42:23 -0800
commit60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2 (patch)
treea177daef976b93c4e0c0c54a08c5f1310ccada71 /src
parentImplement sha-1 in standard library. Closes #228 (diff)
downloadrust-60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2.tar.xz
rust-60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2.zip
Find main functions buried within modules. Un-XFAIL import.rs.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/comp/middle/trans.rs27
2 files changed, 26 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index 71c9807b..872ced98 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -492,6 +492,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
int.rs \
i32-sub.rs \
i8-incr.rs \
+ import.rs \
import2.rs \
import3.rs \
import4.rs \
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index efa3a41d..35fefc10 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -4602,6 +4602,30 @@ fn create_crate_constant(@crate_ctxt cx) {
llvm.LLVMSetInitializer(cx.crate_ptr, crate_val);
}
+fn find_main_fn(@crate_ctxt cx) -> ValueRef {
+ auto e = sep() + "main";
+ let ValueRef v = C_nil();
+ let uint n = 0u;
+ for each (tup(str,ValueRef) i in cx.item_names.items()) {
+ if (_str.ends_with(i._0, e)) {
+ n += 1u;
+ v = i._1;
+ }
+ }
+ alt (n) {
+ case (0u) {
+ cx.sess.err("main fn not found");
+ }
+ case (1u) {
+ ret v;
+ }
+ case (_) {
+ cx.sess.err("multiple main fns found");
+ }
+ }
+ fail;
+}
+
fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
auto T_main_args = vec(T_int(), T_int());
auto T_rust_start_args = vec(T_int(), T_int(), T_int(), T_int());
@@ -4621,8 +4645,7 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
auto llargc = llvm.LLVMGetParam(llmain, 0u);
auto llargv = llvm.LLVMGetParam(llmain, 1u);
- check (cx.item_names.contains_key("_rust" + sep() + "main"));
- auto llrust_main = cx.item_names.get("_rust" + sep() + "main");
+ auto llrust_main = find_main_fn(cx);
//
// Emit the moral equivalent of: