@@ -6,6 +6,7 @@ use crate::middle::cstore::{ExternCrate, ExternCrateSource};
6
6
use crate :: middle:: region;
7
7
use crate :: ty:: { self , DefIdTree , ParamConst , Ty , TyCtxt , TypeFoldable } ;
8
8
use crate :: ty:: subst:: { Kind , Subst , UnpackedKind } ;
9
+ use crate :: ty:: layout:: Size ;
9
10
use crate :: mir:: interpret:: { ConstValue , sign_extend, Scalar } ;
10
11
use syntax:: ast;
11
12
use rustc_apfloat:: ieee:: { Double , Single } ;
@@ -1537,6 +1538,7 @@ define_print_and_forward_display! {
1537
1538
}
1538
1539
1539
1540
& ' tcx ty:: Const <' tcx> {
1541
+ let u8 = cx. tcx( ) . types. u8 ;
1540
1542
match ( self . val, & self . ty. sty) {
1541
1543
| ( ConstValue :: Unevaluated ( ..) , _)
1542
1544
| ( ConstValue :: Infer ( ..) , _)
@@ -1566,28 +1568,38 @@ define_print_and_forward_display! {
1566
1568
( ConstValue :: Scalar ( Scalar :: Bits { bits, ..} ) , ty:: Char )
1567
1569
=> p!( write( "{:?}" , :: std:: char :: from_u32( bits as u32 ) . unwrap( ) ) ) ,
1568
1570
( _, ty:: FnDef ( did, _) ) => p!( write( "{}" , cx. tcx( ) . def_path_str( * did) ) ) ,
1569
- (
1570
- ConstValue :: Slice { data, start, end } ,
1571
- ty:: Ref ( _, slice_ty, _) ,
1572
- ) => {
1573
- let slice = & data. bytes[ start..end] ;
1574
- match slice_ty. sty {
1575
- ty:: Str => {
1576
- let s = :: std:: str :: from_utf8( slice)
1577
- . expect( "non utf8 str from miri" ) ;
1578
- p!( write( "{:?}" , s) )
1579
- } ,
1580
- ty:: Slice ( elem) if elem == cx. tcx( ) . types. u8 => {
1581
- p!( write( "b\" " ) ) ;
1582
- for & c in slice {
1583
- for e in std:: ascii:: escape_default( c) {
1584
- p!( write( "{}" , e) ) ;
1585
- }
1571
+ ( _, ty:: Ref ( _, ref_ty, _) ) => match ( self . val, & ref_ty. sty) {
1572
+ ( ConstValue :: Scalar ( Scalar :: Ptr ( ptr) ) , ty:: Array ( t, n) ) if * t == u8 => {
1573
+ let n = n. unwrap_usize( cx. tcx( ) ) ;
1574
+ let slice = cx. tcx( )
1575
+ . alloc_map. lock( )
1576
+ . unwrap_memory( ptr. alloc_id)
1577
+ . get_bytes( & cx. tcx( ) , ptr, Size :: from_bytes( n) ) . unwrap( ) ;
1578
+ p!( write( "b\" " ) ) ;
1579
+ for & c in slice {
1580
+ for e in std:: ascii:: escape_default( c) {
1581
+ p!( write( "{}" , e) ) ;
1586
1582
}
1587
- p!( write( "\" " ) ) ;
1588
- } ,
1589
- _ => bug!( "invalid slice: {:#?}" , self ) ,
1590
- }
1583
+ }
1584
+ p!( write( "\" " ) ) ;
1585
+ } ,
1586
+ ( ConstValue :: Slice { data, start, end } , ty:: Str ) => {
1587
+ let slice = & data. bytes[ start..end] ;
1588
+ let s = :: std:: str :: from_utf8( slice)
1589
+ . expect( "non utf8 str from miri" ) ;
1590
+ p!( write( "{:?}" , s) )
1591
+ } ,
1592
+ ( ConstValue :: Slice { data, start, end } , ty:: Slice ( t) ) if * t == u8 => {
1593
+ let slice = & data. bytes[ start..end] ;
1594
+ p!( write( "b\" " ) ) ;
1595
+ for & c in slice {
1596
+ for e in std:: ascii:: escape_default( c) {
1597
+ p!( write( "{}" , e) ) ;
1598
+ }
1599
+ }
1600
+ p!( write( "\" " ) ) ;
1601
+ } ,
1602
+ _ => p!( write( "{:?} : " , self . val) , print( self . ty) ) ,
1591
1603
} ,
1592
1604
_ => p!( write( "{:?} : " , self . val) , print( self . ty) ) ,
1593
1605
}
0 commit comments