Shrink Nonterminal
.
By heap allocating the argument within `NtPath`, `NtVis`, and `NtStmt`. This slightly reduces cumulative and peak allocation amounts, most notably on `deep-vector`.
This commit is contained in:
parent
c2afaba465
commit
d9592c2d9f
10 changed files with 18 additions and 16 deletions
|
@ -41,7 +41,7 @@ macro_rules! maybe_whole_expr {
|
|||
return Ok(e);
|
||||
}
|
||||
token::NtPath(path) => {
|
||||
let path = path.clone();
|
||||
let path = (**path).clone();
|
||||
$p.bump();
|
||||
return Ok($p.mk_expr(
|
||||
$p.prev_token.span,
|
||||
|
|
|
@ -1289,7 +1289,7 @@ impl<'a> Parser<'a> {
|
|||
/// so emit a proper diagnostic.
|
||||
// Public for rustfmt usage.
|
||||
pub fn parse_visibility(&mut self, fbt: FollowedByType) -> PResult<'a, Visibility> {
|
||||
maybe_whole!(self, NtVis, |x| x);
|
||||
maybe_whole!(self, NtVis, |x| x.into_inner());
|
||||
|
||||
self.expected_tokens.push(TokenType::Keyword(kw::Crate));
|
||||
if self.is_crate_vis() {
|
||||
|
|
|
@ -118,7 +118,7 @@ impl<'a> Parser<'a> {
|
|||
token::NtBlock(self.collect_tokens_no_attrs(|this| this.parse_block())?)
|
||||
}
|
||||
NonterminalKind::Stmt => match self.parse_stmt(ForceCollect::Yes)? {
|
||||
Some(s) => token::NtStmt(s),
|
||||
Some(s) => token::NtStmt(P(s)),
|
||||
None => {
|
||||
return Err(self.struct_span_err(self.token.span, "expected a statement"));
|
||||
}
|
||||
|
@ -161,11 +161,11 @@ impl<'a> Parser<'a> {
|
|||
return Err(self.struct_span_err(self.token.span, msg));
|
||||
}
|
||||
NonterminalKind::Path => token::NtPath(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_path(PathStyle::Type))?,
|
||||
P(self.collect_tokens_no_attrs(|this| this.parse_path(PathStyle::Type))?),
|
||||
),
|
||||
NonterminalKind::Meta => token::NtMeta(P(self.parse_attr_item(true)?)),
|
||||
NonterminalKind::Vis => token::NtVis(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_visibility(FollowedByType::Yes))?,
|
||||
P(self.collect_tokens_no_attrs(|this| this.parse_visibility(FollowedByType::Yes))?),
|
||||
),
|
||||
NonterminalKind::Lifetime => {
|
||||
if self.check_lifetime() {
|
||||
|
|
|
@ -165,7 +165,7 @@ impl<'a> Parser<'a> {
|
|||
|
||||
maybe_whole!(self, NtPath, |path| {
|
||||
reject_generics_if_mod_style(self, &path);
|
||||
path
|
||||
path.into_inner()
|
||||
});
|
||||
|
||||
if let token::Interpolated(nt) = &self.token.kind {
|
||||
|
|
|
@ -54,7 +54,7 @@ impl<'a> Parser<'a> {
|
|||
stmt.visit_attrs(|stmt_attrs| {
|
||||
attrs.prepend_to_nt_inner(stmt_attrs);
|
||||
});
|
||||
return Ok(Some(stmt));
|
||||
return Ok(Some(stmt.into_inner()));
|
||||
}
|
||||
|
||||
Ok(Some(if self.token.is_keyword(kw::Let) {
|
||||
|
@ -535,7 +535,7 @@ impl<'a> Parser<'a> {
|
|||
recover: AttemptLocalParseRecovery,
|
||||
) -> PResult<'a, Option<Stmt>> {
|
||||
// Skip looking for a trailing semicolon when we have an interpolated statement.
|
||||
maybe_whole!(self, NtStmt, |x| Some(x));
|
||||
maybe_whole!(self, NtStmt, |x| Some(x.into_inner()));
|
||||
|
||||
let Some(mut stmt) = self.parse_stmt_without_recovery(true, ForceCollect::No)? else {
|
||||
return Ok(None);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue