1
Fork 0

Make newtype_index safe

This commit is contained in:
Oliver Scherer 2018-11-03 15:08:27 +01:00
parent 02b22323f1
commit ec6573f33b
14 changed files with 33 additions and 7 deletions

View file

@ -18,6 +18,7 @@ use std::env;
use std::hash::Hash; use std::hash::Hash;
use ty::{self, TyCtxt}; use ty::{self, TyCtxt};
use util::common::{ProfileQueriesMsg, profq_msg}; use util::common::{ProfileQueriesMsg, profq_msg};
use serialize::{Decodable, Decoder};
use ich::{StableHashingContext, StableHashingContextProvider, Fingerprint}; use ich::{StableHashingContext, StableHashingContextProvider, Fingerprint};

View file

@ -13,6 +13,7 @@
use dep_graph::DepNode; use dep_graph::DepNode;
use ich::Fingerprint; use ich::Fingerprint;
use rustc_data_structures::indexed_vec::{IndexVec, Idx}; use rustc_data_structures::indexed_vec::{IndexVec, Idx};
use serialize::{Decodable, Decoder};
newtype_index! { newtype_index! {
pub struct SerializedDepNodeIndex { .. } pub struct SerializedDepNodeIndex { .. }

View file

@ -69,6 +69,7 @@
#![feature(in_band_lifetimes)] #![feature(in_band_lifetimes)]
#![feature(crate_visibility_modifier)] #![feature(crate_visibility_modifier)]
#![feature(transpose_result)] #![feature(transpose_result)]
#![cfg_attr(not(stage0), feature(min_const_unsafe_fn))]
#![recursion_limit="512"] #![recursion_limit="512"]

View file

@ -28,6 +28,7 @@ use syntax::ast;
use syntax_pos::{Span, DUMMY_SP}; use syntax_pos::{Span, DUMMY_SP};
use ty::TyCtxt; use ty::TyCtxt;
use ty::query::Providers; use ty::query::Providers;
use serialize::{Decodable, Decoder};
use hir; use hir;
use hir::Node; use hir::Node;

View file

@ -25,7 +25,7 @@ use rustc_data_structures::graph::{self, GraphPredecessors, GraphSuccessors};
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use rustc_data_structures::sync::MappedReadGuard; use rustc_data_structures::sync::MappedReadGuard;
use rustc_serialize as serialize; use rustc_serialize::{self as serialize, Decodable, Decoder};
use smallvec::SmallVec; use smallvec::SmallVec;
use std::borrow::Cow; use std::borrow::Cow;
use std::fmt::{self, Debug, Formatter, Write}; use std::fmt::{self, Debug, Formatter, Write};

View file

@ -41,7 +41,7 @@ use util::nodemap::{NodeSet, DefIdMap, FxHashMap};
use arena::SyncDroplessArena; use arena::SyncDroplessArena;
use session::DataTypeKind; use session::DataTypeKind;
use serialize::{self, Encodable, Encoder}; use serialize::{self, Encodable, Encoder, Decodable, Decoder};
use std::cell::RefCell; use std::cell::RefCell;
use std::cmp::{self, Ordering}; use std::cmp::{self, Ordering};
use std::fmt; use std::fmt;

View file

@ -29,7 +29,7 @@ use rustc_target::spec::abi;
use syntax::ast::{self, Ident}; use syntax::ast::{self, Ident};
use syntax::symbol::{keywords, InternedString}; use syntax::symbol::{keywords, InternedString};
use serialize; use serialize::{self, Decodable, Decoder};
use hir; use hir;

View file

@ -98,12 +98,18 @@ macro_rules! newtype_index {
@max [$max:expr] @max [$max:expr]
@vis [$v:vis] @vis [$v:vis]
@debug_format [$debug_format:tt]) => ( @debug_format [$debug_format:tt]) => (
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)] #[derive(Copy, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)]
#[rustc_layout_scalar_valid_range_end($max)] #[rustc_layout_scalar_valid_range_end($max)]
$v struct $type { $v struct $type {
private: u32 private: u32
} }
impl Clone for $type {
fn clone(&self) -> Self {
*self
}
}
impl $type { impl $type {
$v const MAX_AS_U32: u32 = $max; $v const MAX_AS_U32: u32 = $max;
@ -145,7 +151,7 @@ macro_rules! newtype_index {
#[inline] #[inline]
$v const unsafe fn from_u32_unchecked(value: u32) -> Self { $v const unsafe fn from_u32_unchecked(value: u32) -> Self {
$type { private: value } unsafe { $type { private: value } }
} }
/// Extract value of this index as an integer. /// Extract value of this index as an integer.
@ -328,12 +334,17 @@ macro_rules! newtype_index {
derive [$($derives:ident,)+] derive [$($derives:ident,)+]
$($tokens:tt)*) => ( $($tokens:tt)*) => (
newtype_index!( newtype_index!(
@derives [$($derives,)+ RustcDecodable, RustcEncodable,] @derives [$($derives,)+ RustcEncodable,]
@type [$type] @type [$type]
@max [$max] @max [$max]
@vis [$v] @vis [$v]
@debug_format [$debug_format] @debug_format [$debug_format]
$($tokens)*); $($tokens)*);
impl Decodable for $type {
fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> {
d.read_u32().into()
}
}
); );
// The case where no derives are added, but encodable is overridden. Don't // The case where no derives are added, but encodable is overridden. Don't
@ -360,12 +371,17 @@ macro_rules! newtype_index {
@debug_format [$debug_format:tt] @debug_format [$debug_format:tt]
$($tokens:tt)*) => ( $($tokens:tt)*) => (
newtype_index!( newtype_index!(
@derives [RustcDecodable, RustcEncodable,] @derives [RustcEncodable,]
@type [$type] @type [$type]
@max [$max] @max [$max]
@vis [$v] @vis [$v]
@debug_format [$debug_format] @debug_format [$debug_format]
$($tokens)*); $($tokens)*);
impl Decodable for $type {
fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> {
d.read_u32().map(Self::from)
}
}
); );
// Rewrite final without comma to one that includes comma // Rewrite final without comma to one that includes comma

View file

@ -10,6 +10,7 @@
use rustc::mir::{BasicBlock, Location, Mir}; use rustc::mir::{BasicBlock, Location, Mir};
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use rustc_serialize::{Decodable, Decoder};
/// Maps between a MIR Location, which identifies a particular /// Maps between a MIR Location, which identifies a particular
/// statement within a basic block, to a "rich location", which /// statement within a basic block, to a "rich location", which

View file

@ -13,6 +13,7 @@ use rustc::ty::RegionVid;
use rustc_data_structures::graph::scc::Sccs; use rustc_data_structures::graph::scc::Sccs;
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use borrow_check::nll::type_check::Locations; use borrow_check::nll::type_check::Locations;
use rustc_serialize::{Decodable, Decoder};
use std::fmt; use std::fmt;
use std::ops::Deref; use std::ops::Deref;

View file

@ -16,6 +16,7 @@ use rustc_data_structures::indexed_vec::Idx;
use rustc_data_structures::indexed_vec::IndexVec; use rustc_data_structures::indexed_vec::IndexVec;
use std::fmt::Debug; use std::fmt::Debug;
use std::rc::Rc; use std::rc::Rc;
use rustc_serialize::{Decodable, Decoder};
/// Maps between a `Location` and a `PointIndex` (and vice versa). /// Maps between a `Location` and a `PointIndex` (and vice versa).
crate struct RegionValueElements { crate struct RegionValueElements {

View file

@ -23,6 +23,7 @@ use rustc::ty::{RegionVid, TyCtxt};
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use util::liveness::LiveVariableMap; use util::liveness::LiveVariableMap;
use rustc_serialize::{Decodable, Decoder};
/// Map between Local and LiveVar indices: the purpose of this /// Map between Local and LiveVar indices: the purpose of this
/// map is to define the subset of local variables for which we need /// map is to define the subset of local variables for which we need

View file

@ -15,6 +15,7 @@ use rustc::mir::{Local, Location, Mir};
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use rustc_data_structures::vec_linked_list as vll; use rustc_data_structures::vec_linked_list as vll;
use util::liveness::{categorize, DefUse, LiveVariableMap}; use util::liveness::{categorize, DefUse, LiveVariableMap};
use rustc_serialize::{Decodable, Decoder};
/// A map that cross references each local with the locations where it /// A map that cross references each local with the locations where it
/// is defined (assigned), used, or dropped. Used during liveness /// is defined (assigned), used, or dropped. Used during liveness

View file

@ -32,6 +32,7 @@ use syntax::ast;
use syntax::attr::{self, UnwindAttr}; use syntax::attr::{self, UnwindAttr};
use syntax::symbol::keywords; use syntax::symbol::keywords;
use syntax_pos::Span; use syntax_pos::Span;
use rustc_serialize::{Decodable, Decoder};
use transform::MirSource; use transform::MirSource;
use util as mir_util; use util as mir_util;