Skip to content

Commit 87fcfa6

Browse files
committed
---
yaml --- r: 1873 b: refs/heads/master c: 94c19a1 h: refs/heads/master i: 1871: 636900e v: v3
1 parent b57a05c commit 87fcfa6

File tree

5 files changed

+139
-12
lines changed

5 files changed

+139
-12
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 661f1c541e86305a714ea2a27ec7b40ca241aa01
2+
refs/heads/master: 94c19a18ae8ddf70d0c6a21b296e0858dc154d2a

trunk/src/comp/front/creader.rs

Lines changed: 119 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import lib.llvm.llvmext;
88
import lib.llvm.mk_object_file;
99
import lib.llvm.mk_section_iter;
1010
import middle.fold;
11+
import middle.metadata;
1112
import middle.ty;
1213
import middle.typeck;
1314
import back.x86;
@@ -16,8 +17,11 @@ import util.common.span;
1617

1718
import std._str;
1819
import std._vec;
20+
import std.ebml;
1921
import std.fs;
22+
import std.io;
2023
import std.option;
24+
import std.option.none;
2125
import std.option.some;
2226
import std.os;
2327
import std.map.hashmap;
@@ -30,6 +34,11 @@ type env = @rec(
3034
mutable int next_crate_num
3135
);
3236

37+
tag resolve_result {
38+
rr_ok(ast.def_id);
39+
rr_not_found(vec[ast.ident], ast.ident);
40+
}
41+
3342
// Type decoding
3443

3544
// Compact string representation for ty.t values. API ty_str & parse_from_str.
@@ -213,10 +222,96 @@ impure fn parse_ty_fn(@pstate st, str_def sd) -> tup(vec[ty.arg], @ty.t) {
213222

214223
// Rust metadata parsing
215224

216-
// TODO
225+
fn parse_def_id(str s) -> ast.def_id {
226+
ret tup(1, 0); // TODO
227+
}
228+
229+
// Given a path and serialized crate metadata, returns the ID of the
230+
// definition the path refers to.
231+
impure fn resolve_path(vec[ast.ident] path, vec[u8] data) -> resolve_result {
232+
impure fn resolve_path_inner(vec[ast.ident] path, &ebml.reader ebml_r)
233+
-> resolve_result {
234+
auto i = 0u;
235+
auto len = _vec.len[ast.ident](path);
236+
while (i < len) {
237+
auto name = path.(i);
238+
auto last = i == len - 1u;
239+
240+
// Search this level for the identifier.
241+
auto found = false;
242+
while (ebml.bytes_left(ebml_r) > 0u && !found) {
243+
auto ebml_tag = ebml.peek(ebml_r);
244+
check ((ebml_tag.id == metadata.tag_paths_item) ||
245+
(ebml_tag.id == metadata.tag_paths_mod));
246+
247+
ebml.move_to_first_child(ebml_r);
248+
auto did_opt = none[ast.def_id];
249+
auto name_opt = none[ast.ident];
250+
while (ebml.bytes_left(ebml_r) > 0u) {
251+
auto inner_tag = ebml.peek(ebml_r);
252+
if (inner_tag.id == metadata.tag_paths_name) {
253+
ebml.move_to_first_child(ebml_r);
254+
auto name_data = ebml.read_data(ebml_r);
255+
ebml.move_to_parent(ebml_r);
256+
auto nm = _str.unsafe_from_bytes(name_data);
257+
name_opt = some[ast.ident](nm);
258+
} else if (inner_tag.id == metadata.tag_items_def_id) {
259+
ebml.move_to_first_child(ebml_r);
260+
auto did_data = ebml.read_data(ebml_r);
261+
ebml.move_to_parent(ebml_r);
262+
auto did_str = _str.unsafe_from_bytes(did_data);
263+
log "did_str: " + did_str;
264+
did_opt = some[ast.def_id](parse_def_id(did_str));
265+
}
266+
ebml.move_to_next_sibling(ebml_r);
267+
}
268+
ebml.move_to_parent(ebml_r);
269+
270+
if (_str.eq(option.get[ast.ident](name_opt), name)) {
271+
// Matched!
272+
if (last) {
273+
ret rr_ok(option.get[ast.def_id](did_opt));
274+
}
275+
276+
// Move to the module/item we found for the next iteration
277+
// of the loop...
278+
ebml.move_to_first_child(ebml_r);
279+
found = true;
280+
}
281+
282+
ebml.move_to_next_sibling(ebml_r);
283+
}
284+
285+
if (!found) {
286+
auto prev = _vec.slice[ast.ident](path, 0u, i);
287+
ret rr_not_found(prev, name);
288+
}
289+
290+
i += 1u;
291+
}
292+
293+
fail; // not reached
294+
}
295+
296+
auto io_r = io.new_reader_(io.new_byte_buf_reader(data));
297+
auto ebml_r = ebml.create_reader(io_r);
298+
while (ebml.bytes_left(ebml_r) > 0u) {
299+
auto ebml_tag = ebml.peek(ebml_r);
300+
log #fmt("outer ebml tag id: %u", ebml_tag.id);
301+
if (ebml_tag.id == metadata.tag_paths) {
302+
ebml.move_to_first_child(ebml_r);
303+
ret resolve_path_inner(path, ebml_r);
304+
}
305+
ebml.move_to_next_sibling(ebml_r);
306+
}
307+
308+
log "resolve_path(): no names in file";
309+
fail;
310+
}
217311

218312

219313
fn load_crate(session.session sess,
314+
int cnum,
220315
ast.ident ident,
221316
vec[str] library_search_paths) {
222317
auto filename = parser.default_native_name(sess, ident);
@@ -235,6 +330,8 @@ fn load_crate(session.session sess,
235330
auto cbuf = llvmext.LLVMGetSectionContents(si.llsi);
236331
auto csz = llvmext.LLVMGetSectionSize(si.llsi);
237332
auto cvbuf = cbuf as _vec.vbuf;
333+
auto cvec = _vec.vec_from_vbuf[u8](cvbuf, csz);
334+
sess.set_external_crate(cnum, cvec);
238335
ret;
239336
}
240337
llvmext.LLVMMoveToNextSection(si.llsi);
@@ -252,8 +349,8 @@ fn fold_view_item_use(&env e, &span sp, ast.ident ident,
252349
-> @ast.view_item {
253350
auto cnum;
254351
if (!e.crate_cache.contains_key(ident)) {
255-
load_crate(e.sess, ident, e.library_search_paths);
256352
cnum = e.next_crate_num;
353+
load_crate(e.sess, cnum, ident, e.library_search_paths);
257354
e.crate_cache.insert(ident, e.next_crate_num);
258355
e.next_crate_num += 1;
259356
} else {
@@ -280,10 +377,27 @@ fn read_crates(session.session sess,
280377
ret fold.fold_crate[env](e, fld, crate);
281378
}
282379

380+
381+
// Crate metadata queries
382+
283383
fn lookup_def(session.session sess, &span sp, int cnum, vec[ast.ident] path)
284-
-> ast.def {
285-
// FIXME: fill in.
286-
fail;
384+
-> ast.def {
385+
auto data = sess.get_external_crate(cnum);
386+
387+
auto did;
388+
alt (resolve_path(path, data)) {
389+
case (rr_ok(?di)) { did = di; }
390+
case (rr_not_found(?prev, ?name)) {
391+
sess.span_err(sp,
392+
#fmt("unbound name '%s' (no item named '%s' found in '%s')",
393+
_str.connect(path, "."), name, _str.connect(prev, ".")));
394+
fail;
395+
}
396+
}
397+
398+
// TODO: Look up item type, use that to determine the type of def.
399+
400+
fail;
287401
}
288402

289403
fn get_type(session.session sess, ast.def_id def) -> typeck.ty_and_params {

trunk/src/comp/rustc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ mod util {
4343

4444
auth driver.rustc.main = impure;
4545
auth front.creader.load_crate = unsafe;
46+
auth front.creader.lookup_def = impure;
4647
auth middle.metadata = unsafe;
4748
auth middle.trans = unsafe;
4849
auth middle.trans.copy_args_to_allocas = impure;

trunk/src/lib/ebml.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import option.none;
66
import option.some;
77

88
type ebml_tag = rec(uint id, uint size);
9-
type ebml_state = rec(ebml_tag ebml_tag, uint pos);
9+
type ebml_state = rec(ebml_tag ebml_tag, uint tag_pos, uint data_pos);
1010

1111
// TODO: When we have module renaming, make "reader" and "writer" separate
1212
// modules within this file.
@@ -56,8 +56,10 @@ impure fn create_reader(&io.reader r) -> reader {
5656
impure fn bytes_left(&reader r) -> uint {
5757
auto pos = r.reader.tell();
5858
alt (_vec.last[ebml_state](r.states)) {
59-
case (none[ebml_state]) { ret r.size - pos; }
60-
case (some[ebml_state](?st)) { ret st.pos + st.ebml_tag.size - pos; }
59+
case (none[ebml_state]) { ret r.size - pos; }
60+
case (some[ebml_state](?st)) {
61+
ret st.data_pos + st.ebml_tag.size - pos;
62+
}
6163
}
6264
}
6365

@@ -69,9 +71,10 @@ impure fn read_tag(&reader r) -> ebml_tag {
6971

7072
// Reads a tag and moves the cursor to its first child or data segment.
7173
impure fn move_to_first_child(&reader r) {
72-
auto pos = r.reader.tell();
74+
auto tag_pos = r.reader.tell();
7375
auto t = read_tag(r);
74-
r.states += vec(rec(ebml_tag=t, pos=pos));
76+
auto data_pos = r.reader.tell();
77+
r.states += vec(rec(ebml_tag=t, tag_pos=tag_pos, data_pos=data_pos));
7578
}
7679

7780
// Reads a tag and skips over its contents, moving to its next sibling.
@@ -84,7 +87,7 @@ impure fn move_to_next_sibling(&reader r) {
8487
impure fn move_to_parent(&reader r) {
8588
check (_vec.len[ebml_state](r.states) > 0u);
8689
auto st = _vec.pop[ebml_state](r.states);
87-
r.reader.seek(st.pos as int, io.seek_set);
90+
r.reader.seek(st.tag_pos as int, io.seek_set);
8891
}
8992

9093
// Reads the data segment of a tag.

trunk/src/lib/io.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,11 @@ fn file_reader(str path) -> reader {
188188
ret new_reader(FILE_buf_reader(f, true));
189189
}
190190

191+
// FIXME: Remove me once objects are exported.
192+
fn new_reader_(buf_reader bufr) -> reader {
193+
ret new_reader(bufr);
194+
}
195+
191196

192197
// Byte buffer readers
193198

@@ -224,6 +229,10 @@ state obj byte_buf_reader(byte_buf bbuf) {
224229
impure fn tell() -> uint { ret bbuf.pos; }
225230
}
226231

232+
fn new_byte_buf_reader(vec[u8] buf) -> byte_buf_reader {
233+
ret byte_buf_reader(@rec(buf=buf, mutable pos=0u));
234+
}
235+
227236

228237
// Writing
229238

0 commit comments

Comments
 (0)