@@ -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-
25902554and 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
49004884and TryFindTargetInfo targetInfos n =
49014885 match IntMap.tryFind n targetInfos with
0 commit comments