pub trait ValueMut<'mir, 'tcx, M: Machine<'mir, 'tcx>>: Sized {
fn layout(&self) -> TyAndLayout<'tcx>;
fn to_op_for_read(
&self,
ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>;
fn to_op_for_proj(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>;
fn from_op(op: &OpTy<'tcx, M::Provenance>) -> Self;
fn project_downcast(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
variant: VariantIdx
) -> InterpResult<'tcx, Self>;
fn project_field(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
field: usize
) -> InterpResult<'tcx, Self>;
}
Expand description
A thing that we can project into given mutable access to ecx
, and that has a layout.
This wouldn’t have to depend on Machine
but with the current type inference,
that’s just more convenient to work with (avoids repeating all the Machine
bounds).
Required Methods
sourcefn layout(&self) -> TyAndLayout<'tcx>
fn layout(&self) -> TyAndLayout<'tcx>
Gets this value’s layout.
sourcefn to_op_for_read(
&self,
ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_read(
&self,
ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
Makes this into an OpTy
, in a cheap way that is good for reading.
sourcefn to_op_for_proj(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_proj(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
Makes this into an OpTy
, in a potentially more expensive way that is good for projections.
sourcefn from_op(op: &OpTy<'tcx, M::Provenance>) -> Self
fn from_op(op: &OpTy<'tcx, M::Provenance>) -> Self
Creates this from an OpTy
.
If to_op_for_proj
only ever produces Indirect
operands, then this one is definitely Indirect
.
sourcefn project_downcast(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
variant: VariantIdx
) -> InterpResult<'tcx, Self>
fn project_downcast(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
variant: VariantIdx
) -> InterpResult<'tcx, Self>
Projects to the given enum variant.
sourcefn project_field(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
field: usize
) -> InterpResult<'tcx, Self>
fn project_field(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
field: usize
) -> InterpResult<'tcx, Self>
Projects to the n-th field.