Example #1
0
        private FunctionVariableStorage RunAllocator(DfirRoot function)
        {
            var cancellationToken = new CompileCancellationToken();

            RunCompilationUpToAsyncNodeDecomposition(function, cancellationToken);
            ExecutionOrderSortingVisitor.SortDiagrams(function);

            var asyncStateGrouper = new AsyncStateGrouper();

            asyncStateGrouper.Execute(function, cancellationToken);
            IEnumerable <AsyncStateGroup> asyncStateGroups = asyncStateGrouper.GetAsyncStateGroups();

            using (var contextWrapper = new ContextWrapper())
            {
                var module           = contextWrapper.CreateModule("module");
                var functionImporter = new FunctionImporter(contextWrapper, module);
                var codeGenExpander  = new CodeGenExpander(
                    function,
                    new FunctionModuleContext(contextWrapper, module, functionImporter),
                    new Dictionary <CompilableDefinitionName, bool>());
                asyncStateGroups.ForEach(codeGenExpander.ExpandAsyncStateGroup);

                var variableStorage = new FunctionVariableStorage();
                var allocator       = new Allocator(contextWrapper, variableStorage, asyncStateGroups);
                allocator.Execute(function, cancellationToken);
                return(variableStorage);
            }
        }
Example #2
0
        public void AddConstants_Allocate_SumGetsImmutableValueSource()
        {
            DfirRoot function = DfirRoot.Create();
            var      add      = new FunctionalNode(function.BlockDiagram, Signatures.DefinePureBinaryFunction("Add", NITypes.Int32, NITypes.Int32));

            ConnectConstantToInputTerminal(add.InputTerminals[0], NITypes.Int32, false);
            ConnectConstantToInputTerminal(add.InputTerminals[1], NITypes.Int32, false);

            FunctionVariableStorage valueStorage = RunAllocator(function);

            ValueSource sumSource = valueStorage.GetValueSourceForVariable(add.OutputTerminals[2].GetTrueVariable());

            Assert.IsInstanceOfType(sumSource, typeof(ImmutableValueSource));
        }
Example #3
0
        public void IntegerConstantIntoInspect_Allocate_IntegerVariableGetsConstantValueSource()
        {
            DfirRoot       function = DfirRoot.Create();
            FunctionalNode inspect  = new FunctionalNode(function.BlockDiagram, Signatures.InspectType);
            Constant       constant = ConnectConstantToInputTerminal(inspect.InputTerminals[0], NITypes.Int32, 5, false);

            FunctionVariableStorage valueStorage = RunAllocator(function);

            ValueSource integerValueSource = valueStorage.GetValueSourceForVariable(constant.OutputTerminal.GetTrueVariable());

            Assert.IsInstanceOfType(integerValueSource, typeof(ImmutableValueSource));
            ValueSource inspectInputValueSource = valueStorage.GetValueSourceForVariable(inspect.InputTerminals[0].GetTrueVariable());

            Assert.IsInstanceOfType(inspectInputValueSource, typeof(ReferenceToSingleValueSource));
        }
Example #4
0
        public void ConcatenateStringsAndYieldResult_Allocate_ConcatenatedStringGetsStateField()
        {
            DfirRoot function = DfirRoot.Create();
            var      concat   = new FunctionalNode(function.BlockDiagram, Signatures.StringConcatType);

            ConnectConstantToInputTerminal(concat.InputTerminals[0], DataTypes.StringSliceType.CreateImmutableReference(), false);
            ConnectConstantToInputTerminal(concat.InputTerminals[1], DataTypes.StringSliceType.CreateImmutableReference(), false);
            var yieldNode = new FunctionalNode(function.BlockDiagram, Signatures.YieldType);

            Wire.Create(function.BlockDiagram, concat.OutputTerminals[2], yieldNode.InputTerminals[0]);

            FunctionVariableStorage valueStorage = RunAllocator(function);

            ValueSource sumSource = valueStorage.GetValueSourceForVariable(concat.OutputTerminals[2].GetTrueVariable());

            Assert.IsInstanceOfType(sumSource, typeof(StateFieldValueSource));
        }