public void VisitMemoryIndexCollectorNode(MemoryIndexCollectorNode node) { if (node.IsCollected) { collectMemoryIndexCollectorNode(node); } else { continueMemoryIndexCollectorNode(node); } }
protected override void collectMemoryIndexCollectorNode(MemoryIndexCollectorNode node) { PathModifications.GetOrCreateModification(node.TargetIndex).SetCollectedIndex(); if (node.IsMust || ForceStrongWrite) { AddOperation(new MemoryIndexMustAssignOperation(this, node.TargetIndex, memoryEntryCollector.RootNode, AssignAliasesIntoCollectedIndexes)); } else { AddOperation(new MemoryIndexMayAssignOperation(this, node.TargetIndex, memoryEntryCollector.RootNode, AssignAliasesIntoCollectedIndexes)); } }
/// <summary> /// Continues the memory index collector node. /// </summary> /// <param name="node">The node.</param> protected void continueMemoryIndexCollectorNode(MemoryIndexCollectorNode node) { HashSet <Value> values = new HashSet <Value>(); testAndCreateImplicitArray(node, values); testAndCreateImplicitObject(node, values); testAndCreateUndefinedChildren(node); bool removeUndefined = node.IsMust && node.ContainsUndefinedValue; if (removeUndefined || values.Count > 0) { MemoryEntry entry = SnapshotDataUtils.GetMemoryEntry(Snapshot, Data, node.TargetIndex); copyEntryValues(entry, values, removeUndefined, false); Data.SetMemoryEntry(node.TargetIndex, Snapshot.CreateMemoryEntry(values)); } enqueueLocationChildNodes(node); }
/// <summary> /// Perform custom assign operation on memory index node. /// </summary> /// <param name="node">The node.</param> protected abstract void collectMemoryIndexCollectorNode(MemoryIndexCollectorNode node);
/// <summary> /// Processes the temporary. /// </summary> /// <param name="memoryIndexNode">The memory index node.</param> private void processTemporary(MemoryIndexCollectorNode memoryIndexNode) { collectorNodesQueue.AddLast(memoryIndexNode); }
protected override void collectMemoryIndexCollectorNode(MemoryIndexCollectorNode node) { storeAliasIndex(node); continueMemoryIndexCollectorNode(node); }