aboutsummaryrefslogtreecommitdiff
path: root/src/boot/fe
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-06-27 20:48:28 -0700
committerGraydon Hoare <[email protected]>2010-06-27 20:48:28 -0700
commit1316312c0c0f0225922b94fc6bfa2e07e3a85ac4 (patch)
tree3d56e02aa4afb3202a49dee2ec4c8757b97ec0fa /src/boot/fe
parentChange slot_mem_ctrl to classify vec[state] as GC mem. Breaking / XFAILing mu... (diff)
downloadrust-1316312c0c0f0225922b94fc6bfa2e07e3a85ac4.tar.xz
rust-1316312c0c0f0225922b94fc6bfa2e07e3a85ac4.zip
Only translate or dwarf-emit items or stubs locally defined or used. Avoids instantiating O(sizeof(standard-library)) worth of imports stubs on each 'use std'. Closes issue 13.
Diffstat (limited to 'src/boot/fe')
-rw-r--r--src/boot/fe/item.ml28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml
index 031b9e49..a2763d96 100644
--- a/src/boot/fe/item.ml
+++ b/src/boot/fe/item.ml
@@ -876,17 +876,31 @@ and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
and parse_mod_items_from_signature
(ps:pstate)
: (Ast.mod_view * Ast.mod_items) =
- let mis = Hashtbl.create 0 in
- expect ps LBRACE;
- while not (peek ps = RBRACE)
- do
+ let exports = Hashtbl.create 0 in
+ let mis = Hashtbl.create 0 in
+ let in_view = ref true in
+ expect ps LBRACE;
+ while not (peek ps = RBRACE)
+ do
+ if !in_view
+ then
+ match peek ps with
+ EXPORT ->
+ bump ps;
+ parse_export ps exports;
+ expect ps SEMI;
+ | _ ->
+ in_view := false
+ else
let (ident, mti) = ctxt "mod items from sig: mod item"
parse_mod_item_from_signature ps
in
Hashtbl.add mis ident mti;
- done;
- expect ps RBRACE;
- (empty_view, mis)
+ done;
+ if (Hashtbl.length exports) = 0
+ then Hashtbl.add exports Ast.EXPORT_all_decls ();
+ expect ps RBRACE;
+ ({empty_view with Ast.view_exports = exports}, mis)
and parse_mod_item_from_signature (ps:pstate)