Teach trans to emit undefined references to 'use'd symbols. Can compile and run a simple 'use std;' example now.

This commit is contained in:
Graydon Hoare 2011-03-29 13:21:16 -07:00
parent 6936093992
commit 734abe593d
4 changed files with 61 additions and 0 deletions

View file

@ -43,6 +43,28 @@ tag def {
def_native_fn(def_id);
}
fn def_id_of_def(def d) -> def_id {
alt (d) {
case (def_fn(?id)) { ret id; }
case (def_obj(?id)) { ret id; }
case (def_obj_field(?id)) { ret id; }
case (def_mod(?id)) { ret id; }
case (def_native_mod(?id)) { ret id; }
case (def_const(?id)) { ret id; }
case (def_arg(?id)) { ret id; }
case (def_local(?id)) { ret id; }
case (def_upvar(?id)) { ret id; }
case (def_variant(_, ?id)) { ret id; }
case (def_ty(?id)) { ret id; }
case (def_ty_arg(?id)) { ret id; }
case (def_binding(?id)) { ret id; }
case (def_use(?id)) { ret id; }
case (def_native_ty(?id)) { ret id; }
case (def_native_fn(?id)) { ret id; }
}
fail;
}
type crate = spanned[crate_];
type crate_ = rec(vec[@crate_directive] directives,
_mod module);

View file

@ -403,6 +403,16 @@ impure fn get_item_kind(&ebml.reader ebml_r) -> u8 {
ret get_item_generic[u8](ebml_r, metadata.tag_items_kind, f);
}
impure fn get_item_symbol(&ebml.reader ebml_r) -> str {
impure fn converter(vec[u8] data) -> str {
auto x = @mutable 3;
*x = 5;
ret _str.unsafe_from_bytes(data);
}
auto f = converter;
ret get_item_generic[str](ebml_r, metadata.tag_items_symbol, f);
}
// FIXME: This is a *terrible* botch.
impure fn impure_parse_def_id(vec[u8] data) -> ast.def_id {
auto x = @mutable 3;
@ -573,6 +583,13 @@ fn get_type(session.session sess, ast.def_id def) -> ty.ty_params_and_ty {
ret tup(tps, t);
}
fn get_symbol(session.session sess, ast.def_id def) -> str {
auto external_crate_id = def._0;
auto data = sess.get_external_crate(external_crate_id);
auto ebml_r = lookup_item(def._1, data);
ret get_item_symbol(ebml_r);
}
// Local Variables:
// mode: rust
// fill-column: 78;