@@ -2170,91 +2170,91 @@ module internal TupleCompilation =
21702170 mkLoop ( fun _idxVar loopVar -> mkInvisibleLet elemVar.Range elemVar loopVar bodyExpr))
21712171 | ValueNone ->
21722172
2173- let mBody , spFor , spIn , mFor , mIn , spInWhile , mWholeExpr = ranges
2173+ let mBody , spFor , spIn , mFor , mIn , spInWhile , mWholeExpr = ranges
21742174
2175- if isStringTy g enumerableTy then
2176- // type is string, optimize for expression as:
2177- // let $str = enumerable
2178- // for $idx = 0 to str.Length - 1 do
2179- // let elem = str.[idx]
2180- // body elem
2175+ if isStringTy g enumerableTy then
2176+ // type is string, optimize for expression as:
2177+ // let $str = enumerable
2178+ // for $idx = 0 to str.Length - 1 do
2179+ // let elem = str.[idx]
2180+ // body elem
21812181
2182- let strVar , strExpr = mkCompGenLocal mFor " str" enumerableTy
2183- let idxVar , idxExpr = mkCompGenLocal elemVar.Range " idx" g.int32_ ty
2182+ let strVar , strExpr = mkCompGenLocal mFor " str" enumerableTy
2183+ let idxVar , idxExpr = mkCompGenLocal elemVar.Range " idx" g.int32_ ty
21842184
2185- let lengthExpr = mkGetStringLength g mFor strExpr
2186- let charExpr = mkGetStringChar g mFor strExpr idxExpr
2185+ let lengthExpr = mkGetStringLength g mFor strExpr
2186+ let charExpr = mkGetStringChar g mFor strExpr idxExpr
21872187
2188- let startExpr = mkZero g mFor
2189- let finishExpr = mkDecr g mFor lengthExpr
2190- // for compat reasons, loop item over string is sometimes object, not char
2191- let loopItemExpr = mkCoerceIfNeeded g elemVar.Type g.char_ ty charExpr
2192- let bodyExpr = mkInvisibleLet mIn elemVar loopItemExpr bodyExpr
2188+ let startExpr = mkZero g mFor
2189+ let finishExpr = mkDecr g mFor lengthExpr
2190+ // for compat reasons, loop item over string is sometimes object, not char
2191+ let loopItemExpr = mkCoerceIfNeeded g elemVar.Type g.char_ ty charExpr
2192+ let bodyExpr = mkInvisibleLet mIn elemVar loopItemExpr bodyExpr
21932193
2194- let forExpr =
2195- mkFastForLoop g ( DebugPointAtFor.No, spIn, mWholeExpr, idxVar, startExpr, true , finishExpr, bodyExpr)
2194+ let forExpr =
2195+ mkFastForLoop g ( DebugPointAtFor.No, spIn, mWholeExpr, idxVar, startExpr, true , finishExpr, bodyExpr)
21962196
2197- let expr = mkLet spFor mFor strVar enumerableExpr forExpr
2197+ let expr = mkLet spFor mFor strVar enumerableExpr forExpr
21982198
2199- expr
2199+ expr
2200+
2201+ elif isListTy g enumerableTy then
2202+ // type is list, optimize for expression as:
2203+ // let mutable $currentVar = listExpr
2204+ // let mutable $nextVar = $tailOrNull
2205+ // while $guardExpr do
2206+ // let i = $headExpr
2207+ // bodyExpr ()
2208+ // $current <- $next
2209+ // $next <- $tailOrNull
2210+
2211+ let IndexHead = 0
2212+ let IndexTail = 1
2213+
2214+ let currentVar , currentExpr = mkMutableCompGenLocal mIn " current" enumerableTy
2215+ let nextVar , nextExpr = mkMutableCompGenLocal mIn " next" enumerableTy
2216+ let elemTy = destListTy g enumerableTy
22002217
2201- elif isListTy g enumerableTy then
2202- // type is list, optimize for expression as:
2203- // let mutable $currentVar = listExpr
2204- // let mutable $nextVar = $tailOrNull
2205- // while $guardExpr do
2206- // let i = $headExpr
2207- // bodyExpr ()
2208- // $current <- $next
2209- // $next <- $tailOrNull
2210-
2211- let IndexHead = 0
2212- let IndexTail = 1
2213-
2214- let currentVar , currentExpr = mkMutableCompGenLocal mIn " current" enumerableTy
2215- let nextVar , nextExpr = mkMutableCompGenLocal mIn " next" enumerableTy
2216- let elemTy = destListTy g enumerableTy
2217-
2218- let guardExpr = mkNonNullTest g mFor nextExpr
2219-
2220- let headOrDefaultExpr =
2221- mkUnionCaseFieldGetUnprovenViaExprAddr ( currentExpr, g.cons_ ucref, [ elemTy ], IndexHead, mIn)
2222-
2223- let tailOrNullExpr =
2224- mkUnionCaseFieldGetUnprovenViaExprAddr ( currentExpr, g.cons_ ucref, [ elemTy ], IndexTail, mIn)
2225-
2226- let bodyExpr =
2227- mkInvisibleLet
2228- mIn
2229- elemVar
2230- headOrDefaultExpr
2231- ( mkSequential
2218+ let guardExpr = mkNonNullTest g mFor nextExpr
2219+
2220+ let headOrDefaultExpr =
2221+ mkUnionCaseFieldGetUnprovenViaExprAddr ( currentExpr, g.cons_ ucref, [ elemTy ], IndexHead, mIn)
2222+
2223+ let tailOrNullExpr =
2224+ mkUnionCaseFieldGetUnprovenViaExprAddr ( currentExpr, g.cons_ ucref, [ elemTy ], IndexTail, mIn)
2225+
2226+ let bodyExpr =
2227+ mkInvisibleLet
22322228 mIn
2233- bodyExpr
2229+ elemVar
2230+ headOrDefaultExpr
22342231 ( mkSequential
22352232 mIn
2236- ( mkValSet mIn ( mkLocalValRef currentVar) nextExpr)
2237- ( mkValSet mIn ( mkLocalValRef nextVar) tailOrNullExpr)))
2238-
2239- let expr =
2240- // let mutable current = enumerableExpr
2241- mkLet
2242- spFor
2243- mIn
2244- currentVar
2245- enumerableExpr
2246- // let mutable next = current.TailOrNull
2247- ( mkInvisibleLet
2248- mFor
2249- nextVar
2250- tailOrNullExpr
2251- // while nonNull next do
2252- ( mkWhile g ( spInWhile, WhileLoopForCompiledForEachExprMarker, guardExpr, bodyExpr, mBody)))
2233+ bodyExpr
2234+ ( mkSequential
2235+ mIn
2236+ ( mkValSet mIn ( mkLocalValRef currentVar) nextExpr)
2237+ ( mkValSet mIn ( mkLocalValRef nextVar) tailOrNullExpr)))
22532238
2254- expr
2239+ let expr =
2240+ // let mutable current = enumerableExpr
2241+ mkLet
2242+ spFor
2243+ mIn
2244+ currentVar
2245+ enumerableExpr
2246+ // let mutable next = current.TailOrNull
2247+ ( mkInvisibleLet
2248+ mFor
2249+ nextVar
2250+ tailOrNullExpr
2251+ // while nonNull next do
2252+ ( mkWhile g ( spInWhile, WhileLoopForCompiledForEachExprMarker, guardExpr, bodyExpr, mBody)))
2253+
2254+ expr
22552255
2256- else
2257- expr
2256+ else
2257+ expr
22582258
22592259 | _ -> expr
22602260
@@ -2883,7 +2883,6 @@ module internal ResumableCodePatterns =
28832883
28842884 | _ -> ValueNone
28852885
2886-
28872886 [<return : Struct>]
28882887 let (| ResumableCodeInvoke | _ |) g expr =
28892888 match expr with
0 commit comments