Skip to content

Commit 8dfcc6a

Browse files
committed
Instead of using a queue, use CPS through other functions
1 parent e6baf7f commit 8dfcc6a

File tree

1 file changed

+38
-54
lines changed

1 file changed

+38
-54
lines changed

src/fsharp/IlxGen.fs

Lines changed: 38 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2551,42 +2551,6 @@ and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel =
25512551
GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,args.Length,m)
25522552
GenSequel cenv eenv.cloc cgbuf sequel
25532553

2554-
and GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin =
2555-
CG.SetMarkToHere cgbuf afterJoin
2556-
2557-
//assert(cgbuf.GetCurrentStack() = stackAfterJoin) // REVIEW: Since gen_dtree* now sets stack, stack should be stackAfterJoin at this point...
2558-
CG.SetStack cgbuf stackAfterJoin
2559-
// If any values are left on the stack after the join then we're certainly going to do something with them
2560-
// For example, we may be about to execute a 'stloc' for
2561-
//
2562-
// let y2 = if System.DateTime.Now.Year < 2000 then 1 else 2
2563-
//
2564-
// or a 'stelem' for
2565-
//
2566-
// arr.[0] <- if System.DateTime.Now.Year > 2000 then 1 else 2
2567-
//
2568-
// In both cases, any instructions that come after this point will be falsely associated with the last branch of the control
2569-
// prior to the join point. This is base, e.g. see FSharp 1.0 bug 5155
2570-
if not (isNil stackAfterJoin) then
2571-
cgbuf.EmitStartOfHiddenCode()
2572-
2573-
GenSequel cenv eenv.cloc cgbuf sequelAfterJoin
2574-
2575-
and GenDecisionTreeTargetQueue cenv cgbuf (targetQueue: Queue<_>) eenv afterJoin stackAfterJoin sequelAfterJoin contf =
2576-
if targetQueue.Count > 0 then
2577-
let f = targetQueue.Dequeue ()
2578-
let genTargetInfoOpt = f ()
2579-
match genTargetInfoOpt with
2580-
| Some (eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget) ->
2581-
GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget true (fun Fake ->
2582-
GenDecisionTreeTargetQueue cenv cgbuf targetQueue eenv afterJoin stackAfterJoin sequelAfterJoin contf
2583-
)
2584-
| _ ->
2585-
GenDecisionTreeTargetQueue cenv cgbuf targetQueue eenv afterJoin stackAfterJoin sequelAfterJoin contf
2586-
else
2587-
GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2588-
contf Fake
2589-
25902554
and GenLinearExpr cenv cgbuf eenv sp expr sequel canProcessSequencePoint (contf: FakeUnit -> FakeUnit) =
25912555
let expr = stripExpr expr
25922556
match expr with
@@ -2675,8 +2639,27 @@ and GenLinearExpr cenv cgbuf eenv sp expr sequel canProcessSequencePoint (contf:
26752639
// match-testing (dtrees) should not contribute to the stack.
26762640
// Each branch-RHS (targets) may contribute to the stack, leaving it in the "stackAfterJoin" state, for the join point.
26772641
// Since code is branching and joining, the cgbuf stack is maintained manually.
2678-
let targetQueue = GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches
2679-
GenDecisionTreeTargetQueue cenv cgbuf targetQueue eenv afterJoin stackAfterJoin sequelAfterJoin contf
2642+
GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches (contf << (fun Fake ->
2643+
CG.SetMarkToHere cgbuf afterJoin
2644+
2645+
//assert(cgbuf.GetCurrentStack() = stackAfterJoin) // REVIEW: Since gen_dtree* now sets stack, stack should be stackAfterJoin at this point...
2646+
CG.SetStack cgbuf stackAfterJoin
2647+
// If any values are left on the stack after the join then we're certainly going to do something with them
2648+
// For example, we may be about to execute a 'stloc' for
2649+
//
2650+
// let y2 = if System.DateTime.Now.Year < 2000 then 1 else 2
2651+
//
2652+
// or a 'stelem' for
2653+
//
2654+
// arr.[0] <- if System.DateTime.Now.Year > 2000 then 1 else 2
2655+
//
2656+
// In both cases, any instructions that come after this point will be falsely associated with the last branch of the control
2657+
// prior to the join point. This is base, e.g. see FSharp 1.0 bug 5155
2658+
if not (isNil stackAfterJoin) then
2659+
cgbuf.EmitStartOfHiddenCode()
2660+
2661+
GenSequel cenv eenv.cloc cgbuf sequelAfterJoin
2662+
Fake))
26802663

26812664
| LinearOpExpr (TOp.UnionCase c, tyargs, argsFront, argLast, m) ->
26822665
if canProcessSequencePoint then
@@ -4857,45 +4840,46 @@ and GenJoinPoint cenv cgbuf pos eenv ty m sequel =
48574840
// go to the join point
48584841
Br afterJoin, afterJoin, stackAfterJoin, sequel
48594842

4860-
and GenPostponedAndQueueTargets cenv cgbuf (queue: Queue<_>) targetInfos stackAtTargets sequel =
4843+
and GenPostponedDecisionTreeTargets cenv cgbuf targetInfos stackAtTargets sequel (contf: FakeUnit -> FakeUnit) : FakeUnit =
48614844
match targetInfos with
4862-
| [] -> None
4845+
| [] -> contf Fake
48634846
| (KeyValue(_, (targetInfo, isTargetPostponed))) :: rest ->
48644847
if isTargetPostponed then
4865-
queue.Enqueue(fun () -> GenPostponedAndQueueTargets cenv cgbuf queue rest stackAtTargets sequel)
4866-
Some(GenDecisionTreeTarget cenv cgbuf stackAtTargets targetInfo sequel)
4848+
let eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget = GenDecisionTreeTarget cenv cgbuf stackAtTargets targetInfo sequel
4849+
GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget true (fun Fake ->
4850+
GenPostponedDecisionTreeTargets cenv cgbuf rest stackAtTargets sequel contf
4851+
)
48674852
else
4868-
GenPostponedAndQueueTargets cenv cgbuf queue rest stackAtTargets sequel
4853+
GenPostponedDecisionTreeTargets cenv cgbuf rest stackAtTargets sequel contf
48694854

4870-
and GenDecisionTreesAndQueueTargets cenv cgbuf (queue: Queue<_>) targetInfos decisions stackAtTargets targets repeatSP sequel =
4855+
and GenDecisionTreesAndTargets cenv cgbuf targetInfos decisions stackAtTargets targets repeatSP sequel contf =
48714856
match decisions with
48724857
| [] ->
48734858
let sortedTargetInfos =
48744859
targetInfos
48754860
|> Seq.sortBy (fun (KeyValue(targetIdx, _)) -> targetIdx)
48764861
|> List.ofSeq
48774862

4878-
GenPostponedAndQueueTargets cenv cgbuf queue sortedTargetInfos stackAtTargets sequel
4863+
GenPostponedDecisionTreeTargets cenv cgbuf sortedTargetInfos stackAtTargets sequel contf
48794864

48804865
| (inplabOpt, eenv, tree) :: rest ->
48814866
match tree with
48824867
| TDSuccess(es, targetIdx) ->
48834868
let targetInfos, genTargetInfoOpt = GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel
48844869
match genTargetInfoOpt with
4885-
| Some _ ->
4886-
queue.Enqueue(fun () -> GenDecisionTreesAndQueueTargets cenv cgbuf queue targetInfos rest stackAtTargets targets repeatSP sequel)
4887-
genTargetInfoOpt
4870+
| Some (eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget) ->
4871+
GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget true (fun Fake ->
4872+
GenDecisionTreesAndTargets cenv cgbuf targetInfos rest stackAtTargets targets repeatSP sequel contf
4873+
)
48884874
| _ ->
4889-
GenDecisionTreesAndQueueTargets cenv cgbuf queue targetInfos rest stackAtTargets targets repeatSP sequel
4875+
GenDecisionTreesAndTargets cenv cgbuf targetInfos rest stackAtTargets targets repeatSP sequel contf
48904876
| _ ->
48914877
let newDecisions = GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel
4892-
GenDecisionTreesAndQueueTargets cenv cgbuf queue targetInfos (newDecisions @ rest) stackAtTargets targets repeatSP sequel
4878+
GenDecisionTreesAndTargets cenv cgbuf targetInfos (newDecisions @ rest) stackAtTargets targets repeatSP sequel contf
48934879

48944880
// Accumulate the decision graph as we go
4895-
and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel : (Queue<unit -> (IlxGenEnv * EmitSequencePointState * Expr * sequel) option>) =
4896-
let queue = Queue()
4897-
queue.Enqueue (fun () -> GenDecisionTreesAndQueueTargets cenv cgbuf queue (IntMap.empty()) [(None, eenv, tree)] stackAtTargets targets repeatSP sequel)
4898-
queue
4881+
and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel contf =
4882+
GenDecisionTreesAndTargets cenv cgbuf (IntMap.empty()) [(None, eenv, tree)] stackAtTargets targets repeatSP sequel contf
48994883

49004884
and TryFindTargetInfo targetInfos n =
49014885
match IntMap.tryFind n targetInfos with

0 commit comments

Comments
 (0)