Skip to content

Commit 2065ee9

Browse files
committed
metadata: Eliminate FullProcMacro
Fix caching of loaded proc macros
1 parent 52c62ea commit 2065ee9

File tree

5 files changed

+28
-50
lines changed

5 files changed

+28
-50
lines changed

src/librustc_metadata/cstore.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@ pub struct CrateMetadata {
9595
pub raw_proc_macros: Option<&'static [ProcMacro]>,
9696
}
9797

98-
pub struct FullProcMacro {
99-
pub name: ast::Name,
100-
pub ext: Lrc<SyntaxExtension>
101-
}
102-
10398
pub struct CStore {
10499
metas: RwLock<IndexVec<CrateNum, Option<Lrc<CrateMetadata>>>>,
105100
/// Map from NodeId's of local extern crate statements to crate numbers
@@ -109,7 +104,7 @@ pub struct CStore {
109104

110105
pub enum LoadedMacro {
111106
MacroDef(ast::Item),
112-
ProcMacro(Lrc<SyntaxExtension>),
107+
ProcMacro(SyntaxExtension),
113108
}
114109

115110
impl CStore {

src/librustc_metadata/cstore_impl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ impl cstore::CStore {
434434
pub fn load_macro_untracked(&self, id: DefId, sess: &Session) -> LoadedMacro {
435435
let data = self.get_crate_data(id.krate);
436436
if data.is_proc_macro_crate() {
437-
return LoadedMacro::ProcMacro(data.get_proc_macro(id.index, sess).ext);
437+
return LoadedMacro::ProcMacro(data.load_proc_macro(id.index, sess));
438438
}
439439

440440
let def = data.get_macro(id.index);

src/librustc_metadata/decoder.rs

+18-35
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Decoding metadata from a single crate's metadata
22

3-
use crate::cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary, ForeignModule, FullProcMacro};
3+
use crate::cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary, ForeignModule};
44
use crate::schema::*;
55

66
use rustc_data_structures::indexed_vec::IndexVec;
@@ -512,26 +512,8 @@ impl<'a, 'tcx> CrateMetadata {
512512
self.entry(index).span.decode((self, sess))
513513
}
514514

515-
516-
pub fn get_proc_macro(&self, id: DefIndex, sess: &Session) -> FullProcMacro {
517-
if sess.opts.debugging_opts.dual_proc_macros {
518-
let host_lib = self.host_lib.as_ref().unwrap();
519-
self.load_proc_macro(
520-
&host_lib.metadata.get_root(),
521-
id,
522-
sess
523-
)
524-
} else {
525-
self.load_proc_macro(&self.root, id, sess)
526-
}
527-
}
528-
529-
fn load_proc_macro(&self, root: &CrateRoot<'_>,
530-
id: DefIndex,
531-
sess: &Session)
532-
-> FullProcMacro {
533-
let raw_macro = self.raw_proc_macro(id);
534-
let (name, kind, helper_attrs) = match *raw_macro {
515+
crate fn load_proc_macro(&self, id: DefIndex, sess: &Session) -> SyntaxExtension {
516+
let (name, kind, helper_attrs) = match *self.raw_proc_macro(id) {
535517
ProcMacro::CustomDerive { trait_name, attributes, client } => {
536518
let helper_attrs =
537519
attributes.iter().cloned().map(Symbol::intern).collect::<Vec<_>>();
@@ -550,20 +532,21 @@ impl<'a, 'tcx> CrateMetadata {
550532
name, SyntaxExtensionKind::Bang(Box::new(BangProcMacro { client })), Vec::new()
551533
)
552534
};
553-
let name = Symbol::intern(name);
554-
555-
FullProcMacro {
556-
name,
557-
ext: Lrc::new(SyntaxExtension::new(
558-
&sess.parse_sess,
559-
kind,
560-
self.get_span(id, sess),
561-
helper_attrs,
562-
root.edition,
563-
name,
564-
&self.get_attributes(&self.entry(id), sess),
565-
)),
566-
}
535+
let edition = if sess.opts.debugging_opts.dual_proc_macros {
536+
self.host_lib.as_ref().unwrap().metadata.get_root().edition
537+
} else {
538+
self.root.edition
539+
};
540+
541+
SyntaxExtension::new(
542+
&sess.parse_sess,
543+
kind,
544+
self.get_span(id, sess),
545+
helper_attrs,
546+
edition,
547+
Symbol::intern(name),
548+
&self.get_attributes(&self.entry(id), sess),
549+
)
567550
}
568551

569552
pub fn get_trait_def(&self, item_id: DefIndex, sess: &Session) -> ty::TraitDef {

src/librustc_resolve/build_reduced_graph.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,12 @@ impl<'a> Resolver<'a> {
150150
return Some(ext.clone());
151151
}
152152

153-
let macro_def = match self.cstore.load_macro_untracked(def_id, &self.session) {
154-
LoadedMacro::MacroDef(macro_def) => macro_def,
155-
LoadedMacro::ProcMacro(ext) => return Some(ext),
156-
};
153+
let ext = Lrc::new(match self.cstore.load_macro_untracked(def_id, &self.session) {
154+
LoadedMacro::MacroDef(item) =>
155+
self.compile_macro(&item, self.cstore.crate_edition_untracked(def_id.krate)),
156+
LoadedMacro::ProcMacro(ext) => ext,
157+
});
157158

158-
let ext = self.compile_macro(&macro_def, self.cstore.crate_edition_untracked(def_id.krate));
159159
self.macro_map.insert(def_id, ext.clone());
160160
Some(ext)
161161
}
@@ -1104,7 +1104,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
11041104
let expansion = parent_scope.expansion;
11051105
let (ext, ident, span, is_legacy) = match &item.node {
11061106
ItemKind::MacroDef(def) => {
1107-
let ext = self.r.compile_macro(item, self.r.session.edition());
1107+
let ext = Lrc::new(self.r.compile_macro(item, self.r.session.edition()));
11081108
(ext, item.ident, item.span, def.legacy)
11091109
}
11101110
ItemKind::Fn(..) => match Self::proc_macro_stub(item) {

src/librustc_resolve/macros.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ impl<'a> Resolver<'a> {
800800

801801
/// Compile the macro into a `SyntaxExtension` and possibly replace it with a pre-defined
802802
/// extension partially or entirely for built-in macros and legacy plugin macros.
803-
crate fn compile_macro(&mut self, item: &ast::Item, edition: Edition) -> Lrc<SyntaxExtension> {
803+
crate fn compile_macro(&mut self, item: &ast::Item, edition: Edition) -> SyntaxExtension {
804804
let mut result = macro_rules::compile(
805805
&self.session.parse_sess, self.session.features_untracked(), item, edition
806806
);
@@ -822,6 +822,6 @@ impl<'a> Resolver<'a> {
822822
}
823823
}
824824

825-
Lrc::new(result)
825+
result
826826
}
827827
}

0 commit comments

Comments
 (0)