diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-09-20 11:16:27 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-09-20 11:16:27 +0530 |
| commit | d7ec69a652e8e58c788c8dfa060387d1ceb4b28d (patch) | |
| tree | 8718bf617da6a4a66db25e911d476ce4b592ee27 /src/libsyntax | |
| parent | 8f8fe8194d108ad7094a286bb4db5169656835c2 (diff) | |
| parent | 8aef16c2a5c175f7b4359122d7409765b09d6bf5 (diff) | |
| download | rust-d7ec69a652e8e58c788c8dfa060387d1ceb4b28d.tar.gz rust-d7ec69a652e8e58c788c8dfa060387d1ceb4b28d.zip | |
Rollup merge of #28526 - Manishearth:expand-clone, r=eddyb
This reduces some clones of `Vec`s. These are not deep copies since the token tree is made using `Rc`s, so this won't be a major improvement. r? @eddyb
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 1991124ae26..ffbb7edd385 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -684,15 +684,15 @@ fn contains_macro_use(fld: &mut MacroExpander, attrs: &[ast::Attribute]) -> bool // logic as for expression-position macro invocations. pub fn expand_item_mac(it: P<ast::Item>, fld: &mut MacroExpander) -> SmallVector<P<ast::Item>> { - let (extname, path_span, tts) = match it.node { + let (extname, path_span, tts, span, attrs, ident) = it.and_then(|it| { match it.node { ItemMac(codemap::Spanned { - node: MacInvocTT(ref pth, ref tts, _), + node: MacInvocTT(pth, tts, _), .. }) => { - (pth.segments[0].identifier.name, pth.span, (*tts).clone()) + (pth.segments[0].identifier.name, pth.span, tts, it.span, it.attrs, it.ident) } _ => fld.cx.span_bug(it.span, "invalid item macro invocation") - }; + }}); let fm = fresh_mark(); let items = { @@ -706,48 +706,48 @@ pub fn expand_item_mac(it: P<ast::Item>, } Some(rc) => match *rc { - NormalTT(ref expander, span, allow_internal_unstable) => { - if it.ident.name != parse::token::special_idents::invalid.name { + NormalTT(ref expander, tt_span, allow_internal_unstable) => { + if ident.name != parse::token::special_idents::invalid.name { fld.cx .span_err(path_span, &format!("macro {}! expects no ident argument, given '{}'", extname, - it.ident)); + ident)); return SmallVector::zero(); } fld.cx.bt_push(ExpnInfo { - call_site: it.span, + call_site: span, callee: NameAndSpan { format: MacroBang(extname), - span: span, + span: tt_span, allow_internal_unstable: allow_internal_unstable, } }); // mark before expansion: let marked_before = mark_tts(&tts[..], fm); - expander.expand(fld.cx, it.span, &marked_before[..]) + expander.expand(fld.cx, span, &marked_before[..]) } - IdentTT(ref expander, span, allow_internal_unstable) => { - if it.ident.name == parse::token::special_idents::invalid.name { + IdentTT(ref expander, tt_span, allow_internal_unstable) => { + if ident.name == parse::token::special_idents::invalid.name { fld.cx.span_err(path_span, &format!("macro {}! expects an ident argument", extname)); return SmallVector::zero(); } fld.cx.bt_push(ExpnInfo { - call_site: it.span, + call_site: span, callee: NameAndSpan { format: MacroBang(extname), - span: span, + span: tt_span, allow_internal_unstable: allow_internal_unstable, } }); // mark before expansion: let marked_tts = mark_tts(&tts[..], fm); - expander.expand(fld.cx, it.span, it.ident, marked_tts) + expander.expand(fld.cx, span, ident, marked_tts) } MacroRulesTT => { - if it.ident.name == parse::token::special_idents::invalid.name { + if ident.name == parse::token::special_idents::invalid.name { fld.cx.span_err(path_span, &format!("macro_rules! expects an ident argument") ); @@ -755,7 +755,7 @@ pub fn expand_item_mac(it: P<ast::Item>, } fld.cx.bt_push(ExpnInfo { - call_site: it.span, + call_site: span, callee: NameAndSpan { format: MacroBang(extname), span: None, @@ -767,7 +767,7 @@ pub fn expand_item_mac(it: P<ast::Item>, }); // DON'T mark before expansion. - let allow_internal_unstable = attr::contains_name(&it.attrs, + let allow_internal_unstable = attr::contains_name(&attrs, "allow_internal_unstable"); // ensure any #[allow_internal_unstable]s are @@ -777,18 +777,19 @@ pub fn expand_item_mac(it: P<ast::Item>, feature_gate::emit_feature_err( &fld.cx.parse_sess.span_diagnostic, "allow_internal_unstable", - it.span, + span, feature_gate::GateIssue::Language, feature_gate::EXPLAIN_ALLOW_INTERNAL_UNSTABLE) } + let export = attr::contains_name(&attrs, "macro_export"); let def = ast::MacroDef { - ident: it.ident, - attrs: it.attrs.clone(), + ident: ident, + attrs: attrs, id: ast::DUMMY_NODE_ID, - span: it.span, + span: span, imported_from: None, - export: attr::contains_name(&it.attrs, "macro_export"), + export: export, use_locally: true, allow_internal_unstable: allow_internal_unstable, body: tts, @@ -800,7 +801,7 @@ pub fn expand_item_mac(it: P<ast::Item>, return SmallVector::zero(); } _ => { - fld.cx.span_err(it.span, + fld.cx.span_err(span, &format!("{}! is not legal in item position", extname)); return SmallVector::zero(); |
