Skip to content

Commit

Permalink
Move tts instead of cloning in expansion
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Sep 20, 2015
1 parent 6e5a325 commit 8aef16c
Showing 1 changed file with 25 additions and 24 deletions.
49 changes: 25 additions & 24 deletions src/libsyntax/ext/expand.rs
Expand Up @@ -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 = {
Expand All @@ -706,56 +706,56 @@ 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")
);
return SmallVector::zero();
}

fld.cx.bt_push(ExpnInfo {
call_site: it.span,
call_site: span,
callee: NameAndSpan {
format: MacroBang(extname),
span: None,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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();
Expand Down

0 comments on commit 8aef16c

Please sign in to comment.