/// <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); } }
/// <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); } }
private void storeAliasIndex(LocationCollectorNode node) { if (node.IsMust) { mustAliases.Add(node.TargetIndex); } else { mayAliases.Add(node.TargetIndex); } }
/// <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); } }