diff options
| author | Bruno Dutra <brunocodutra@gmail.com> | 2018-08-11 19:08:14 +0200 |
|---|---|---|
| committer | Bruno Dutra <brunocodutra@gmail.com> | 2018-09-03 20:02:35 +0200 |
| commit | 2f5c3fde7c5443b8afceaa65aec2b1f62f33e12e (patch) | |
| tree | e626bd711d73188438eaa908dd17791f8a72f542 /src/librustc_mir/interpret | |
| parent | 015f470daa3020ebe92abf61fa4010b56bde006d (diff) | |
| download | rust-2f5c3fde7c5443b8afceaa65aec2b1f62f33e12e.tar.gz rust-2f5c3fde7c5443b8afceaa65aec2b1f62f33e12e.zip | |
Make vaious allocation related types generic on the allocation id
Diffstat (limited to 'src/librustc_mir/interpret')
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 8 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/operand.rs | 17 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 12 |
3 files changed, 19 insertions, 18 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index b6a84ed8404..02d87bdb7dc 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -26,7 +26,7 @@ use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::indexed_vec::IndexVec; use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableHasherResult}; use rustc::mir::interpret::{ - GlobalId, Scalar, FrameInfo, + GlobalId, Scalar, FrameInfo, AllocId, EvalResult, EvalErrorKind, ScalarMaybeUndef, truncate, sign_extend, @@ -98,7 +98,7 @@ pub struct Frame<'mir, 'tcx: 'mir> { /// The locals are stored as `Option<Value>`s. /// `None` represents a local that is currently dead, while a live local /// can either directly contain `Scalar` or refer to some part of an `Allocation`. - pub locals: IndexVec<mir::Local, LocalValue>, + pub locals: IndexVec<mir::Local, LocalValue<AllocId>>, //////////////////////////////////////////////////////////////////////////////// // Current position within the function @@ -178,13 +178,13 @@ impl<'a> HashStable<StableHashingContext<'a>> for StackPopCleanup { // State of a local variable #[derive(Copy, Clone, PartialEq, Eq, Hash)] -pub enum LocalValue { +pub enum LocalValue<Id=AllocId> { Dead, // Mostly for convenience, we re-use the `Operand` type here. // This is an optimization over just always having a pointer here; // we can thus avoid doing an allocation when the local just stores // immediate values *and* never has its address taken. - Live(Operand), + Live(Operand<Id>), } impl<'tcx> LocalValue { diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 9970816dc2a..4093a6304b3 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -17,9 +17,10 @@ use std::convert::TryInto; use rustc::{mir, ty}; use rustc::ty::layout::{self, Size, LayoutOf, TyLayout, HasDataLayout, IntegerExt}; use rustc_data_structures::indexed_vec::Idx; - use rustc::mir::interpret::{ - GlobalId, ConstValue, Scalar, EvalResult, Pointer, ScalarMaybeUndef, EvalErrorKind + GlobalId, AllocId, + ConstValue, Pointer, Scalar, ScalarMaybeUndef, + EvalResult, EvalErrorKind }; use super::{EvalContext, Machine, MemPlace, MPlaceTy, MemoryKind}; @@ -31,9 +32,9 @@ use super::{EvalContext, Machine, MemPlace, MPlaceTy, MemoryKind}; /// In particular, thanks to `ScalarPair`, arithmetic operations and casts can be entirely /// defined on `Value`, and do not have to work with a `Place`. #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] -pub enum Value { - Scalar(ScalarMaybeUndef), - ScalarPair(ScalarMaybeUndef, ScalarMaybeUndef), +pub enum Value<Id=AllocId> { + Scalar(ScalarMaybeUndef<Id>), + ScalarPair(ScalarMaybeUndef<Id>, ScalarMaybeUndef<Id>), } impl<'tcx> Value { @@ -106,9 +107,9 @@ impl<'tcx> ::std::ops::Deref for ValTy<'tcx> { /// or still in memory. The latter is an optimization, to delay reading that chunk of /// memory and to avoid having to store arbitrary-sized data here. #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] -pub enum Operand { - Immediate(Value), - Indirect(MemPlace), +pub enum Operand<Id=AllocId> { + Immediate(Value<Id>), + Indirect(MemPlace<Id>), } impl Operand { diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 6236a4784fb..fd7324c2d17 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -22,21 +22,21 @@ use rustc_data_structures::indexed_vec::Idx; use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableHasherResult}; use rustc::mir::interpret::{ - GlobalId, Scalar, EvalResult, Pointer, ScalarMaybeUndef, PointerArithmetic + GlobalId, AllocId, Scalar, EvalResult, Pointer, ScalarMaybeUndef, PointerArithmetic }; use super::{EvalContext, Machine, Value, ValTy, Operand, OpTy, MemoryKind}; #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] -pub struct MemPlace { +pub struct MemPlace<Id=AllocId> { /// A place may have an integral pointer for ZSTs, and since it might /// be turned back into a reference before ever being dereferenced. /// However, it may never be undef. - pub ptr: Scalar, + pub ptr: Scalar<Id>, pub align: Align, /// Metadata for unsized places. Interpretation is up to the type. /// Must not be present for sized types, but can be missing for unsized types /// (e.g. `extern type`). - pub extra: Option<Scalar>, + pub extra: Option<Scalar<Id>>, } impl_stable_hash_for!(struct ::interpret::MemPlace { @@ -46,9 +46,9 @@ impl_stable_hash_for!(struct ::interpret::MemPlace { }); #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] -pub enum Place { +pub enum Place<Id=AllocId> { /// A place referring to a value allocated in the `Memory` system. - Ptr(MemPlace), + Ptr(MemPlace<Id>), /// To support alloc-free locals, we are able to write directly to a local. /// (Without that optimization, we'd just always be a `MemPlace`.) |
