public void UpdateFromConnectedInput(VariableReference connectedInput) { _inputVariables.Add(connectedInput); Lifetime inputLifetime = connectedInput.Lifetime; switch (_state) { case State.NoVariableSeen: if (!inputLifetime.IsBounded || inputLifetime.DoesOutlastDiagram(_parentDiagram) || inputLifetime.IsDiagramLifetime(_parentDiagram)) { _state = State.LifetimeCannotBeTerminated; return; } _state = State.VariablesInLifetimeRemaining; CommonLifetime = inputLifetime; break; case State.VariablesInLifetimeRemaining: case State.AllVariablesInLifetimeTerminated: if (inputLifetime != CommonLifetime) { _state = State.InputLifetimeIsNotUnique; CommonLifetime = null; } break; case State.LifetimeCannotBeTerminated: case State.InputLifetimeIsNotUnique: break; } }
public void LoopConditionTunnel_SetVariableTypes_OutputLifetimeIsBoundedAndDoesNotOutlastDiagram() { DfirRoot function = DfirRoot.Create(); Loop loop = new Loop(function.BlockDiagram); LoopConditionTunnel loopConditionTunnel = CreateLoopConditionTunnel(loop); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference loopConditionOutputVariable = loopConditionTunnel.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(loopConditionOutputVariable.Type.IsMutableReferenceType()); Lifetime lifetime = loopConditionOutputVariable.Lifetime; Assert.IsTrue(lifetime.IsBounded); Assert.IsFalse(lifetime.DoesOutlastDiagram(loop.Diagrams[0])); }
public void BorrowTunnelWithMutableModeAndMutableVariableWired_SetVariableTypes_OutputReferenceIsMutable() { DfirRoot function = DfirRoot.Create(); Frame frame = Frame.Create(function.BlockDiagram); var borrowTunnel = CreateBorrowTunnel(frame, BorrowMode.Mutable); ConnectConstantToInputTerminal(borrowTunnel.InputTerminals[0], NITypes.Int32, true); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference borrowOutputVariable = borrowTunnel.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(borrowOutputVariable.Type.IsMutableReferenceType()); Lifetime lifetime = borrowOutputVariable.Lifetime; Assert.IsTrue(lifetime.IsBounded); Assert.IsFalse(lifetime.DoesOutlastDiagram(frame.Diagram)); }
public void LockTunnel_SetVariableTypes_OutputLifetimeIsBoundedAndDoesNotOutlastDiagram() { DfirRoot function = DfirRoot.Create(); Frame frame = Frame.Create(function.BlockDiagram); var lockTunnel = CreateLockTunnel(frame); FunctionalNode createLockingCell = ConnectCreateLockingCellToInputTerminal(lockTunnel.InputTerminals[0]); ConnectConstantToInputTerminal(createLockingCell.InputTerminals[0], PFTypes.Int32, false); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference borrowOutputVariable = lockTunnel.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(borrowOutputVariable.Type.IsMutableReferenceType()); Lifetime lifetime = borrowOutputVariable.Lifetime; Assert.IsTrue(lifetime.IsBounded); Assert.IsFalse(lifetime.DoesOutlastDiagram(frame.Diagram)); }