コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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]));
        }
コード例 #3
0
ファイル: BorrowTunnelTests.cs プロジェクト: rebarlang/rebar
        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));
        }
コード例 #4
0
        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));
        }