Skip to content

Commit 473d0c5

Browse files
committed
Introduce write_aggregate.
1 parent 83173c6 commit 473d0c5

File tree

2 files changed

+29
-19
lines changed

2 files changed

+29
-19
lines changed

compiler/rustc_const_eval/src/interpret/place.rs

+28
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,34 @@ where
846846
Ok(())
847847
}
848848

849+
/// Writes the discriminant of the given variant.
850+
#[instrument(skip(self), level = "debug")]
851+
pub fn write_aggregate(
852+
&mut self,
853+
kind: &mir::AggregateKind<'tcx>,
854+
operands: &[mir::Operand<'tcx>],
855+
dest: &PlaceTy<'tcx, M::Provenance>,
856+
) -> InterpResult<'tcx> {
857+
self.write_uninit(&dest)?;
858+
let (variant_index, variant_dest, active_field_index) = match *kind {
859+
mir::AggregateKind::Adt(_, variant_index, _, _, active_field_index) => {
860+
let variant_dest = self.place_downcast(&dest, variant_index)?;
861+
(variant_index, variant_dest, active_field_index)
862+
}
863+
_ => (VariantIdx::from_u32(0), dest.clone(), None),
864+
};
865+
if active_field_index.is_some() {
866+
assert_eq!(operands.len(), 1);
867+
}
868+
for (field_index, operand) in operands.iter().enumerate() {
869+
let field_index = active_field_index.unwrap_or(field_index);
870+
let field_dest = self.place_field(&variant_dest, field_index)?;
871+
let op = self.eval_operand(operand, Some(field_dest.layout))?;
872+
self.copy_op(&op, &field_dest, /*allow_transmute*/ false)?;
873+
}
874+
self.write_discriminant(variant_index, &dest)
875+
}
876+
849877
pub fn raw_const_to_mplace(
850878
&self,
851879
raw: ConstAlloc<'tcx>,

compiler/rustc_const_eval/src/interpret/step.rs

+1-19
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use either::Either;
77
use rustc_middle::mir;
88
use rustc_middle::mir::interpret::{InterpResult, Scalar};
99
use rustc_middle::ty::layout::LayoutOf;
10-
use rustc_target::abi::VariantIdx;
1110

1211
use super::{ImmTy, InterpCx, Machine};
1312

@@ -200,24 +199,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
200199
}
201200

202201
Aggregate(box ref kind, ref operands) => {
203-
self.write_uninit(&dest)?;
204-
let (variant_index, variant_dest, active_field_index) = match *kind {
205-
mir::AggregateKind::Adt(_, variant_index, _, _, active_field_index) => {
206-
let variant_dest = self.place_downcast(&dest, variant_index)?;
207-
(variant_index, variant_dest, active_field_index)
208-
}
209-
_ => (VariantIdx::from_u32(0), dest.clone(), None),
210-
};
211-
if active_field_index.is_some() {
212-
assert_eq!(operands.len(), 1);
213-
}
214-
for (field_index, operand) in operands.iter().enumerate() {
215-
let field_index = active_field_index.unwrap_or(field_index);
216-
let field_dest = self.place_field(&variant_dest, field_index)?;
217-
let op = self.eval_operand(operand, Some(field_dest.layout))?;
218-
self.copy_op(&op, &field_dest, /*allow_transmute*/ false)?;
219-
}
220-
self.write_discriminant(variant_index, &dest)?;
202+
self.write_aggregate(kind, operands, &dest)?;
221203
}
222204

223205
Repeat(ref operand, _) => {

0 commit comments

Comments
 (0)