From 6b94bc345ca143273cf9d0754ec5f3a8e21923e5 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Mon, 15 Feb 2016 02:22:59 +0000 Subject: [PATCH] Add an arena for import directives --- src/librustc_resolve/build_reduced_graph.rs | 7 ++++--- src/librustc_resolve/lib.rs | 10 +++++++++- src/librustc_resolve/resolve_imports.rs | 10 +++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index a9443eaf072..dff6926d2d3 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -707,9 +707,10 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> { } } - module_.unresolved_imports - .borrow_mut() - .push(ImportDirective::new(module_path, subclass, span, id, is_public, shadowable)); + let directive = + ImportDirective::new(module_path, subclass, span, id, is_public, shadowable); + let directive = self.resolver.arenas.alloc_import_directive(directive); + module_.unresolved_imports.borrow_mut().push(directive); self.unresolved_imports += 1; } } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index a160e1384d1..50e6e5c398c 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -812,7 +812,7 @@ pub struct ModuleS<'a> { extern_crate_id: Option, resolutions: RefCell>>, - unresolved_imports: RefCell>, + unresolved_imports: RefCell>, // The module children of this node, including normal modules and anonymous modules. // Anonymous children are pseudo-modules that are implicitly created around items @@ -1167,6 +1167,13 @@ pub struct Resolver<'a, 'tcx: 'a> { pub struct ResolverArenas<'a> { modules: arena::TypedArena>, name_bindings: arena::TypedArena>, + import_directives: arena::TypedArena, +} + +impl<'a> ResolverArenas<'a> { + fn alloc_import_directive(&'a self, import_directive: ImportDirective) -> &'a ImportDirective { + self.import_directives.alloc(import_directive) + } } #[derive(PartialEq)] @@ -1234,6 +1241,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { ResolverArenas { modules: arena::TypedArena::new(), name_bindings: arena::TypedArena::new(), + import_directives: arena::TypedArena::new(), } } diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index c5408003241..d68ceb81e2a 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -172,7 +172,7 @@ impl<'a> NameResolution<'a> { struct ImportResolvingError<'a> { /// Module where the error happened source_module: Module<'a>, - import_directive: ImportDirective, + import_directive: &'a ImportDirective, span: Span, help: String, } @@ -249,7 +249,7 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { } let path = import_path_to_string(&e.import_directive.module_path, - e.import_directive.subclass); + &e.import_directive.subclass); resolve_error(self.resolver, e.span, @@ -608,7 +608,7 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { } } -fn import_path_to_string(names: &[Name], subclass: ImportDirectiveSubclass) -> String { +fn import_path_to_string(names: &[Name], subclass: &ImportDirectiveSubclass) -> String { if names.is_empty() { import_directive_subclass_to_string(subclass) } else { @@ -619,8 +619,8 @@ fn import_path_to_string(names: &[Name], subclass: ImportDirectiveSubclass) -> S } } -fn import_directive_subclass_to_string(subclass: ImportDirectiveSubclass) -> String { - match subclass { +fn import_directive_subclass_to_string(subclass: &ImportDirectiveSubclass) -> String { + match *subclass { SingleImport { source, .. } => source.to_string(), GlobImport => "*".to_string(), }