@@ -1120,7 +1120,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
1120
1120
1121
1121
/// ensures this Value is not a ByRef
1122
1122
pub fn follow_by_ref_value (
1123
- & self ,
1123
+ & mut self ,
1124
1124
value : Value ,
1125
1125
ty : Ty < ' tcx > ,
1126
1126
) -> EvalResult < ' tcx , Value > {
@@ -1133,7 +1133,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
1133
1133
}
1134
1134
1135
1135
pub fn value_to_scalar (
1136
- & self ,
1136
+ & mut self ,
1137
1137
ValTy { value, ty } : ValTy < ' tcx > ,
1138
1138
) -> EvalResult < ' tcx , Scalar > {
1139
1139
match self . follow_by_ref_value ( value, ty) ? {
@@ -1540,7 +1540,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
1540
1540
}
1541
1541
}
1542
1542
1543
- pub fn try_read_by_ref ( & self , mut val : Value , ty : Ty < ' tcx > ) -> EvalResult < ' tcx , Value > {
1543
+ pub fn try_read_by_ref ( & mut self , mut val : Value , ty : Ty < ' tcx > ) -> EvalResult < ' tcx , Value > {
1544
1544
// Convert to ByVal or ScalarPair if possible
1545
1545
if let Value :: ByRef ( ptr, align) = val {
1546
1546
if let Some ( read_val) = self . try_read_value ( ptr, align, ty) ? {
@@ -1550,8 +1550,8 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
1550
1550
Ok ( val)
1551
1551
}
1552
1552
1553
- pub fn try_read_value ( & self , ptr : Scalar , ptr_align : Align , ty : Ty < ' tcx > ) -> EvalResult < ' tcx , Option < Value > > {
1554
- let layout = self . layout_of ( ty) ?;
1553
+ pub fn try_read_value ( & mut self , ptr : Scalar , ptr_align : Align , ty : Ty < ' tcx > ) -> EvalResult < ' tcx , Option < Value > > {
1554
+ let mut layout = self . layout_of ( ty) ?;
1555
1555
self . memory . check_align ( ptr, ptr_align) ?;
1556
1556
1557
1557
if layout. size . bytes ( ) == 0 {
@@ -1560,17 +1560,30 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
1560
1560
1561
1561
let ptr = ptr. to_ptr ( ) ?;
1562
1562
1563
+ match layout. variants {
1564
+ layout:: Variants :: NicheFilling { .. } |
1565
+ layout:: Variants :: Tagged { .. } => {
1566
+ let variant_index = self . read_discriminant_as_variant_index (
1567
+ Place :: from_ptr ( ptr, ptr_align) ,
1568
+ layout. ty ,
1569
+ ) ?;
1570
+ layout = layout. for_variant ( & self , variant_index) ;
1571
+ trace ! ( "variant layout: {:#?}" , layout) ;
1572
+ } ,
1573
+ layout:: Variants :: Single { .. } => { } ,
1574
+ }
1575
+
1563
1576
match layout. abi {
1564
1577
layout:: Abi :: Scalar ( ..) => {
1565
1578
let scalar = self . memory . read_scalar ( ptr, ptr_align, layout. size ) ?;
1566
1579
Ok ( Some ( Value :: Scalar ( scalar) ) )
1567
1580
}
1568
1581
layout:: Abi :: ScalarPair ( ref a, ref b) => {
1569
1582
let ( a, b) = ( & a. value , & b. value ) ;
1570
- let ( a_size, b_size) = ( a. size ( self ) , b. size ( self ) ) ;
1583
+ let ( a_size, b_size) = ( a. size ( & self ) , b. size ( & self ) ) ;
1571
1584
let a_ptr = ptr;
1572
- let b_offset = a_size. abi_align ( b. align ( self ) ) ;
1573
- let b_ptr = ptr. offset ( b_offset, self ) ?. into ( ) ;
1585
+ let b_offset = a_size. abi_align ( b. align ( & self ) ) ;
1586
+ let b_ptr = ptr. offset ( b_offset, & self ) ?. into ( ) ;
1574
1587
let a_val = self . memory . read_scalar ( a_ptr, ptr_align, a_size) ?;
1575
1588
let b_val = self . memory . read_scalar ( b_ptr, ptr_align, b_size) ?;
1576
1589
Ok ( Some ( Value :: ScalarPair ( a_val, b_val) ) )
0 commit comments