@@ -1710,14 +1710,7 @@ impl Evaluator<'_> {
1710
1710
}
1711
1711
ConstScalar :: Unknown => not_supported ! ( "evaluating unknown const" ) ,
1712
1712
} ;
1713
- let patch_map = memory_map. transform_addresses ( |b, mut align| {
1714
- // Prevent recursive addresses is adts and slices
1715
- match ( ( & b[ ..b. len ( ) / 2 ] ) . try_into ( ) , HEAP_OFFSET . checked_add ( align) ) {
1716
- ( Ok ( arr) , Some ( new_addr) ) if usize:: from_le_bytes ( arr) == new_addr => {
1717
- align *= 2 ;
1718
- }
1719
- _ => ( ) ,
1720
- } ;
1713
+ let patch_map = memory_map. transform_addresses ( |b, align| {
1721
1714
let addr = self . heap_allocate ( b. len ( ) , align) ?;
1722
1715
self . write_memory ( addr, b) ?;
1723
1716
Ok ( addr. to_usize ( ) )
@@ -1938,7 +1931,11 @@ impl Evaluator<'_> {
1938
1931
ty : & Ty ,
1939
1932
locals : & Locals ,
1940
1933
mm : & mut ComplexMemoryMap ,
1934
+ stack_depth_limit : usize ,
1941
1935
) -> Result < ( ) > {
1936
+ if stack_depth_limit. checked_sub ( 1 ) . is_none ( ) {
1937
+ return Err ( MirEvalError :: StackOverflow ) ;
1938
+ }
1942
1939
match ty. kind ( Interner ) {
1943
1940
TyKind :: Ref ( _, _, t) => {
1944
1941
let size = this. size_align_of ( t, locals) ?;
@@ -1977,7 +1974,14 @@ impl Evaluator<'_> {
1977
1974
if let Some ( ty) = check_inner {
1978
1975
for i in 0 ..count {
1979
1976
let offset = element_size * i;
1980
- rec ( this, & b[ offset..offset + element_size] , ty, locals, mm) ?;
1977
+ rec (
1978
+ this,
1979
+ & b[ offset..offset + element_size] ,
1980
+ ty,
1981
+ locals,
1982
+ mm,
1983
+ stack_depth_limit - 1 ,
1984
+ ) ?;
1981
1985
}
1982
1986
}
1983
1987
}
@@ -1991,7 +1995,14 @@ impl Evaluator<'_> {
1991
1995
let size = this. size_of_sized ( inner, locals, "inner of array" ) ?;
1992
1996
for i in 0 ..len {
1993
1997
let offset = i * size;
1994
- rec ( this, & bytes[ offset..offset + size] , inner, locals, mm) ?;
1998
+ rec (
1999
+ this,
2000
+ & bytes[ offset..offset + size] ,
2001
+ inner,
2002
+ locals,
2003
+ mm,
2004
+ stack_depth_limit - 1 ,
2005
+ ) ?;
1995
2006
}
1996
2007
}
1997
2008
chalk_ir:: TyKind :: Tuple ( _, subst) => {
@@ -2000,7 +2011,14 @@ impl Evaluator<'_> {
2000
2011
let ty = ty. assert_ty_ref ( Interner ) ; // Tuple only has type argument
2001
2012
let offset = layout. fields . offset ( id) . bytes_usize ( ) ;
2002
2013
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
2003
- rec ( this, & bytes[ offset..offset + size] , ty, locals, mm) ?;
2014
+ rec (
2015
+ this,
2016
+ & bytes[ offset..offset + size] ,
2017
+ ty,
2018
+ locals,
2019
+ mm,
2020
+ stack_depth_limit - 1 ,
2021
+ ) ?;
2004
2022
}
2005
2023
}
2006
2024
chalk_ir:: TyKind :: Adt ( adt, subst) => match adt. 0 {
@@ -2015,7 +2033,14 @@ impl Evaluator<'_> {
2015
2033
. bytes_usize ( ) ;
2016
2034
let ty = & field_types[ f] . clone ( ) . substitute ( Interner , subst) ;
2017
2035
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
2018
- rec ( this, & bytes[ offset..offset + size] , ty, locals, mm) ?;
2036
+ rec (
2037
+ this,
2038
+ & bytes[ offset..offset + size] ,
2039
+ ty,
2040
+ locals,
2041
+ mm,
2042
+ stack_depth_limit - 1 ,
2043
+ ) ?;
2019
2044
}
2020
2045
}
2021
2046
AdtId :: EnumId ( e) => {
@@ -2034,7 +2059,14 @@ impl Evaluator<'_> {
2034
2059
l. fields . offset ( u32:: from ( f. into_raw ( ) ) as usize ) . bytes_usize ( ) ;
2035
2060
let ty = & field_types[ f] . clone ( ) . substitute ( Interner , subst) ;
2036
2061
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
2037
- rec ( this, & bytes[ offset..offset + size] , ty, locals, mm) ?;
2062
+ rec (
2063
+ this,
2064
+ & bytes[ offset..offset + size] ,
2065
+ ty,
2066
+ locals,
2067
+ mm,
2068
+ stack_depth_limit - 1 ,
2069
+ ) ?;
2038
2070
}
2039
2071
}
2040
2072
}
@@ -2045,7 +2077,7 @@ impl Evaluator<'_> {
2045
2077
Ok ( ( ) )
2046
2078
}
2047
2079
let mut mm = ComplexMemoryMap :: default ( ) ;
2048
- rec ( self , bytes, ty, locals, & mut mm) ?;
2080
+ rec ( self , bytes, ty, locals, & mut mm, self . stack_depth_limit - 1 ) ?;
2049
2081
Ok ( mm)
2050
2082
}
2051
2083
0 commit comments