@@ -1931,7 +1931,11 @@ impl Evaluator<'_> {
1931
1931
ty : & Ty ,
1932
1932
locals : & Locals ,
1933
1933
mm : & mut ComplexMemoryMap ,
1934
+ stack_depth_limit : usize ,
1934
1935
) -> Result < ( ) > {
1936
+ if stack_depth_limit. checked_sub ( 1 ) . is_none ( ) {
1937
+ return Err ( MirEvalError :: StackOverflow ) ;
1938
+ }
1935
1939
match ty. kind ( Interner ) {
1936
1940
TyKind :: Ref ( _, _, t) => {
1937
1941
let size = this. size_align_of ( t, locals) ?;
@@ -1970,7 +1974,14 @@ impl Evaluator<'_> {
1970
1974
if let Some ( ty) = check_inner {
1971
1975
for i in 0 ..count {
1972
1976
let offset = element_size * i;
1973
- 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
+ ) ?;
1974
1985
}
1975
1986
}
1976
1987
}
@@ -1984,7 +1995,14 @@ impl Evaluator<'_> {
1984
1995
let size = this. size_of_sized ( inner, locals, "inner of array" ) ?;
1985
1996
for i in 0 ..len {
1986
1997
let offset = i * size;
1987
- 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
+ ) ?;
1988
2006
}
1989
2007
}
1990
2008
chalk_ir:: TyKind :: Tuple ( _, subst) => {
@@ -1993,7 +2011,14 @@ impl Evaluator<'_> {
1993
2011
let ty = ty. assert_ty_ref ( Interner ) ; // Tuple only has type argument
1994
2012
let offset = layout. fields . offset ( id) . bytes_usize ( ) ;
1995
2013
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
1996
- 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
+ ) ?;
1997
2022
}
1998
2023
}
1999
2024
chalk_ir:: TyKind :: Adt ( adt, subst) => match adt. 0 {
@@ -2008,7 +2033,14 @@ impl Evaluator<'_> {
2008
2033
. bytes_usize ( ) ;
2009
2034
let ty = & field_types[ f] . clone ( ) . substitute ( Interner , subst) ;
2010
2035
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
2011
- 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
+ ) ?;
2012
2044
}
2013
2045
}
2014
2046
AdtId :: EnumId ( e) => {
@@ -2027,7 +2059,14 @@ impl Evaluator<'_> {
2027
2059
l. fields . offset ( u32:: from ( f. into_raw ( ) ) as usize ) . bytes_usize ( ) ;
2028
2060
let ty = & field_types[ f] . clone ( ) . substitute ( Interner , subst) ;
2029
2061
let size = this. layout ( ty) ?. size . bytes_usize ( ) ;
2030
- 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
+ ) ?;
2031
2070
}
2032
2071
}
2033
2072
}
@@ -2038,7 +2077,7 @@ impl Evaluator<'_> {
2038
2077
Ok ( ( ) )
2039
2078
}
2040
2079
let mut mm = ComplexMemoryMap :: default ( ) ;
2041
- rec ( self , bytes, ty, locals, & mut mm) ?;
2080
+ rec ( self , bytes, ty, locals, & mut mm, self . stack_depth_limit - 1 ) ?;
2042
2081
Ok ( mm)
2043
2082
}
2044
2083
0 commit comments