private static void InsertTerminateLifetimeBehindTerminal( Terminal lifetimeSource, TerminateLifetimeNode terminateLifetime, int index, LifetimeVariableAssociation lifetimeVariableAssociation) { Terminal terminateLifetimeInput = terminateLifetime.InputTerminals.ElementAt(index), terminateLifetimeOutput = terminateLifetime.OutputTerminals.ElementAt(index); // wiring: output if (lifetimeSource.IsConnected) { lifetimeSource.ConnectedTerminal.ConnectTo(terminateLifetimeOutput); } lifetimeSource.WireTogether(terminateLifetimeInput, SourceModelIdSource.NoSourceModelId); // variables: output terminateLifetimeInput.GetFacadeVariable().MergeInto(lifetimeSource.GetTrueVariable()); VariableReference facadeVariable = lifetimeSource.GetFacadeVariable(); terminateLifetimeOutput.GetFacadeVariable().MergeInto(facadeVariable); if (lifetimeVariableAssociation.IsLive(facadeVariable)) { lifetimeVariableAssociation.MarkVariableLive(facadeVariable, terminateLifetimeOutput); } }
public void Execute(DfirRoot dfirRoot, CompileCancellationToken cancellationToken) { var lifetimeGraphTree = dfirRoot.GetLifetimeGraphTree(); BoundedLifetimeLiveVariableSet boundedLifetimeLiveVariableSet; while (_lifetimeVariableAssociation.TryGetBoundedLifetimeWithLiveVariables(out boundedLifetimeLiveVariableSet)) { if (lifetimeGraphTree.IsDiagramLifetimeOfAnyLifetimeGraph(boundedLifetimeLiveVariableSet.Lifetime)) { // Since we assume there are no semantic errors at this point, just mark any remaining live variables // in a diagram lifetime as consumed. boundedLifetimeLiveVariableSet.LiveVariables.Select(l => l.Variable).ForEach(_lifetimeVariableAssociation.MarkVariableConsumed); continue; } int inputVariableCount = boundedLifetimeLiveVariableSet.LiveVariables.Count(); IEnumerable <VariableReference> interruptedVariables = _lifetimeVariableAssociation.GetVariablesInterruptedByLifetime(boundedLifetimeLiveVariableSet.Lifetime); int outputVariableCount = interruptedVariables.Count(); Diagram startSearch = boundedLifetimeLiveVariableSet.LiveVariables.First().Terminal.ParentDiagram; LifetimeGraphIdentifier originGraphIdentifier = lifetimeGraphTree.GetBoundedLifetimeGraphIdentifier(boundedLifetimeLiveVariableSet.Lifetime); Diagram originDiagram = originGraphIdentifier.FindDiagramForGraphIdentifier(startSearch); LiveVariable[] liveVariables = boundedLifetimeLiveVariableSet.LiveVariables.ToArray(); for (int i = 0; i < liveVariables.Length; ++i) { LiveVariable liveVariable = liveVariables[i]; while (liveVariable.Terminal.ParentDiagram != originDiagram) { liveVariable = PullLiveVariableUpToNextHigherDiagram(liveVariable); } liveVariables[i] = liveVariable; } TerminateLifetimeNode terminateLifetime = TerminateLifetimeNodeHelpers.CreateTerminateLifetimeWithFacades(originDiagram, inputVariableCount, outputVariableCount); int inputIndex = 0; foreach (LiveVariable liveVariable in liveVariables) { // TODO: maybe assert that liveVariable.Terminal is unwired here? Terminal terminateLifetimeInputTerminal = terminateLifetime.InputTerminals[inputIndex]; Wire.Create(originDiagram, liveVariable.Terminal, terminateLifetimeInputTerminal); terminateLifetimeInputTerminal.GetFacadeVariable().MergeInto(liveVariable.Variable); _lifetimeVariableAssociation.MarkVariableConsumed(liveVariable.Variable); ++inputIndex; } int outputIndex = 0; foreach (VariableReference interruptedVariable in interruptedVariables) { Terminal terminateLifetimeOutputTerminal = terminateLifetime.OutputTerminals[outputIndex]; terminateLifetimeOutputTerminal.GetFacadeVariable().MergeInto(interruptedVariable); _lifetimeVariableAssociation.MarkVariableLive(interruptedVariable, terminateLifetimeOutputTerminal); ++outputIndex; } } }
public void Execute(DfirRoot dfirRoot, CompileCancellationToken cancellationToken) { LiveVariable liveUnboundedLifetimeVariable; while (_lifetimeVariableAssociation.TryGetLiveVariableWithUnboundedLifetime(out liveUnboundedLifetimeVariable)) { Diagram parentDiagram = liveUnboundedLifetimeVariable.Terminal.ParentDiagram; NIType variableType = liveUnboundedLifetimeVariable.Variable.Type; if (variableType.IsCluster()) { DecomposeTupleNode decomposeTuple = InsertDecompositionForTupleVariable( parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); foreach (Terminal outputTerminal in decomposeTuple.OutputTerminals) { _lifetimeVariableAssociation.MarkVariableLive(outputTerminal.GetFacadeVariable(), outputTerminal); } _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); continue; } if (variableType.IsValueClass() && variableType.GetFields().Any()) { DecomposeStructNode decomposeStruct = InsertDecompositionForStructVariable( parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); foreach (Terminal outputTerminal in decomposeStruct.OutputTerminals) { _lifetimeVariableAssociation.MarkVariableLive(outputTerminal.GetFacadeVariable(), outputTerminal); } _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); continue; } InsertDropForVariable(parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); } }
private void MarkFacadeVariableOfTerminalLive(Terminal terminal) { _lifetimeVariableAssociation.MarkVariableLive(terminal.GetFacadeVariable(), terminal); }