Pre-intern "0", "1", ..., "9", and use where appropriate.
This commit is contained in:
parent
58c68d00fd
commit
9c7d28d4fd
8 changed files with 48 additions and 13 deletions
|
@ -2956,7 +2956,7 @@ impl<'a> LoweringContext<'a> {
|
|||
ident: match f.ident {
|
||||
Some(ident) => ident,
|
||||
// FIXME(jseyfried): positional field hygiene
|
||||
None => Ident::new(Symbol::intern(&index.to_string()), f.span),
|
||||
None => Ident::new(sym::integer(index), f.span),
|
||||
},
|
||||
vis: self.lower_visibility(&f.vis, None),
|
||||
ty: self.lower_ty(&f.ty, ImplTraitContext::disallowed()),
|
||||
|
|
|
@ -5,8 +5,7 @@ use crate::session::CrateDisambiguator;
|
|||
use syntax::ast::*;
|
||||
use syntax::ext::hygiene::Mark;
|
||||
use syntax::visit;
|
||||
use syntax::symbol::kw;
|
||||
use syntax::symbol::Symbol;
|
||||
use syntax::symbol::{kw, sym};
|
||||
use syntax::parse::token::{self, Token};
|
||||
use syntax_pos::Span;
|
||||
|
||||
|
@ -221,7 +220,7 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
|
|||
_: &'a Generics, _: NodeId, _: Span) {
|
||||
for (index, field) in data.fields().iter().enumerate() {
|
||||
let name = field.ident.map(|ident| ident.name)
|
||||
.unwrap_or_else(|| Symbol::intern(&index.to_string()));
|
||||
.unwrap_or_else(|| sym::integer(index));
|
||||
let def = self.create_def(field.id,
|
||||
DefPathData::ValueNs(name.as_interned_str()),
|
||||
field.span);
|
||||
|
|
|
@ -1316,7 +1316,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
|||
|
||||
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
|
||||
let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2)
|
||||
let interior = InteriorField(FieldIndex(i, Name::intern(&i.to_string())));
|
||||
let interior = InteriorField(FieldIndex(i, sym::integer(i)));
|
||||
let subcmt = Rc::new(
|
||||
self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior));
|
||||
self.cat_pattern_(subcmt, &subpat, op)?;
|
||||
|
@ -1363,7 +1363,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
|||
};
|
||||
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
|
||||
let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2)
|
||||
let interior = InteriorField(FieldIndex(i, Name::intern(&i.to_string())));
|
||||
let interior = InteriorField(FieldIndex(i, sym::integer(i)));
|
||||
let subcmt = Rc::new(
|
||||
self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior));
|
||||
self.cat_pattern_(subcmt, &subpat, op)?;
|
||||
|
|
|
@ -96,6 +96,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {
|
|||
|
||||
let mut keyword_stream = quote! {};
|
||||
let mut symbols_stream = quote! {};
|
||||
let mut digits_stream = quote! {};
|
||||
let mut prefill_stream = quote! {};
|
||||
let mut counter = 0u32;
|
||||
let mut keys = HashSet::<String>::new();
|
||||
|
@ -106,6 +107,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {
|
|||
}
|
||||
};
|
||||
|
||||
// Generate the listed keywords.
|
||||
for keyword in &input.keywords.0 {
|
||||
let name = &keyword.name;
|
||||
let value = &keyword.value;
|
||||
|
@ -119,6 +121,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {
|
|||
counter += 1;
|
||||
}
|
||||
|
||||
// Generate the listed symbols.
|
||||
for symbol in &input.symbols.0 {
|
||||
let name = &symbol.name;
|
||||
let value = match &symbol.value {
|
||||
|
@ -135,6 +138,19 @@ pub fn symbols(input: TokenStream) -> TokenStream {
|
|||
counter += 1;
|
||||
}
|
||||
|
||||
// Generate symbols for the strings "0", "1", ..., "9".
|
||||
for n in 0..10 {
|
||||
let n = n.to_string();
|
||||
check_dup(&n);
|
||||
prefill_stream.extend(quote! {
|
||||
#n,
|
||||
});
|
||||
digits_stream.extend(quote! {
|
||||
Symbol::new(#counter),
|
||||
});
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
let tt = TokenStream::from(quote! {
|
||||
macro_rules! keywords {
|
||||
() => {
|
||||
|
@ -145,6 +161,10 @@ pub fn symbols(input: TokenStream) -> TokenStream {
|
|||
macro_rules! symbols {
|
||||
() => {
|
||||
#symbols_stream
|
||||
|
||||
pub const digits_array: &[Symbol; 10] = &[
|
||||
#digits_stream
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ use std::fmt::Write;
|
|||
use std::hash::Hash;
|
||||
use std::ops::RangeInclusive;
|
||||
|
||||
use syntax_pos::symbol::Symbol;
|
||||
use syntax_pos::symbol::{sym, Symbol};
|
||||
use rustc::hir;
|
||||
use rustc::ty::layout::{self, Size, Align, TyLayout, LayoutOf, VariantIdx};
|
||||
use rustc::ty;
|
||||
|
@ -188,7 +188,7 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> ValidityVisitor<'rt, 'a, '
|
|||
|
||||
PathElem::ClosureVar(name.unwrap_or_else(|| {
|
||||
// Fall back to showing the field index.
|
||||
Symbol::intern(&field.to_string())
|
||||
sym::integer(field)
|
||||
}))
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use crate::ast::{self, Ident};
|
||||
use crate::parse::ParseSess;
|
||||
use crate::parse::token::{self, Token};
|
||||
use crate::symbol::Symbol;
|
||||
use crate::symbol::{sym, Symbol};
|
||||
use crate::parse::unescape;
|
||||
use crate::parse::unescape_error_reporting::{emit_unescape_error, push_escaped_char};
|
||||
|
||||
|
@ -754,7 +754,7 @@ impl<'a> StringReader<'a> {
|
|||
}
|
||||
_ => {
|
||||
// just a 0
|
||||
return (token::Integer, self.name_from(start_bpos));
|
||||
return (token::Integer, sym::integer(0));
|
||||
}
|
||||
}
|
||||
} else if c.is_digit(10) {
|
||||
|
|
|
@ -197,7 +197,7 @@ impl LitKind {
|
|||
ast::LitIntType::Signed(ty) => Some(Symbol::intern(ty.ty_to_string())),
|
||||
ast::LitIntType::Unsuffixed => None,
|
||||
};
|
||||
(token::Integer, Symbol::intern(&n.to_string()), suffix)
|
||||
(token::Integer, sym::integer(n), suffix)
|
||||
}
|
||||
LitKind::Float(symbol, ty) => {
|
||||
(token::Float, symbol, Some(Symbol::intern(ty.ty_to_string())))
|
||||
|
|
|
@ -9,10 +9,10 @@ use rustc_data_structures::newtype_index;
|
|||
use rustc_macros::symbols;
|
||||
use serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||
|
||||
use std::fmt;
|
||||
use std::str;
|
||||
use std::cmp::{PartialEq, Ordering, PartialOrd, Ord};
|
||||
use std::fmt;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::str;
|
||||
|
||||
use crate::hygiene::SyntaxContext;
|
||||
use crate::{Span, DUMMY_SP, GLOBALS};
|
||||
|
@ -102,6 +102,9 @@ symbols! {
|
|||
// Symbols that can be referred to with syntax_pos::sym::*. The symbol is
|
||||
// the stringified identifier unless otherwise specified (e.g.
|
||||
// `proc_dash_macro` represents "proc-macro").
|
||||
//
|
||||
// As well as the symbols listed, there are symbols for the the strings
|
||||
// "0", "1", ..., "9", which are accessible via `sym::integer`.
|
||||
Symbols {
|
||||
aarch64_target_feature,
|
||||
abi,
|
||||
|
@ -966,8 +969,21 @@ pub mod kw {
|
|||
|
||||
// This module has a very short name because it's used a lot.
|
||||
pub mod sym {
|
||||
use std::convert::TryInto;
|
||||
use super::Symbol;
|
||||
|
||||
symbols!();
|
||||
|
||||
// Get the symbol for an integer. The first few non-negative integers each
|
||||
// have a static symbol and therefore are fast.
|
||||
pub fn integer<N: TryInto<usize> + Copy + ToString>(n: N) -> Symbol {
|
||||
if let Result::Ok(idx) = n.try_into() {
|
||||
if let Option::Some(&sym) = digits_array.get(idx) {
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
Symbol::intern(&n.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl Symbol {
|
||||
|
|
Loading…
Add table
Reference in a new issue