private void mergeWithEmptyAssignedArray(AssociativeArray arrayValue) { IArrayDescriptor descriptor = Worker.Structure.GetDescriptor(arrayValue); foreach (var item in descriptor.Indexes) { string name = item.Key; MemoryIndex index = item.Value; Worker.AddOperation(new MemoryIndexMayAssignOperation(Worker, index, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot))); } Worker.AddOperation(new MemoryIndexMayAssignOperation(Worker, descriptor.UnknownIndex, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot))); }
private void mergeWithAssignedArray(AssociativeArray sourceArray, AssociativeArray targetArray) { // Get descriptors IArrayDescriptor sourceDescriptor = Worker.Structure.GetDescriptor(sourceArray); IArrayDescriptorBuilder targetDescriptorBuilder = Worker.Structure.GetDescriptor(targetArray).Builder(Worker.Structure); // Iterate source indexes which are not present in node foreach (var item in sourceDescriptor.Indexes) { string name = item.Key; MemoryIndex index = item.Value; if (!Node.NamedChildren.ContainsKey(name)) { // Index is present in source but not in node MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, index, createdIndex, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot))); } } // Iterate all child nodes foreach (var item in Node.NamedChildren) { string name = item.Key; MemoryEntryCollectorNode node = item.Value; if (sourceDescriptor.ContainsIndex(name)) { // Index is present in source and node MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, sourceDescriptor.GetIndex(name), createdIndex, node)); } else { // Index is present in node but not in source MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, sourceDescriptor.UnknownIndex, createdIndex, node)); } } // Merge unknown index with unknown node (unknown index was created in array initialization - scip new array) UnknownIndexMayAssign toUnknownAssignOperation = new UnknownIndexMayAssign(Worker, sourceDescriptor.UnknownIndex, targetDescriptorBuilder.UnknownIndex, Node.AnyChild); toUnknownAssignOperation.CreateNewIndex = false; Worker.AddOperation(toUnknownAssignOperation); // Build and set modified target descriptor Worker.Structure.SetDescriptor(targetArray, targetDescriptorBuilder.Build(Worker.Structure)); }
private void mergeWithEmptyAssignedArray(AssociativeArray sourceArray, AssociativeArray targetArray) { // Get descriptors IArrayDescriptor sourceDescriptor = Worker.Structure.GetDescriptor(sourceArray); IArrayDescriptorBuilder targetDescriptorBuilder = Worker.Structure.GetDescriptor(targetArray).Builder(Worker.Structure); // Create child index and merge with empty node foreach (var item in sourceDescriptor.Indexes) { string name = item.Key; MemoryIndex index = item.Value; MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, index, createdIndex, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot))); } // Merge unknown index with empty node (unknown index was created in array initialization - scip new array) UnknownIndexMayAssign toUnknownAssignOperation = new UnknownIndexMayAssign(Worker, sourceDescriptor.UnknownIndex, targetDescriptorBuilder.UnknownIndex, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot)); toUnknownAssignOperation.CreateNewIndex = false; Worker.AddOperation(toUnknownAssignOperation); // Build and set modified target descriptor Worker.Structure.SetDescriptor(targetArray, targetDescriptorBuilder.Build(Worker.Structure)); }