示例#1
0
        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
        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);
            });
        }
示例#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]];
                        }
                    }
                }
            });
        }