@@ -2662,36 +2662,20 @@ and GenLinearExpr cenv cgbuf eenv sp expr sequel canProcessSequencePoint (contf:
26622662 // match-testing (dtrees) should not contribute to the stack.
26632663 // Each branch-RHS (targets) may contribute to the stack, leaving it in the "stackAfterJoin" state, for the join point.
26642664 // Since code is branching and joining, the cgbuf stack is maintained manually.
2665- let genTargetInfo , targetQueue = GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches
2666- if genTargetInfo.contents.IsSome then
2667- let eenvAtTarget , spExprAtTarget , exprAtTarget , sequelAtTarget = genTargetInfo.contents.Value
2668-
2669- GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget (* canProcessSequencePoint *) true ( contf << ( fun Fake ->
2670- if targetQueue.Count > 0 then
2671- targetQueue.Dequeue()()
2672-
2673- if genTargetInfo.contents.IsSome then
2674- let eenvAtTarget , spExprAtTarget , exprAtTarget , sequelAtTarget = genTargetInfo.contents.Value
2675-
2676- GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget (* canProcessSequencePoint *) true ( contf << ( fun Fake ->
2677- if targetQueue.Count > 0 then
2678- targetQueue.Dequeue()()
2679-
2680- while genTargetInfo.contents.IsSome do
2681- let eenvAtTarget , spExprAtTarget , exprAtTarget , sequelAtTarget = genTargetInfo.contents.Value
2682- GenExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget
2683- if targetQueue.Count > 0 then
2684- targetQueue.Dequeue()()
2685-
2686- GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2687- Fake))
2688- else
2689- GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2690- Fake
2691- ))
2692- else
2693- GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2694- contf Fake
2665+ let targetQueue = GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches
2666+ let rec processTarget ( targetQueue : Queue < _ >) =
2667+ if targetQueue.Count > 0 then
2668+ let f = targetQueue.Dequeue()
2669+ let genTargetInfoOpt = f ()
2670+ match genTargetInfoOpt with
2671+ | Some( eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget) ->
2672+ GenExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget
2673+ | _ ->
2674+ ()
2675+ processTarget targetQueue
2676+ processTarget targetQueue
2677+ GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2678+ contf Fake
26952679
26962680 | LinearOpExpr ( TOp.UnionCase c, tyargs, argsFront, argLast, m) ->
26972681 if canProcessSequencePoint then
@@ -4882,8 +4866,8 @@ and GenJoinPoint cenv cgbuf pos eenv ty m sequel =
48824866 Br afterJoin, afterJoin, stackAfterJoin, sequel
48834867
48844868// Accumulate the decision graph as we go
4885- and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel : ( Ref < (IlxGenEnv * EmitSequencePointState * Expr * sequel ) option > * Queue < unit -> unit >) =
4886- let rec genDecisions targetInfos decisions ( genTargetInfo : ref < _ >) ( queue : Queue < _ >) =
4869+ and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel : ( Queue < unit -> ( IlxGenEnv * EmitSequencePointState * Expr * sequel ) option >) =
4870+ let rec genDecisions targetInfos decisions ( queue : Queue < _ >) =
48874871 match decisions with
48884872 | [] ->
48894873 let remaining =
@@ -4892,33 +4876,32 @@ and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeat
48924876 |> Seq.filter ( fun ( KeyValue ( _ , ( _ , isTargetPostponed ))) -> isTargetPostponed)
48934877 |> List.ofSeq
48944878
4895- let rec genRemaining remaining ( genTargetInfo : ref < _ >) ( queue : Queue < _ >) =
4879+ let rec genRemaining remaining ( queue : Queue < _ >) =
48964880 match remaining with
4897- | [] -> genTargetInfo := None
4881+ | [] -> None
48984882 | ( KeyValue( targetIdx, ( targetInfo, _))) :: rest ->
4899- genTargetInfo := Some ( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel )
4900- queue.Enqueue ( fun () -> genRemaining rest genTargetInfo queue )
4883+ queue.Enqueue ( fun () -> genRemaining rest queue )
4884+ Some ( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel )
49014885
4902- genRemaining remaining genTargetInfo queue
4886+ genRemaining remaining queue
49034887
4904- | ( inplabOpt, tree) :: rest ->
4888+ | ( inplabOpt, eenv , tree) :: rest ->
49054889 match tree with
49064890 | TDSuccess( es, targetIdx) ->
49074891 let targetInfos , genTargetInfoOpt = GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel
49084892 match genTargetInfoOpt with
49094893 | Some _ ->
4910- genTargetInfo := genTargetInfoOpt
4911- queue.Enqueue ( fun () -> genDecisions targetInfos rest genTargetInfo queue )
4894+ queue.Enqueue ( fun () -> genDecisions targetInfos rest queue )
4895+ genTargetInfoOpt
49124896 | _ ->
4913- genDecisions targetInfos rest genTargetInfo queue
4897+ genDecisions targetInfos rest queue
49144898 | _ ->
49154899 let newDecisions = GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel
4916- genDecisions targetInfos ( newDecisions @ rest) genTargetInfo queue
4900+ genDecisions targetInfos ( newDecisions @ rest) queue
49174901
4918- let res = ref None
49194902 let queue = Queue()
4920- genDecisions ( IntMap.empty()) [( None, tree)] res queue
4921- res , queue
4903+ queue.Enqueue ( fun () -> genDecisions ( IntMap.empty()) [( None, eenv , tree)] queue)
4904+ queue
49224905
49234906and TryFindTargetInfo targetInfos n =
49244907 match IntMap.tryFind n targetInfos with
@@ -4929,7 +4912,7 @@ and TryFindTargetInfo targetInfos n =
49294912///
49304913/// When inplabOpt is "Some inplab", we are assuming an existing branch to "inplab" and can optionally
49314914/// set inplab to point to another location if no codegen is required.
4932- and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel : ( Mark option * DecisionTree ) list =
4915+ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel =
49334916 CG.SetStack cgbuf stackAtTargets // Set the expected initial stack.
49344917 match tree with
49354918 | TDBind( bind, rest) ->
@@ -4945,7 +4928,7 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree
49454928 GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv rest targets repeatSP targetInfos sequel
49464929
49474930 | TDSuccess (_ es, _ targetIdx) ->
4948- [( inplabOpt, tree)]
4931+ [( inplabOpt, eenv , tree)]
49494932 //GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel
49504933
49514934 | TDSwitch( e, cases, dflt, m) ->
@@ -5031,7 +5014,7 @@ and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBefore
50315014 //GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel, endScope))
50325015
50335016
5034- and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel : ( Mark option * DecisionTree ) list =
5017+ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel =
50355018 let g = cenv.g
50365019 let m = e.Range
50375020 match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab
@@ -5151,22 +5134,22 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
51515134 GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel
51525135 | _ -> error( InternalError( " these matches should never be needed" , switchm))
51535136
5154- and GenDecisionTreeCases _cenv cgbuf stackAtTargets _eenv _targets _repeatSP _targetInfos defaultTargetOpt caseLabels cases _sequel =
5137+ and GenDecisionTreeCases _cenv cgbuf stackAtTargets eenv _targets _repeatSP _targetInfos defaultTargetOpt caseLabels cases _sequel =
51555138 assert ( cgbuf.GetCurrentStack() = stackAtTargets) // cgbuf stack should be unchanged over tests. [bug://1750].
51565139
51575140 let targetInfos =
51585141 match defaultTargetOpt with
5159- | Some defaultTarget -> [( None, defaultTarget)] //GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel
5142+ | Some defaultTarget -> [( None, eenv , defaultTarget)] //GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel
51605143 | None -> []
51615144
51625145 ( targetInfos, caseLabels, cases)
5163- |||> List.fold2 ( fun targetInfos caseLabel ( TCase ( _ , caseTree )) -> targetInfos @ [( Some caseLabel, caseTree)])
5146+ |||> List.fold2 ( fun targetInfos caseLabel ( TCase ( _ , caseTree )) -> targetInfos @ [( Some caseLabel, eenv , caseTree)])
51645147 //GenDecisionTreeAndTargetsInner cenv cgbuf (Some caseLabel) stackAtTargets eenv caseTree targets repeatSP targetInfos sequel)
51655148
51665149// Used for the peephole optimization below
51675150and (| BoolExpr | _ |) = function Expr.Const ( Const.Bool b1, _, _) -> Some b1 | _ -> None
51685151
5169- and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTree failureTree targets _repeatSP _targetInfos sequel : ( Mark option * DecisionTree ) list =
5152+ and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTree failureTree targets _repeatSP _targetInfos sequel =
51705153 let g = cenv.g
51715154 match successTree, failureTree with
51725155
@@ -5216,8 +5199,8 @@ and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTre
52165199 CG.EmitInstr cgbuf ( pop 1 ) Push0 ( I_ brcmp ( BI_ brfalse, failure.CodeLabel))
52175200
52185201 [
5219- ( None, successTree)
5220- ( Some failure, failureTree)
5202+ ( None, eenv , successTree)
5203+ ( Some failure, eenv , failureTree)
52215204 ]
52225205 // let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel
52235206
0 commit comments