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]]; } } } }); }
public void AddHelpers() { var scope = new ScopeBlock(); var initBlock = new BasicBlock <IRInstrList>(1, new IRInstrList { new IRInstruction(IROpCode.RET) }); scope.Content.Add(initBlock); var retnBlock = new BasicBlock <IRInstrList>(0, new IRInstrList { new IRInstruction(IROpCode.VCALL, IRConstant.FromI4(rt.Descriptor.Runtime.VMCall[VMCalls.EXIT])) }); scope.Content.Add(initBlock); CompileHelpers(methodINIT, scope); var info = rt.Descriptor.Data.LookupInfo(methodINIT); scope.ProcessBasicBlocks <ILInstrList>(block => { if (block.Id == 1) { AddHelper(null, methodINIT, (ILBlock)block); var blockKey = info.BlockKeys[block]; info.EntryKey = blockKey.EntryKey; info.ExitKey = blockKey.ExitKey; } rt.AddBlock(methodINIT, (ILBlock)block); }); }
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]]; } } } }); }