コード例 #1
0
ファイル: ILTranslator.cs プロジェクト: hmyit/KoiVM
        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]];
                        }
                    }
                }
            });
        }
コード例 #2
0
        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();
                }
            }
        }
コード例 #3
0
        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]];
                        }
                    }
                }
            });
        }