Beispiel #1
0
        /// <summary>
        /// Performs an assign operation to all nodes collected by the collector.
        /// </summary>
        public void ProcessCollector()
        {
            // Prepares all variables.
            foreach (var item in treeCollector.RootNode.VariableStackNodes)
            {
                processVariables(item.Key, item.Value);
            }

            // Prepares all control variables.
            foreach (var item in treeCollector.RootNode.ControlStackNodes)
            {
                processControls(item.Key, item.Value);
            }

            // Prepares all temporary variables.
            foreach (var item in treeCollector.RootNode.TemporaryNodes)
            {
                processTemporary(item.Value);
            }

            // Prepares all objects.
            foreach (var item in treeCollector.RootNode.ObjectNodes)
            {
                processObject(item.Key, item.Value);
            }

            // Iterates until all operations are performed.
            while (collectorNodesQueue.Count > 0)
            {
                LocationCollectorNode node = collectorNodesQueue.First.Value;
                collectorNodesQueue.RemoveFirst();
                node.Accept(this);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Processes the source array.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <param name="arrayValue">The array value.</param>
        /// <param name="values">The values.</param>
        private void processSourceArray(MemoryCollectorNode node, AssociativeArray arrayValue, ICollection <Value> values)
        {
            if (arrayValue != null)
            {
                IArrayDescriptor sourceArray = Structure.GetDescriptor(arrayValue);

                if (node.AnyChildNode == null)
                {
                    node.CreateMemoryIndexAnyChild(sourceArray.UnknownIndex);
                }

                foreach (var item in sourceArray.Indexes)
                {
                    string      name  = item.Key;
                    MemoryIndex index = item.Value;

                    if (!node.NamedChildNodes.ContainsKey(name))
                    {
                        LocationCollectorNode newChild = node.CreateMemoryIndexChildFromAny(name, sourceArray.UnknownIndex);
                        newChild.IsMust = node.IsMust;
                    }
                }

                createArray(node, values);
            }
            else
            {
                testAndCreateImplicitArray(node, values);
            }
        }
Beispiel #3
0
 private void storeAliasIndex(LocationCollectorNode node)
 {
     if (node.IsMust)
     {
         mustAliases.Add(node.TargetIndex);
     }
     else
     {
         mayAliases.Add(node.TargetIndex);
     }
 }
Beispiel #4
0
        /// <summary>
        /// Enqueues the location child nodes.
        /// </summary>
        /// <param name="node">The node.</param>
        private void enqueueLocationChildNodes(LocationCollectorNode node)
        {
            if (node.ValueNodes != null)
            {
                foreach (var valueNode in node.ValueNodes)
                {
                    valueNode.TargetIndex = node.TargetIndex;
                }
            }

            foreach (var childNode in node.ChildNodes)
            {
                collectorNodesQueue.AddLast(childNode);
            }
        }