@@ -230,20 +230,23 @@ type Summary<'Info> =
230230// Note, this is a different notion of "size" to the one used for inlining heuristics
231231//-------------------------------------------------------------------------
232232
233- let rec SizeOfValueInfos ( arr : _ []) =
234- if arr.Length <= 0 then 0 else max 0 ( SizeOfValueInfo arr[ 0 ])
235-
236- and SizeOfValueInfo x =
237- match x with
238- | SizeValue ( vdepth, _ v) -> vdepth // terminate recursion at CACHED size nodes
239- | ConstValue (_ x, _) -> 1
240- | UnknownValue -> 1
241- | ValValue (_ vr, vinfo) -> SizeOfValueInfo vinfo + 1
242- | TupleValue vinfos
243- | RecdValue (_, vinfos)
244- | UnionCaseValue (_, vinfos) -> 1 + SizeOfValueInfos vinfos
245- | CurriedLambdaValue _ -> 1
246- | ConstExprValue (_ size, _) -> 1
233+ let SizeOfValueInfo valueInfo =
234+ let rec loop acc valueInfo =
235+ match valueInfo with
236+ | SizeValue ( vdepth, _ v) -> assert ( vdepth >= 0 ); acc + vdepth // terminate recursion at CACHED size nodes
237+ | CurriedLambdaValue _
238+ | ConstExprValue _
239+ | ConstValue _
240+ | UnknownValue -> acc + 1
241+ | TupleValue vinfos
242+ | RecdValue (_, vinfos)
243+ | UnionCaseValue (_, vinfos) when vinfos.Length = 0 -> acc + 1
244+ | TupleValue vinfos
245+ | RecdValue (_, vinfos)
246+ | UnionCaseValue (_, vinfos) -> loop ( acc + 1 ) vinfos[ 0 ]
247+ | ValValue (_ vr, vinfo) -> loop ( acc + 1 ) vinfo
248+
249+ loop 0 valueInfo
247250
248251let [<Literal>] minDepthForASizeNode = 5 // for small vinfos do not record size info, save space
249252
0 commit comments