Skip to content

Commit 5f05311

Browse files
committed
---
yaml --- r: 711 b: refs/heads/master c: 2c514f3 h: refs/heads/master i: 709: 5793954 707: 017242b 703: b017c57 v: v3
1 parent 06121f9 commit 5f05311

File tree

4 files changed

+65
-17
lines changed

4 files changed

+65
-17
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 04a55df54bb389abf95c0639bd6246f06cd6c38f
2+
refs/heads/master: 2c514f33f2ebba03ca06368b3405ce0d7cc93c54

trunk/src/comp/driver/session.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import util.common.span;
22
import std._uint;
33

4-
io obj session() {
5-
io fn span_err(span sp, str msg) {
4+
obj session() {
5+
fn span_err(span sp, str msg) {
66
let str s = sp.filename;
77
s += ':' as u8;
88
// We really need #fmt soon!
@@ -19,12 +19,19 @@ io obj session() {
1919
fail;
2020
}
2121

22-
io fn err(str msg) {
22+
fn err(str msg) {
2323
let str s = "error: ";
2424
s += msg;
2525
log s;
2626
fail;
2727
}
28+
29+
fn unimpl(str msg) {
30+
let str s = "error: unimplemented ";
31+
s += msg;
32+
log s;
33+
fail;
34+
}
2835
}
2936

3037

trunk/src/comp/fe/parser.rs

+16
Original file line numberDiff line numberDiff line change
@@ -218,11 +218,27 @@ state fn parse_fn(parser p) -> tup(ast.ident, ast.item) {
218218
ret tup(id, ast.item_fn(@f));
219219
}
220220

221+
state fn parse_mod(parser p) -> tup(ast.ident, ast.item) {
222+
expect(p, token.MOD);
223+
auto id = parse_ident(p);
224+
expect(p, token.LBRACE);
225+
let ast._mod m = new_str_hash[ast.item]();
226+
while (p.peek() != token.RBRACE) {
227+
auto i = parse_item(p);
228+
m.insert(i._0, i._1);
229+
}
230+
expect(p, token.RBRACE);
231+
ret tup(id, ast.item_mod(@m));
232+
}
233+
221234
state fn parse_item(parser p) -> tup(ast.ident, ast.item) {
222235
alt (p.peek()) {
223236
case (token.FN) {
224237
ret parse_fn(p);
225238
}
239+
case (token.MOD) {
240+
ret parse_mod(p);
241+
}
226242
}
227243
p.err("expectied item");
228244
fail;

trunk/src/comp/me/trans.rs

+38-13
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import lib.llvm.llvm.BasicBlockRef;
1717
import lib.llvm.False;
1818
import lib.llvm.True;
1919

20+
type trans_ctxt = rec(session.session sess,
21+
ModuleRef llmod,
22+
str path);
23+
2024
fn T_nil() -> TypeRef {
2125
ret llvm.LLVMVoidType();
2226
}
@@ -32,35 +36,54 @@ fn T_fn(vec[TypeRef] inputs, TypeRef output) -> TypeRef {
3236
False());
3337
}
3438

35-
fn trans_fn(ModuleRef llmod, str name, &ast._fn f) {
36-
let vec[TypeRef] args = vec();
37-
let TypeRef llty = T_fn(args, T_nil());
38-
let ValueRef llfn =
39-
llvm.LLVMAddFunction(llmod, _str.buf(name), llty);
39+
fn trans_log(&trans_ctxt cx, builder b, &ast.atom a) {
4040
}
4141

42-
fn trans_block(ast.block b, ValueRef llfn) {
42+
fn trans_stmt(&trans_ctxt cx, builder b, &ast.stmt s) {
43+
alt (s) {
44+
case (ast.stmt_log(?a)) {
45+
trans_log(cx, b, *a);
46+
}
47+
case (_) {
48+
cx.sess.unimpl("stmt variant");
49+
}
50+
}
51+
}
52+
53+
fn trans_block(&trans_ctxt cx, ValueRef llfn, &ast.block b) {
4354
let BasicBlockRef llbb =
44-
llvm.LLVMAppendBasicBlock(llfn, 0 as sbuf);
55+
llvm.LLVMAppendBasicBlock(llfn, _str.buf(""));
4556
let BuilderRef llbuild = llvm.LLVMCreateBuilder();
4657
llvm.LLVMPositionBuilderAtEnd(llbuild, llbb);
47-
auto b = builder(llbuild);
58+
auto bld = builder(llbuild);
59+
for (@ast.stmt s in b) {
60+
trans_stmt(cx, bld, *s);
61+
}
62+
}
63+
64+
fn trans_fn(&trans_ctxt cx, &ast._fn f) {
65+
let vec[TypeRef] args = vec();
66+
let TypeRef llty = T_fn(args, T_nil());
67+
let ValueRef llfn =
68+
llvm.LLVMAddFunction(cx.llmod, _str.buf(cx.path), llty);
69+
trans_block(cx, llfn, f.body);
4870
}
4971

50-
fn trans_mod_item(ModuleRef llmod, str name, &ast.item item) {
72+
fn trans_item(&trans_ctxt cx, &str name, &ast.item item) {
73+
auto sub_cx = rec(path=cx.path + "." + name with cx);
5174
alt (item) {
5275
case (ast.item_fn(?f)) {
53-
trans_fn(llmod, name, *f);
76+
trans_fn(sub_cx, *f);
5477
}
5578
case (ast.item_mod(?m)) {
56-
trans_mod(llmod, name, *m);
79+
trans_mod(sub_cx, *m);
5780
}
5881
}
5982
}
6083

61-
fn trans_mod(ModuleRef llmod, str name, &ast._mod m) {
84+
fn trans_mod(&trans_ctxt cx, &ast._mod m) {
6285
for each (tup(str, ast.item) pair in m.items()) {
63-
trans_mod_item(llmod, name + "." + pair._0, pair._1);
86+
trans_item(cx, pair._0, pair._1);
6487
}
6588
}
6689

@@ -69,6 +92,8 @@ fn trans_crate(session.session sess, ast.crate crate) {
6992
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
7093
llvm.LLVMGetGlobalContext());
7194

95+
auto cx = rec(sess=sess, llmod=llmod, path="");
96+
trans_mod(cx, crate.module);
7297

7398
llvm.LLVMWriteBitcodeToFile(llmod, _str.buf("rust_out.bc"));
7499
llvm.LLVMDisposeModule(llmod);

0 commit comments

Comments
 (0)