Auto merge of #60815 - nnethercote:use-Symbol-more-2, r=petrochenkov

Use `Symbol` even more

These patches simplify the code a bit (fewer conversions) and also speed things up a bit (fewer `with_interner` calls).

r? @petrochenkov
This commit is contained in:
bors 2019-05-20 03:36:43 +00:00
commit caef1e833f
20 changed files with 96 additions and 90 deletions

View File

@ -609,9 +609,9 @@ impl Generics {
own_counts own_counts
} }
pub fn get_named(&self, name: &InternedString) -> Option<&GenericParam> { pub fn get_named(&self, name: InternedString) -> Option<&GenericParam> {
for param in &self.params { for param in &self.params {
if *name == param.name.ident().as_interned_str() { if name == param.name.ident().as_interned_str() {
return Some(param); return Some(param);
} }
} }

View File

@ -194,20 +194,20 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
let mut sp = cm.def_span(self.hir().span_by_hir_id(node)); let mut sp = cm.def_span(self.hir().span_by_hir_id(node));
if let Some(param) = self.hir() if let Some(param) = self.hir()
.get_generics(scope) .get_generics(scope)
.and_then(|generics| generics.get_named(&br.name)) .and_then(|generics| generics.get_named(br.name))
{ {
sp = param.span; sp = param.span;
} }
(format!("the lifetime {} as defined on", br.name), sp) (format!("the lifetime {} as defined on", br.name), sp)
} }
ty::ReFree(ty::FreeRegion { ty::ReFree(ty::FreeRegion {
bound_region: ty::BoundRegion::BrNamed(_, ref name), bound_region: ty::BoundRegion::BrNamed(_, name),
.. ..
}) => { }) => {
let mut sp = cm.def_span(self.hir().span_by_hir_id(node)); let mut sp = cm.def_span(self.hir().span_by_hir_id(node));
if let Some(param) = self.hir() if let Some(param) = self.hir()
.get_generics(scope) .get_generics(scope)
.and_then(|generics| generics.get_named(&name)) .and_then(|generics| generics.get_named(name))
{ {
sp = param.span; sp = param.span;
} }

View File

@ -43,7 +43,7 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> {
) -> Option<AnonymousArgInfo<'_>> { ) -> Option<AnonymousArgInfo<'_>> {
let (id, bound_region) = match *anon_region { let (id, bound_region) = match *anon_region {
ty::ReFree(ref free_region) => (free_region.scope, free_region.bound_region), ty::ReFree(ref free_region) => (free_region.scope, free_region.bound_region),
ty::ReEarlyBound(ref ebr) => ( ty::ReEarlyBound(ebr) => (
self.tcx().parent(ebr.def_id).unwrap(), self.tcx().parent(ebr.def_id).unwrap(),
ty::BoundRegion::BrNamed(ebr.def_id, ebr.name), ty::BoundRegion::BrNamed(ebr.def_id, ebr.name),
), ),

View File

@ -828,8 +828,8 @@ impl<'a, 'tcx> LateContext<'a, 'tcx> {
// This shouldn't ever be needed, but just in case: // This shouldn't ever be needed, but just in case:
Ok(vec![match trait_ref { Ok(vec![match trait_ref {
Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)).as_str(), Some(trait_ref) => LocalInternedString::intern(&format!("{:?}", trait_ref)),
None => Symbol::intern(&format!("<{}>", self_ty)).as_str(), None => LocalInternedString::intern(&format!("<{}>", self_ty)),
}]) }])
} }
@ -845,9 +845,10 @@ impl<'a, 'tcx> LateContext<'a, 'tcx> {
// This shouldn't ever be needed, but just in case: // This shouldn't ever be needed, but just in case:
path.push(match trait_ref { path.push(match trait_ref {
Some(trait_ref) => { Some(trait_ref) => {
Symbol::intern(&format!("<impl {} for {}>", trait_ref, self_ty)).as_str() LocalInternedString::intern(&format!("<impl {} for {}>", trait_ref,
self_ty))
}, },
None => Symbol::intern(&format!("<impl {}>", self_ty)).as_str(), None => LocalInternedString::intern(&format!("<impl {}>", self_ty)),
}); });
Ok(path) Ok(path)

View File

@ -1,6 +1,6 @@
use crate::hir::def_id::{DefId, CrateNum, LOCAL_CRATE}; use crate::hir::def_id::{DefId, CrateNum, LOCAL_CRATE};
use crate::hir::HirId; use crate::hir::HirId;
use syntax::symbol::{Symbol, InternedString}; use syntax::symbol::InternedString;
use crate::ty::{Instance, TyCtxt}; use crate::ty::{Instance, TyCtxt};
use crate::util::nodemap::FxHashMap; use crate::util::nodemap::FxHashMap;
use rustc_data_structures::base_n; use rustc_data_structures::base_n;
@ -280,7 +280,7 @@ impl<'a, 'gcx: 'tcx, 'tcx: 'a> CodegenUnitNameBuilder<'a, 'gcx, 'tcx> {
cgu_name cgu_name
} else { } else {
let cgu_name = &cgu_name.as_str()[..]; let cgu_name = &cgu_name.as_str()[..];
Symbol::intern(&CodegenUnit::mangle_name(cgu_name)).as_interned_str() InternedString::intern(&CodegenUnit::mangle_name(cgu_name))
} }
} }
@ -336,6 +336,6 @@ impl<'a, 'gcx: 'tcx, 'tcx: 'a> CodegenUnitNameBuilder<'a, 'gcx, 'tcx> {
write!(cgu_name, ".{}", special_suffix).unwrap(); write!(cgu_name, ".{}", special_suffix).unwrap();
} }
Symbol::intern(&cgu_name[..]).as_interned_str() InternedString::intern(&cgu_name[..])
} }
} }

View File

@ -18,7 +18,8 @@ use crate::ty::{self, Ty, TyCtxt, TypeFoldable, Predicate, ToPredicate};
use crate::ty::subst::{Subst, InternalSubsts}; use crate::ty::subst::{Subst, InternalSubsts};
use std::borrow::Cow; use std::borrow::Cow;
use std::iter::{self}; use std::iter::{self};
use syntax::ast::{self, Name}; use syntax::ast::{self};
use syntax::symbol::InternedString;
use syntax_pos::Span; use syntax_pos::Span;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
@ -539,7 +540,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
// are implemented // are implemented
let unsized_self_ty: Ty<'tcx> = self.mk_ty_param( let unsized_self_ty: Ty<'tcx> = self.mk_ty_param(
::std::u32::MAX, ::std::u32::MAX,
Name::intern("RustaceansAreAwesome").as_interned_str(), InternedString::intern("RustaceansAreAwesome"),
); );
// `Receiver[Self => U]` // `Receiver[Self => U]`

View File

@ -312,17 +312,15 @@ impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector {
} }
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool { fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
use syntax::symbol::Symbol;
match t.sty { match t.sty {
ty::Bound(debruijn, bound_ty) if debruijn == self.binder_index => { ty::Bound(debruijn, bound_ty) if debruijn == self.binder_index => {
self.types.insert( self.types.insert(
bound_ty.var.as_u32(), bound_ty.var.as_u32(),
match bound_ty.kind { match bound_ty.kind {
ty::BoundTyKind::Param(name) => name, ty::BoundTyKind::Param(name) => name,
ty::BoundTyKind::Anon => Symbol::intern( ty::BoundTyKind::Anon =>
&format!("^{}", bound_ty.var.as_u32()) InternedString::intern(&format!("^{}", bound_ty.var.as_u32()),
).as_interned_str(), ),
} }
); );
} }
@ -334,8 +332,6 @@ impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector {
} }
fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
use syntax::symbol::Symbol;
match r { match r {
ty::ReLateBound(index, br) if *index == self.binder_index => { ty::ReLateBound(index, br) if *index == self.binder_index => {
match br { match br {
@ -344,9 +340,7 @@ impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector {
} }
ty::BoundRegion::BrAnon(var) => { ty::BoundRegion::BrAnon(var) => {
self.regions.insert(Symbol::intern( self.regions.insert(InternedString::intern(&format!("'^{}", var)));
&format!("'^{}", var)
).as_interned_str());
} }
_ => (), _ => (),

View File

@ -3405,7 +3405,7 @@ impl_stable_hash_for!(struct self::SymbolName {
impl SymbolName { impl SymbolName {
pub fn new(name: &str) -> SymbolName { pub fn new(name: &str) -> SymbolName {
SymbolName { SymbolName {
name: Symbol::intern(name).as_interned_str() name: InternedString::intern(name)
} }
} }

View File

@ -7,10 +7,8 @@ use crate::middle::region;
use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable}; use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable};
use crate::ty::subst::{Kind, Subst, UnpackedKind}; use crate::ty::subst::{Kind, Subst, UnpackedKind};
use crate::mir::interpret::ConstValue; use crate::mir::interpret::ConstValue;
use syntax::symbol::{keywords, Symbol};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
use syntax::symbol::InternedString; use syntax::symbol::{keywords, InternedString};
use std::cell::Cell; use std::cell::Cell;
use std::fmt::{self, Write as _}; use std::fmt::{self, Write as _};
@ -1285,10 +1283,10 @@ impl<F: fmt::Write> FmtPrinter<'_, 'gcx, 'tcx, F> {
{ {
fn name_by_region_index(index: usize) -> InternedString { fn name_by_region_index(index: usize) -> InternedString {
match index { match index {
0 => Symbol::intern("'r"), 0 => InternedString::intern("'r"),
1 => Symbol::intern("'s"), 1 => InternedString::intern("'s"),
i => Symbol::intern(&format!("'t{}", i-2)), i => InternedString::intern(&format!("'t{}", i-2)),
}.as_interned_str() }
} }
// Replace any anonymous late-bound regions with named // Replace any anonymous late-bound regions with named

View File

@ -1,7 +1,7 @@
use crate::ty::{self, Ty, TyCtxt, AdtSizedConstraint}; use crate::ty::{self, Ty, TyCtxt, AdtSizedConstraint};
use crate::ty::util::NeedsDrop; use crate::ty::util::NeedsDrop;
use syntax::symbol::Symbol; use syntax::symbol::InternedString;
pub(super) trait Value<'tcx>: Sized { pub(super) trait Value<'tcx>: Sized {
fn from_cycle_error<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Self; fn from_cycle_error<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Self;
@ -28,7 +28,7 @@ impl<'tcx> Value<'tcx> for Ty<'tcx> {
impl<'tcx> Value<'tcx> for ty::SymbolName { impl<'tcx> Value<'tcx> for ty::SymbolName {
fn from_cycle_error<'a>(_: TyCtxt<'a, 'tcx, 'tcx>) -> Self { fn from_cycle_error<'a>(_: TyCtxt<'a, 'tcx, 'tcx>) -> Self {
ty::SymbolName { name: Symbol::intern("<error>").as_interned_str() } ty::SymbolName { name: InternedString::intern("<error>") }
} }
} }

View File

@ -1136,7 +1136,7 @@ impl<'a, 'gcx, 'tcx> ParamTy {
// FIXME(#50125): Ignoring `Self` with `index != 0` might lead to weird behavior elsewhere, // FIXME(#50125): Ignoring `Self` with `index != 0` might lead to weird behavior elsewhere,
// but this should only be possible when using `-Z continue-parse-after-error` like // but this should only be possible when using `-Z continue-parse-after-error` like
// `compile-fail/issue-36638.rs`. // `compile-fail/issue-36638.rs`.
self.name == keywords::SelfUpper.name().as_str() && self.index == 0 self.name.as_symbol() == keywords::SelfUpper.name() && self.index == 0
} }
} }

View File

@ -20,7 +20,7 @@ use rustc::ty::layout::{self, LayoutOf, HasTyCtxt, Primitive};
use rustc_codegen_ssa::common::{IntPredicate, TypeKind}; use rustc_codegen_ssa::common::{IntPredicate, TypeKind};
use rustc::hir; use rustc::hir;
use syntax::ast::{self, FloatTy}; use syntax::ast::{self, FloatTy};
use syntax::symbol::Symbol; use syntax::symbol::LocalInternedString;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
@ -213,7 +213,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
} }
"type_name" => { "type_name" => {
let tp_ty = substs.type_at(0); let tp_ty = substs.type_at(0);
let ty_name = Symbol::intern(&tp_ty.to_string()).as_str(); let ty_name = LocalInternedString::intern(&tp_ty.to_string());
self.const_str_slice(ty_name) self.const_str_slice(ty_name)
} }
"type_id" => { "type_id" => {

View File

@ -15,7 +15,7 @@ use crate::traits::*;
use std::borrow::Cow; use std::borrow::Cow;
use syntax::symbol::Symbol; use syntax::symbol::LocalInternedString;
use syntax_pos::Pos; use syntax_pos::Pos;
use super::{FunctionCx, LocalRef}; use super::{FunctionCx, LocalRef};
@ -401,7 +401,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
// Get the location information. // Get the location information.
let loc = bx.sess().source_map().lookup_char_pos(span.lo()); let loc = bx.sess().source_map().lookup_char_pos(span.lo());
let filename = Symbol::intern(&loc.file.name.to_string()).as_str(); let filename = LocalInternedString::intern(&loc.file.name.to_string());
let line = bx.const_u32(loc.line as u32); let line = bx.const_u32(loc.line as u32);
let col = bx.const_u32(loc.col.to_usize() as u32 + 1); let col = bx.const_u32(loc.col.to_usize() as u32 + 1);
@ -423,7 +423,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
} }
_ => { _ => {
let str = msg.description(); let str = msg.description();
let msg_str = Symbol::intern(str).as_str(); let msg_str = LocalInternedString::intern(str);
let msg_file_line_col = bx.static_panic_msg( let msg_file_line_col = bx.static_panic_msg(
Some(msg_str), Some(msg_str),
filename, filename,
@ -535,7 +535,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let layout = bx.layout_of(ty); let layout = bx.layout_of(ty);
if layout.abi.is_uninhabited() { if layout.abi.is_uninhabited() {
let loc = bx.sess().source_map().lookup_char_pos(span.lo()); let loc = bx.sess().source_map().lookup_char_pos(span.lo());
let filename = Symbol::intern(&loc.file.name.to_string()).as_str(); let filename = LocalInternedString::intern(&loc.file.name.to_string());
let line = bx.const_u32(loc.line as u32); let line = bx.const_u32(loc.line as u32);
let col = bx.const_u32(loc.col.to_usize() as u32 + 1); let col = bx.const_u32(loc.col.to_usize() as u32 + 1);
@ -543,7 +543,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
"Attempted to instantiate uninhabited type {}", "Attempted to instantiate uninhabited type {}",
ty ty
); );
let msg_str = Symbol::intern(&str).as_str(); let msg_str = LocalInternedString::intern(&str);
let msg_file_line_col = bx.static_panic_msg( let msg_file_line_col = bx.static_panic_msg(
Some(msg_str), Some(msg_str),
filename, filename,

View File

@ -101,7 +101,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_mir::monomorphize::item::{InstantiationMode, MonoItem, MonoItemExt}; use rustc_mir::monomorphize::item::{InstantiationMode, MonoItem, MonoItemExt};
use rustc_mir::monomorphize::Instance; use rustc_mir::monomorphize::Instance;
use syntax_pos::symbol::{Symbol, InternedString}; use syntax_pos::symbol::InternedString;
use log::debug; use log::debug;
@ -238,13 +238,13 @@ fn compute_symbol_name(tcx: TyCtxt<'_, 'tcx, 'tcx>, instance: Instance<'tcx>) ->
if def_id.is_local() { if def_id.is_local() {
if tcx.plugin_registrar_fn(LOCAL_CRATE) == Some(def_id) { if tcx.plugin_registrar_fn(LOCAL_CRATE) == Some(def_id) {
let disambiguator = tcx.sess.local_crate_disambiguator(); let disambiguator = tcx.sess.local_crate_disambiguator();
return Symbol::intern(&tcx.sess.generate_plugin_registrar_symbol(disambiguator)) return
.as_interned_str(); InternedString::intern(&tcx.sess.generate_plugin_registrar_symbol(disambiguator));
} }
if tcx.proc_macro_decls_static(LOCAL_CRATE) == Some(def_id) { if tcx.proc_macro_decls_static(LOCAL_CRATE) == Some(def_id) {
let disambiguator = tcx.sess.local_crate_disambiguator(); let disambiguator = tcx.sess.local_crate_disambiguator();
return Symbol::intern(&tcx.sess.generate_proc_macro_decls_symbol(disambiguator)) return
.as_interned_str(); InternedString::intern(&tcx.sess.generate_proc_macro_decls_symbol(disambiguator));
} }
} }
@ -322,7 +322,7 @@ fn compute_symbol_name(tcx: TyCtxt<'_, 'tcx, 'tcx>, instance: Instance<'tcx>) ->
let _ = printer.write_str("{{vtable-shim}}"); let _ = printer.write_str("{{vtable-shim}}");
} }
Symbol::intern(&printer.path.finish(hash)).as_interned_str() InternedString::intern(&printer.path.finish(hash))
} }
// Follow C++ namespace-mangling style, see // Follow C++ namespace-mangling style, see

View File

@ -12,7 +12,6 @@ use rustc::ty::subst::{SubstsRef, UnpackedKind};
use rustc::ty::{self, RegionKind, RegionVid, Ty, TyCtxt}; use rustc::ty::{self, RegionKind, RegionVid, Ty, TyCtxt};
use rustc::ty::print::RegionHighlightMode; use rustc::ty::print::RegionHighlightMode;
use rustc_errors::DiagnosticBuilder; use rustc_errors::DiagnosticBuilder;
use syntax::ast::Name;
use syntax::symbol::keywords; use syntax::symbol::keywords;
use syntax_pos::Span; use syntax_pos::Span;
use syntax_pos::symbol::InternedString; use syntax_pos::symbol::InternedString;
@ -60,8 +59,8 @@ impl RegionName {
} }
#[allow(dead_code)] #[allow(dead_code)]
crate fn name(&self) -> &InternedString { crate fn name(&self) -> InternedString {
&self.name self.name
} }
crate fn highlight_region_name( crate fn highlight_region_name(
@ -206,7 +205,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
match error_region { match error_region {
ty::ReEarlyBound(ebr) => { ty::ReEarlyBound(ebr) => {
if ebr.has_name() { if ebr.has_name() {
let span = self.get_named_span(tcx, error_region, &ebr.name); let span = self.get_named_span(tcx, error_region, ebr.name);
Some(RegionName { Some(RegionName {
name: ebr.name, name: ebr.name,
source: RegionNameSource::NamedEarlyBoundRegion(span) source: RegionNameSource::NamedEarlyBoundRegion(span)
@ -223,7 +222,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
ty::ReFree(free_region) => match free_region.bound_region { ty::ReFree(free_region) => match free_region.bound_region {
ty::BoundRegion::BrNamed(_, name) => { ty::BoundRegion::BrNamed(_, name) => {
let span = self.get_named_span(tcx, error_region, &name); let span = self.get_named_span(tcx, error_region, name);
Some(RegionName { Some(RegionName {
name, name,
source: RegionNameSource::NamedFreeRegion(span), source: RegionNameSource::NamedFreeRegion(span),
@ -306,7 +305,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
&self, &self,
tcx: TyCtxt<'_, '_, 'tcx>, tcx: TyCtxt<'_, '_, 'tcx>,
error_region: &RegionKind, error_region: &RegionKind,
name: &InternedString, name: InternedString,
) -> Span { ) -> Span {
let scope = error_region.free_region_binding_scope(tcx); let scope = error_region.free_region_binding_scope(tcx);
let node = tcx.hir().as_local_hir_id(scope).unwrap_or(hir::DUMMY_HIR_ID); let node = tcx.hir().as_local_hir_id(scope).unwrap_or(hir::DUMMY_HIR_ID);
@ -791,6 +790,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
let c = *counter; let c = *counter;
*counter += 1; *counter += 1;
Name::intern(&format!("'{:?}", c)).as_interned_str() InternedString::intern(&format!("'{:?}", c))
} }
} }

View File

@ -10,7 +10,7 @@ use syntax::attr::InlineAttr;
use std::fmt::{self, Write}; use std::fmt::{self, Write};
use std::iter; use std::iter;
use rustc::mir::mono::Linkage; use rustc::mir::mono::Linkage;
use syntax_pos::symbol::Symbol; use syntax_pos::symbol::InternedString;
use syntax::source_map::Span; use syntax::source_map::Span;
pub use rustc::mir::mono::MonoItem; pub use rustc::mir::mono::MonoItem;
@ -61,7 +61,7 @@ pub trait MonoItemExt<'a, 'tcx>: fmt::Debug {
MonoItem::GlobalAsm(hir_id) => { MonoItem::GlobalAsm(hir_id) => {
let def_id = tcx.hir().local_def_id_from_hir_id(hir_id); let def_id = tcx.hir().local_def_id_from_hir_id(hir_id);
ty::SymbolName { ty::SymbolName {
name: Symbol::intern(&format!("global_asm_{:?}", def_id)).as_interned_str() name: InternedString::intern(&format!("global_asm_{:?}", def_id))
} }
} }
} }

View File

@ -12,7 +12,7 @@ use rustc::lint::builtin::{SAFE_EXTERN_STATICS, SAFE_PACKED_BORROWS, UNUSED_UNSA
use rustc::mir::*; use rustc::mir::*;
use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext}; use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext};
use syntax::symbol::{Symbol, sym}; use syntax::symbol::{InternedString, sym};
use std::ops::Bound; use std::ops::Bound;
@ -167,9 +167,9 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
(CastTy::FnPtr, CastTy::Int(_)) => { (CastTy::FnPtr, CastTy::Int(_)) => {
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info: self.source_info, source_info: self.source_info,
description: Symbol::intern("cast of pointer to int").as_interned_str(), description: InternedString::intern("cast of pointer to int"),
details: Symbol::intern("casting pointers to integers in constants") details: InternedString::intern(
.as_interned_str(), "casting pointers to integers in constants"),
kind: UnsafetyViolationKind::General, kind: UnsafetyViolationKind::General,
}], &[]); }], &[]);
}, },
@ -185,9 +185,8 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(self.mir, self.tcx).sty { if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(self.mir, self.tcx).sty {
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info: self.source_info, source_info: self.source_info,
description: Symbol::intern("pointer operation").as_interned_str(), description: InternedString::intern("pointer operation"),
details: Symbol::intern("operations on pointers in constants") details: InternedString::intern("operations on pointers in constants"),
.as_interned_str(),
kind: UnsafetyViolationKind::General, kind: UnsafetyViolationKind::General,
}], &[]); }], &[]);
} }
@ -212,13 +211,11 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
self.source_scope_local_data[source_info.scope].lint_root; self.source_scope_local_data[source_info.scope].lint_root;
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info, source_info,
description: Symbol::intern("borrow of packed field").as_interned_str(), description: InternedString::intern("borrow of packed field"),
details: details: InternedString::intern(
Symbol::intern("fields of packed structs might be misaligned: \ "fields of packed structs might be misaligned: dereferencing a \
dereferencing a misaligned pointer or even just \ misaligned pointer or even just creating a misaligned reference \
creating a misaligned reference is undefined \ is undefined behavior"),
behavior")
.as_interned_str(),
kind: UnsafetyViolationKind::BorrowPacked(lint_root) kind: UnsafetyViolationKind::BorrowPacked(lint_root)
}], &[]); }], &[]);
} }
@ -315,12 +312,10 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
self.source_scope_local_data[source_info.scope].lint_root; self.source_scope_local_data[source_info.scope].lint_root;
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info, source_info,
description: Symbol::intern("use of extern static").as_interned_str(), description: InternedString::intern("use of extern static"),
details: details: InternedString::intern(
Symbol::intern("extern statics are not controlled by the Rust type \ "extern statics are not controlled by the Rust type system: invalid \
system: invalid data, aliasing violations or data \ data, aliasing violations or data races will cause undefined behavior"),
races will cause undefined behavior")
.as_interned_str(),
kind: UnsafetyViolationKind::ExternStatic(lint_root) kind: UnsafetyViolationKind::ExternStatic(lint_root)
}], &[]); }], &[]);
} }
@ -340,8 +335,8 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
let source_info = self.source_info; let source_info = self.source_info;
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info, source_info,
description: Symbol::intern(description).as_interned_str(), description: InternedString::intern(description),
details: Symbol::intern(details).as_interned_str(), details: InternedString::intern(details),
kind, kind,
}], &[]); }], &[]);
} }
@ -441,8 +436,8 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
let source_info = self.source_info; let source_info = self.source_info;
self.register_violations(&[UnsafetyViolation { self.register_violations(&[UnsafetyViolation {
source_info, source_info,
description: Symbol::intern(description).as_interned_str(), description: InternedString::intern(description),
details: Symbol::intern(details).as_interned_str(), details: InternedString::intern(details),
kind: UnsafetyViolationKind::GeneralAndConstFn, kind: UnsafetyViolationKind::GeneralAndConstFn,
}], &[]); }], &[]);
} }

View File

@ -7,7 +7,7 @@ use rustc::ty::subst::Subst;
use crate::require_same_types; use crate::require_same_types;
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
use syntax::symbol::Symbol; use syntax::symbol::InternedString;
use rustc::hir; use rustc::hir;
@ -80,7 +80,7 @@ pub fn intrisic_operation_unsafety(intrinsic: &str) -> hir::Unsafety {
/// and in libcore/intrinsics.rs /// and in libcore/intrinsics.rs
pub fn check_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, pub fn check_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
it: &hir::ForeignItem) { it: &hir::ForeignItem) {
let param = |n| tcx.mk_ty_param(n, Symbol::intern(&format!("P{}", n)).as_interned_str()); let param = |n| tcx.mk_ty_param(n, InternedString::intern(&format!("P{}", n)));
let name = it.ident.as_str(); let name = it.ident.as_str();
let mk_va_list_ty = || { let mk_va_list_ty = || {
@ -397,7 +397,7 @@ pub fn check_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
pub fn check_platform_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, pub fn check_platform_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
it: &hir::ForeignItem) { it: &hir::ForeignItem) {
let param = |n| { let param = |n| {
let name = Symbol::intern(&format!("P{}", n)).as_interned_str(); let name = InternedString::intern(&format!("P{}", n));
tcx.mk_ty_param(n, name) tcx.mk_ty_param(n, name)
}; };

View File

@ -39,7 +39,7 @@ use syntax::ast::{Ident, MetaItemKind};
use syntax::attr::{InlineAttr, OptimizeAttr, list_contains_name, mark_used}; use syntax::attr::{InlineAttr, OptimizeAttr, list_contains_name, mark_used};
use syntax::source_map::Spanned; use syntax::source_map::Spanned;
use syntax::feature_gate; use syntax::feature_gate;
use syntax::symbol::{keywords, Symbol, sym}; use syntax::symbol::{InternedString, keywords, Symbol, sym};
use syntax_pos::{Span, DUMMY_SP}; use syntax_pos::{Span, DUMMY_SP};
use rustc::hir::def::{CtorKind, Res, DefKind}; use rustc::hir::def::{CtorKind, Res, DefKind};
@ -1082,7 +1082,7 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty
.enumerate() .enumerate()
.map(|(i, &arg)| ty::GenericParamDef { .map(|(i, &arg)| ty::GenericParamDef {
index: type_start + i as u32, index: type_start + i as u32,
name: Symbol::intern(arg).as_interned_str(), name: InternedString::intern(arg),
def_id, def_id,
pure_wrt_drop: false, pure_wrt_drop: false,
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {
@ -1097,7 +1097,7 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty
params.extend(upvars.iter().zip((dummy_args.len() as u32)..).map(|(_, i)| { params.extend(upvars.iter().zip((dummy_args.len() as u32)..).map(|(_, i)| {
ty::GenericParamDef { ty::GenericParamDef {
index: type_start + i, index: type_start + i,
name: Symbol::intern("<upvar>").as_interned_str(), name: InternedString::intern("<upvar>"),
def_id, def_id,
pure_wrt_drop: false, pure_wrt_drop: false,
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {

View File

@ -1036,6 +1036,17 @@ pub struct LocalInternedString {
} }
impl LocalInternedString { impl LocalInternedString {
/// Maps a string to its interned representation.
pub fn intern(string: &str) -> Self {
let string = with_interner(|interner| {
let symbol = interner.intern(string);
interner.strings[symbol.0.as_usize()]
});
LocalInternedString {
string: unsafe { std::mem::transmute::<&str, &str>(string) }
}
}
pub fn as_interned_str(self) -> InternedString { pub fn as_interned_str(self) -> InternedString {
InternedString { InternedString {
symbol: Symbol::intern(self.string) symbol: Symbol::intern(self.string)
@ -1112,7 +1123,7 @@ impl fmt::Display for LocalInternedString {
impl Decodable for LocalInternedString { impl Decodable for LocalInternedString {
fn decode<D: Decoder>(d: &mut D) -> Result<LocalInternedString, D::Error> { fn decode<D: Decoder>(d: &mut D) -> Result<LocalInternedString, D::Error> {
Ok(Symbol::intern(&d.read_str()?).as_str()) Ok(LocalInternedString::intern(&d.read_str()?))
} }
} }
@ -1141,6 +1152,13 @@ pub struct InternedString {
} }
impl InternedString { impl InternedString {
/// Maps a string to its interned representation.
pub fn intern(string: &str) -> Self {
InternedString {
symbol: Symbol::intern(string)
}
}
pub fn with<F: FnOnce(&str) -> R, R>(self, f: F) -> R { pub fn with<F: FnOnce(&str) -> R, R>(self, f: F) -> R {
let str = with_interner(|interner| { let str = with_interner(|interner| {
interner.get(self.symbol) as *const str interner.get(self.symbol) as *const str
@ -1243,7 +1261,7 @@ impl fmt::Display for InternedString {
impl Decodable for InternedString { impl Decodable for InternedString {
fn decode<D: Decoder>(d: &mut D) -> Result<InternedString, D::Error> { fn decode<D: Decoder>(d: &mut D) -> Result<InternedString, D::Error> {
Ok(Symbol::intern(&d.read_str()?).as_interned_str()) Ok(InternedString::intern(&d.read_str()?))
} }
} }