Skip to content

Commit f3ab72c

Browse files
committed
Fixed issue not capturing locals
1 parent 99a2ca2 commit f3ab72c

File tree

1 file changed

+37
-54
lines changed

1 file changed

+37
-54
lines changed

src/fsharp/IlxGen.fs

Lines changed: 37 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

49234906
and 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
51675150
and (|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

Comments
 (0)