public void Translate(ScopeBlock rootScope) { var blockMap = rootScope.UpdateBasicBlocks <IRInstrList, ILInstrList>( block => { return(Translate(block.Content)); }, (id, content) => new ILBlock(id, content)); rootScope.ProcessBasicBlocks <ILInstrList>(block => { foreach (var instr in block.Content) { if (instr.Operand is ILBlockTarget) { var op = (ILBlockTarget)instr.Operand; op.Target = blockMap[(BasicBlock <IRInstrList>)op.Target]; } else if (instr.Operand is ILJumpTable) { var op = (ILJumpTable)instr.Operand; for (var i = 0; i < op.Targets.Length; i++) { op.Targets[i] = blockMap[(BasicBlock <IRInstrList>)op.Targets[i]]; } } } }); }
void BuildAST() { BuildASTInternal(); BuildPhiNodes(); var blockMap = scope.UpdateBasicBlocks((CILBlock block) => blockStates[block].ASTTree); var newBlockMap = blockHeaders.ToDictionary(pair => pair.Key, pair => blockMap[pair.Value]); foreach (var expr in instrReferences) { if (expr.Operand is Instruction) { expr.Operand = newBlockMap[(Instruction)expr.Operand]; } else { expr.Operand = ((Instruction[])expr.Operand).Select(instr => (IBasicBlock)newBlockMap[instr]).ToArray(); } } }
public void Translate(ScopeBlock rootScope) { RootScope = rootScope; var blockMap = rootScope.UpdateBasicBlocks <ILASTTree, IRInstrList>(block => { return(Translate(block)); }); rootScope.ProcessBasicBlocks <IRInstrList>(block => { foreach (var instr in block.Content) { if (instr.Operand1 is IRBlockTarget) { var op = (IRBlockTarget)instr.Operand1; op.Target = blockMap[(BasicBlock <ILASTTree>)op.Target]; } else if (instr.Operand1 is IRJumpTable) { var op = (IRJumpTable)instr.Operand1; for (var i = 0; i < op.Targets.Length; i++) { op.Targets[i] = blockMap[(BasicBlock <ILASTTree>)op.Targets[i]]; } } if (instr.Operand2 is IRBlockTarget) { var op = (IRBlockTarget)instr.Operand2; op.Target = blockMap[(BasicBlock <ILASTTree>)op.Target]; } else if (instr.Operand2 is IRJumpTable) { var op = (IRJumpTable)instr.Operand2; for (var i = 0; i < op.Targets.Length; i++) { op.Targets[i] = blockMap[(BasicBlock <ILASTTree>)op.Targets[i]]; } } } }); }