コード例 #1
0
ファイル: InstructionGraph.cs プロジェクト: harnold/cobe
        public virtual InstructionGraph Clone(
            out IDictionary instructionMap,
            out IDictionary valueMap)
        {
            InstructionGraph clone = new InstructionGraph();

            instructionMap = new Hashtable();
            valueMap = new Hashtable();

            IList instructionNodes = GetInstructionNodes();
            IList valueNodes = GetValueNodes();

            foreach (InstructionNode instr in instructionNodes) {
                InstructionNode cloneInstr = (InstructionNode) instr.Clone();
                clone.AddNode(cloneInstr);
                instructionMap[instr] = cloneInstr;
            }

            foreach (ValueNode val in valueNodes) {
                ValueNode cloneVal = (ValueNode) val.Clone();
                clone.AddNode(cloneVal);
                valueMap[val] = cloneVal;
            }

            foreach (ValueNode val in inputValues)
                clone.inputValues.Add(valueMap[val]);

            foreach (ValueNode val in outputValues)
                clone.outputValues.Add(valueMap[val]);

            foreach (ValueNode val in valueNodes) {

                if (val is RegisterValueNode) {

                    RegisterSet assignableRegs =
                        (RegisterSet) assignableRegisters[val];

                    clone.assignableRegisters[valueMap[val]] =
                        assignableRegs.Clone();
                }
            }

            IDictionary valueProcessed = new Hashtable();

            foreach (ValueNode val in valueNodes)
                valueProcessed[val] = false;

            foreach (ValueNode val in outputValues) {
                CloneEdgesForValue(val, clone, instructionMap, valueMap,
                                   valueProcessed);
            }

            foreach (ValueNode val in cyclicDependencies.Keys) {
                clone.cyclicDependencies[valueMap[val]] =
                    valueMap[cyclicDependencies[val]];
            }

            return clone;
        }