Beispiel #1
0
        public override Statement VisitBranch(Branch branch)
        {
            if (branch == null)
            {
                return(null);
            }
            if (branch.Target == null)
            {
                return(null);
            }
            branch.Condition = this.VisitExpression(branch.Condition);
            int         n           = this.localsStack.top + 1;
            LocalsStack targetStack = (LocalsStack)this.StackLocalsAtEntry[branch.Target.UniqueKey];

            if (targetStack == null)
            {
                this.StackLocalsAtEntry[branch.Target.UniqueKey] = this.localsStack.Clone();
                return(branch);
            }
            //Target block has an entry stack that is different from the current stack. Need to copy stack before branching.
            if (n <= 0)
            {
                return(branch);  //Empty stack, no need to copy
            }
            StatementList statements = new StatementList(n + 1);

            this.localsStack.Transfer(targetStack, statements);
            statements.Add(branch);
            return(new Block(statements));
        }
Beispiel #2
0
 public override Block VisitBlock(Block block)
 {
     if (block == null) return null;
     LocalsStack stackLocalsAtEntry = (LocalsStack)this.StackLocalsAtEntry[block.UniqueKey];
     if (stackLocalsAtEntry == null)
     {
         //Unreachable code, or the very first block
         stackLocalsAtEntry = new LocalsStack();
     }
     this.localsStack = stackLocalsAtEntry.Clone();
     base.VisitBlock(block);
     Block successor = (Block)this.SucessorBlock[block.UniqueKey];
     if (successor != null)
     {
         //Dropping off into successor.
         LocalsStack targetStack = (LocalsStack)this.StackLocalsAtEntry[successor.UniqueKey];
         if (targetStack != null && targetStack.top >= 0)
         {
             //Another predecessor block has already decided what the stack for the successor block is going to look like.
             //Reconcile the stack from this block with the stack expected by the successor block.
             this.localsStack.Transfer(targetStack, block.Statements);
         }
         else
         {
             this.StackLocalsAtEntry[successor.UniqueKey] = this.localsStack;
         }
     }
     return block;
 }
Beispiel #3
0
        public override Block VisitBlock(Block block)
        {
            if (block == null)
            {
                return(null);
            }
            LocalsStack stackLocalsAtEntry = (LocalsStack)this.StackLocalsAtEntry[block.UniqueKey];

            if (stackLocalsAtEntry == null)
            {
                //Unreachable code, or the very first block
                stackLocalsAtEntry = new LocalsStack();
            }
            this.localsStack = stackLocalsAtEntry.Clone();
            base.VisitBlock(block);
            Block successor = (Block)this.SucessorBlock[block.UniqueKey];

            if (successor != null)
            {
                //Dropping off into successor.
                LocalsStack targetStack = (LocalsStack)this.StackLocalsAtEntry[successor.UniqueKey];
                if (targetStack != null && targetStack.top >= 0)
                {
                    //Another predecessor block has already decided what the stack for the successor block is going to look like.
                    //Reconcile the stack from this block with the stack expected by the successor block.
                    this.localsStack.Transfer(targetStack, block.Statements);
                }
                else
                {
                    this.StackLocalsAtEntry[successor.UniqueKey] = this.localsStack;
                }
            }
            return(block);
        }
Beispiel #4
0
 static IEnumerable <LazyString> CreateLocals(int numLocals)
 {
     // TODO: optimize this
     foreach (var i in Enumerable.Range(0, numLocals))
     {
         foreach (var action in LocalsStack.Push(() => "0"))
         {
             yield return(action);
         }
     }
 }
Beispiel #5
0
            private LocalsStack(LocalsStack /*!*/ other)
            {
                this.top = other.top;
                this.exceptionHandlerType = other.exceptionHandlerType;
                Local[] otherElements = other.elements;
                int     n             = otherElements.Length;

                Local[] elements = this.elements = new Local[n];
                //^ base();
                n = this.top + 1;
                for (int i = 0; i < n; i++)
                {
                    elements[i] = otherElements[i];
                }
            }
Beispiel #6
0
            internal void Transfer(LocalsStack /*!*/ targetStack, StatementList /*!*/ statements)
            {
                Debug.Assert(targetStack != null);
                if (targetStack == this)
                {
                    return;
                }
                int n = this.top;

                Debug.Assert(n == targetStack.top);
                for (int i = 0; i <= n; i++)
                {
                    Local sloc = this.elements[i];
                    Local tloc = targetStack.elements[i];
                    if (sloc == tloc)
                    {
                        continue;
                    }
                    Debug.Assert(sloc != null && tloc != null);
                    statements.Add(new AssignmentStatement(tloc, sloc));
                }
            }
Beispiel #7
0
        public override Method VisitMethod(Method method)
        {
            // body might not have been materialized, so make sure we do that first!
            Block body = method.Body;

            if (method == null)
            {
                return(null);
            }
            BlockSorter blockSorter  = new BlockSorter();
            BlockList   sortedBlocks = blockSorter.SortedBlocks;

            this.SucessorBlock      = blockSorter.SuccessorBlock;
            this.StackLocalsAtEntry = new TrivialHashtable();
            this.localsStack        = new LocalsStack();
            ExceptionHandlerList ehandlers = method.ExceptionHandlers;

            for (int i = 0, n = ehandlers == null ? 0 : ehandlers.Count; i < n; i++)
            {
                ExceptionHandler ehandler = ehandlers[i];
                if (ehandler == null)
                {
                    continue;
                }
                Block handlerStart = ehandler.HandlerStartBlock;
                if (handlerStart == null)
                {
                    continue;
                }
                LocalsStack lstack = new LocalsStack();
                this.StackLocalsAtEntry[handlerStart.UniqueKey] = lstack;
                if (ehandler.HandlerType == NodeType.Catch)
                {
                    lstack.exceptionHandlerType = CoreSystemTypes.Object;
                    if (ehandler.FilterType != null)
                    {
                        lstack.exceptionHandlerType = ehandler.FilterType;
                    }
                }
                else if (ehandler.HandlerType == NodeType.Filter)
                {
                    lstack.exceptionHandlerType = CoreSystemTypes.Object;
                    if (ehandler.FilterExpression != null)
                    {
                        lstack = new LocalsStack();
                        lstack.exceptionHandlerType = CoreSystemTypes.Object;
                        this.StackLocalsAtEntry[ehandler.FilterExpression.UniqueKey] = lstack;
                    }
                }
            }
            blockSorter.VisitMethodBody(body);
            for (int i = 0, n = sortedBlocks.Count; i < n; i++)
            {
                Block b = sortedBlocks[i];
                if (b == null)
                {
                    Debug.Assert(false); continue;
                }
                this.VisitBlock(b);
            }
            return(method);
        }
 internal void Transfer(LocalsStack/*!*/ targetStack, StatementList/*!*/ statements) {
   Debug.Assert(targetStack != null);
   if (targetStack == this) return;
   int n = this.top;
   Debug.Assert(n == targetStack.top);
   for (int i = 0; i <= n; i++){
     Local sloc = this.elements[i];
     Local tloc = targetStack.elements[i];
     if (sloc == tloc) continue;
     Debug.Assert(sloc != null && tloc != null);
     statements.Add(new AssignmentStatement(tloc, sloc));
   }
 }
 private LocalsStack(LocalsStack/*!*/ other) {
   this.top = other.top;
   this.exceptionHandlerType = other.exceptionHandlerType;
   Local[] otherElements = other.elements;
   int n = otherElements.Length;
   Local[] elements = this.elements = new Local[n];
   //^ base();
   n = this.top+1;
   for (int i = 0; i < n; i++)
     elements[i] = otherElements[i];
 }
    public override Method VisitMethod(Method method){
      // body might not have been materialized, so make sure we do that first!
      Block body = method.Body;

      if (method == null) return null;
      BlockSorter blockSorter = new BlockSorter();
      BlockList sortedBlocks = blockSorter.SortedBlocks;
      this.SucessorBlock = blockSorter.SuccessorBlock;
      this.StackLocalsAtEntry = new TrivialHashtable();
      this.localsStack = new LocalsStack();
      ExceptionHandlerList ehandlers = method.ExceptionHandlers;
      for (int i = 0, n = ehandlers == null ? 0 : ehandlers.Count; i < n; i++){
        ExceptionHandler ehandler = ehandlers[i];
        if (ehandler == null) continue;
        Block handlerStart = ehandler.HandlerStartBlock;
        if (handlerStart == null) continue;
        LocalsStack lstack = new LocalsStack();
        this.StackLocalsAtEntry[handlerStart.UniqueKey] = lstack;
        if (ehandler.HandlerType == NodeType.Catch) {
          lstack.exceptionHandlerType = CoreSystemTypes.Object;
          if (ehandler.FilterType != null) lstack.exceptionHandlerType = ehandler.FilterType;
        } else if (ehandler.HandlerType == NodeType.Filter) {
          lstack.exceptionHandlerType = CoreSystemTypes.Object;
          if (ehandler.FilterExpression != null) {
            lstack = new LocalsStack();
            lstack.exceptionHandlerType = CoreSystemTypes.Object;
            this.StackLocalsAtEntry[ehandler.FilterExpression.UniqueKey] = lstack;
          }
        }
      }
      blockSorter.VisitMethodBody(body);
      for (int i = 0, n = sortedBlocks.Count; i < n; i++) {
        Block b = sortedBlocks[i];
        if (b == null) { Debug.Assert(false); continue; }
        this.VisitBlock(b);
      }
      return method;
    }
Beispiel #11
0
    Dictionary <OpCode, ToWorkshopActionFunc> CreateToWorkshopActionsDict()
    {
        var dict = new Dictionary <OpCode, ToWorkshopActionFunc>();

        // default opcode is for the skip chain (see InsertSkipChainInstructions)
        dict[OpCodes.No]            = Impl_SkipChainActions;
        dict[OpCodes.Nop]           = Impl_Nop;
        dict[OpCodes.Ldlen]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldelema]       = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_I1]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_U1]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_I2]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_U2]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_I4]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_U4]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_I8]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_I]      = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_R4]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_R8]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_Ref]    = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_I]      = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_I1]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_I2]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_I4]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_I8]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_R4]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_R8]     = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_Ref]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldelem_Any]    = Impl_UnimplementedOp;
        dict[OpCodes.Stelem_Any]    = Impl_UnimplementedOp;
        dict[OpCodes.Newarr]        = Impl_UnimplementedOp;
        dict[OpCodes.Box]           = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Cpobj]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldobj]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldstr]         = Impl_UnimplementedOp;
        dict[OpCodes.Newobj]        = Impl_UnimplementedOp;
        dict[OpCodes.Castclass]     = Impl_UnimplementedOp;
        dict[OpCodes.Isinst]        = Impl_UnimplementedOp;
        dict[OpCodes.Conv_R_Un]     = Impl_UnimplementedOp;
        dict[OpCodes.Unbox]         = Impl_UnimplementedOp;
        dict[OpCodes.Throw]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldfld]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldflda]        = Impl_UnimplementedOp;
        dict[OpCodes.Unbox_Any]     = Impl_UnimplementedOp;
        dict[OpCodes.Stfld]         = Impl_UnimplementedOp;
        dict[OpCodes.Ldsflda]       = Impl_UnimplementedOp;
        dict[OpCodes.Stsfld]        = (method, instruction) => new[]
        {
            SetGlobalAtIndex(Variables.StaticFields, GetStaticFieldIndex(instruction.Operand), VariableStack.GetLastElement(0))
        }.Concat(VariableStack.Pop(1));

        dict[OpCodes.Stobj]          = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I1_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I2_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I4_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I8_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U1_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U2_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U4_Un] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U8_Un] = Impl_UnimplementedOp;

        dict[OpCodes.Ldsfld] = (method, instruction) =>
        {
            var index = GetStaticFieldIndex(instruction.Operand);
            return(VariableStack.Push(ArraySubscript(GetGlobal(Variables.StaticFields), () => index.ToString())));
        };

        dict[OpCodes.Callvirt]    = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I1] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I2] = Impl_UnimplementedOp;
        dict[OpCodes.Cgt_Un]      = Impl_UnimplementedOp;
        dict[OpCodes.Clt]         = Impl_UnimplementedOp;
        dict[OpCodes.Clt_Un]      = Impl_UnimplementedOp;
        dict[OpCodes.Ldftn]       = Impl_UnimplementedOp;
        dict[OpCodes.Ldvirtftn]   = Impl_UnimplementedOp;
        dict[OpCodes.Ldarg]       = Impl_UnimplementedOp;
        dict[OpCodes.Ldarga]      = Impl_UnimplementedOp;
        dict[OpCodes.Starg]       = Impl_UnimplementedOp;
        dict[OpCodes.Ldloc]       = Impl_UnimplementedOp;
        dict[OpCodes.Ldloca]      = Impl_UnimplementedOp;
        dict[OpCodes.Stloc]       = Impl_UnimplementedOp;
        dict[OpCodes.Localloc]    = Impl_UnimplementedOp;
        dict[OpCodes.Endfilter]   = Impl_UnimplementedOp;
        dict[OpCodes.Unaligned]   = Impl_UnimplementedOp;
        dict[OpCodes.Volatile]    = Impl_UnimplementedOp;
        dict[OpCodes.Tail]        = Impl_UnimplementedOp;
        dict[OpCodes.Initobj]     = Impl_UnimplementedOp;
        dict[OpCodes.Constrained] = Impl_UnimplementedOp;
        dict[OpCodes.Cpblk]       = Impl_UnimplementedOp;
        dict[OpCodes.Initblk]     = Impl_UnimplementedOp;
        dict[OpCodes.Rethrow]     = Impl_UnimplementedOp;
        dict[OpCodes.Sizeof]      = Impl_UnimplementedOp;
        dict[OpCodes.Cgt]         = Impl_UnimplementedOp;
        dict[OpCodes.Ceq]         = Impl_UnimplementedOp;
        dict[OpCodes.Arglist]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_U]      = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U2] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I4] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U4] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I8] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U8] = Impl_UnimplementedOp;
        dict[OpCodes.Refanyval]   = Impl_UnimplementedOp;
        dict[OpCodes.Ckfinite]    = Impl_UnimplementedOp;
        dict[OpCodes.Mkrefany]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldtoken]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_U2]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_U1]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U1] = Impl_UnimplementedOp;
        dict[OpCodes.Conv_I]      = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_U]  = Impl_UnimplementedOp;
        dict[OpCodes.Add_Ovf]     = Impl_UnimplementedOp;
        dict[OpCodes.Add_Ovf_Un]  = Impl_UnimplementedOp;
        dict[OpCodes.Mul_Ovf]     = Impl_UnimplementedOp;
        dict[OpCodes.Mul_Ovf_Un]  = Impl_UnimplementedOp;
        dict[OpCodes.Sub_Ovf]     = Impl_UnimplementedOp;
        dict[OpCodes.Sub_Ovf_Un]  = Impl_UnimplementedOp;
        dict[OpCodes.Endfinally]  = Impl_UnimplementedOp;
        dict[OpCodes.Leave]       = Impl_UnimplementedOp;
        dict[OpCodes.Leave_S]     = Impl_UnimplementedOp;
        dict[OpCodes.Stind_I]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_Ovf_I]  = Impl_UnimplementedOp;
        dict[OpCodes.Refanytype]  = Impl_UnimplementedOp;
        dict[OpCodes.Conv_U8]     = Impl_UnimplementedOp;
        dict[OpCodes.Conv_R8]     = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_7]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_8]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_S]    = (method, instruction) => VariableStack.Push(() => ((System.SByte)instruction.Operand).ToString());
        dict[OpCodes.Ldc_I4]      = (method, instruction) => VariableStack.Push(() => ((int)instruction.Operand).ToString());
        dict[OpCodes.Ldc_I8]      = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_R4]      = (method, instruction) => VariableStack.Push(() => ((float)instruction.Operand).ToString());
        dict[OpCodes.Ldc_R8]      = (method, instruction) => VariableStack.Push(() => ((double)instruction.Operand).ToString());
        dict[OpCodes.Dup]         = (method, instruction) => VariableStack.Push(VariableStack.GetLastElement(0));
        dict[OpCodes.Pop]         = (method, instruction) => VariableStack.Pop(1);
        dict[OpCodes.Jmp]         = Impl_UnimplementedOp;
        dict[OpCodes.Call]        = Impl_Call;
        dict[OpCodes.Calli]       = Impl_UnimplementedOp;

        dict[OpCodes.Ret] = (method, instruction) => CallStack.Pop(1).
                            // if it's a workshop event, then it needs the max num of local variables (since it's called at runtime)
                            Concat(LocalsStack.Pop(GetCustomAttributeData <WorkshopEventAttribute>(method) != null ? m_maxNumLocalVariables : GetNumLocalVariables(method.Definition))).
                            Concat(ParameterStack.Pop(method.Definition.Parameters.Count)).
                            // (loop instead of abort so you can call functions recursively)
                            Concat(new LazyString[] { () => "Loop;" });

        dict[OpCodes.Br_S] = (method, instruction) => Impl_Jump_If(method, instruction, 0, () => "True");

        dict[OpCodes.Brfalse_S] = (method, instruction) => Impl_Jump_If(method, instruction, 1, Equal(ArraySubscript(GetGlobal(Variables.Temporary), () => "0"), () => "0"));
        dict[OpCodes.Brtrue_S]  = (method, instruction) => Impl_Jump_If(method, instruction, 1, NotEqual(ArraySubscript(GetGlobal(Variables.Temporary), () => "0"), () => "0"));

        dict[OpCodes.Beq_S] = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "==");
        dict[OpCodes.Bge_S] = (method, instruction) => Impl_Jump_If_Compare(method, instruction, ">=");
        dict[OpCodes.Bgt_S] = (method, instruction) => Impl_Jump_If_Compare(method, instruction, ">");
        dict[OpCodes.Ble_S] = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "<=");
        dict[OpCodes.Blt_S] = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "<");

        dict[OpCodes.Bne_Un_S] = (method, instruction) => Impl_Jump_If(method, instruction, NotEqual);
        dict[OpCodes.Bge_Un_S] = dict[OpCodes.Bge_S];

        dict[OpCodes.Ldc_I4_6] = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_5] = (method, Instruction) => VariableStack.Push(() => "5");
        dict[OpCodes.Ldc_I4_4] = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_3] = Impl_UnimplementedOp;
        dict[OpCodes.Break]    = Impl_UnimplementedOp;

        dict[OpCodes.Ldarg_0] = (method, instruction) =>
                                VariableStack.Push(ParameterStack.GetLastElement(method.Definition.Parameters.Count - 1));
        dict[OpCodes.Ldarg_1] = (method, instruction) =>
                                VariableStack.Push(ParameterStack.GetLastElement(method.Definition.Parameters.Count - 2));
        dict[OpCodes.Ldarg_2] = (method, instruction) =>
                                VariableStack.Push(ParameterStack.GetLastElement(method.Definition.Parameters.Count - 3));
        dict[OpCodes.Ldarg_3] = (method, instruction) =>
                                VariableStack.Push(ParameterStack.GetLastElement(method.Definition.Parameters.Count - 4));

        dict[OpCodes.Ldloc_0]   = (method, instruction) => VariableStack.Push(LocalsStack.GetLastElement(GetLocalVariableStackOffset(method, 0)));
        dict[OpCodes.Ldloc_1]   = (method, instruction) => VariableStack.Push(LocalsStack.GetLastElement(GetLocalVariableStackOffset(method, 1)));
        dict[OpCodes.Ldloc_2]   = (method, instruction) => VariableStack.Push(LocalsStack.GetLastElement(GetLocalVariableStackOffset(method, 2)));
        dict[OpCodes.Ldloc_3]   = (method, instruction) => VariableStack.Push(LocalsStack.GetLastElement(GetLocalVariableStackOffset(method, 3)));
        dict[OpCodes.Stloc_0]   = (method, instruction) => Impl_Stloc(method, 0);
        dict[OpCodes.Stloc_1]   = (method, instruction) => Impl_Stloc(method, 1);
        dict[OpCodes.Bgt_Un_S]  = Impl_UnimplementedOp;
        dict[OpCodes.Stloc_2]   = (method, instruction) => Impl_Stloc(method, 2);
        dict[OpCodes.Ldarg_S]   = Impl_UnimplementedOp;
        dict[OpCodes.Ldarga_S]  = Impl_UnimplementedOp;
        dict[OpCodes.Starg_S]   = Impl_Starg_S;
        dict[OpCodes.Ldloc_S]   = (method, instruction) => VariableStack.Push(LocalsStack.GetLastElement(GetLocalVariableStackOffset(method, ((VariableDefinition)instruction.Operand).Index)));
        dict[OpCodes.Ldloca_S]  = Impl_UnimplementedOp;
        dict[OpCodes.Stloc_S]   = (method, instruction) => Impl_Stloc(method, ((VariableDefinition)instruction.Operand).Index);
        dict[OpCodes.Ldnull]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_M1] = Impl_UnimplementedOp;
        dict[OpCodes.Ldc_I4_0]  = (method, instruction) => VariableStack.Push(() => "0");
        dict[OpCodes.Ldc_I4_1]  = (method, instruction) => VariableStack.Push(() => "1");
        dict[OpCodes.Ldc_I4_2]  = (method, Instruction) => VariableStack.Push(() => "2");
        dict[OpCodes.Stloc_3]   = (method, instruction) => Impl_Stloc(method, 3);
        dict[OpCodes.Conv_U4]   = Impl_UnimplementedOp;
        dict[OpCodes.Ble_Un_S]  = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "<=");
        dict[OpCodes.Br]        = (method, instruction) => Impl_Jump_If(method, instruction, 0, () => "True");
        dict[OpCodes.Stind_I8]  = Impl_UnimplementedOp;
        dict[OpCodes.Stind_R4]  = Impl_UnimplementedOp;
        dict[OpCodes.Stind_R8]  = Impl_UnimplementedOp;

        dict[OpCodes.Add]       = (method, instruction) => DoBinaryOp(Add);
        dict[OpCodes.Sub]       = (method, instruction) => DoBinaryOp(Subtract);
        dict[OpCodes.Mul]       = (method, instruction) => DoBinaryOp(Mul);
        dict[OpCodes.Div]       = (method, instruction) => DoBinaryOp(Div);
        dict[OpCodes.Div_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Rem]       = (method, instruction) => DoBinaryOp(Mod);
        dict[OpCodes.Rem_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.And]       = (method, instruction) => DoBinaryOp(And);
        dict[OpCodes.Or]        = (method, instruction) => DoBinaryOp(Or);
        dict[OpCodes.Xor]       = Impl_UnimplementedOp;
        dict[OpCodes.Shl]       = Impl_UnimplementedOp;
        dict[OpCodes.Shr]       = Impl_UnimplementedOp;
        dict[OpCodes.Shr_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Neg]       = Impl_UnimplementedOp;
        dict[OpCodes.Not]       = Impl_UnimplementedOp;
        dict[OpCodes.Conv_I1]   = Impl_UnimplementedOp;
        dict[OpCodes.Conv_I2]   = Impl_UnimplementedOp;
        dict[OpCodes.Conv_I4]   = Impl_UnimplementedOp;
        dict[OpCodes.Conv_I8]   = Impl_UnimplementedOp;
        dict[OpCodes.Conv_R4]   = Impl_Nop; // shouldn't need to convert int to real
        dict[OpCodes.Stind_I4]  = Impl_UnimplementedOp;
        dict[OpCodes.Stind_I2]  = Impl_UnimplementedOp;
        dict[OpCodes.Stind_I1]  = Impl_UnimplementedOp;
        dict[OpCodes.Stind_Ref] = Impl_UnimplementedOp;

        dict[OpCodes.Brfalse] = (method, instruction) => dict[OpCodes.Brfalse_S](method, instruction);
        dict[OpCodes.Brtrue]  = (method, instruction) => dict[OpCodes.Brtrue_S](method, instruction);

        dict[OpCodes.Beq]       = Impl_UnimplementedOp;
        dict[OpCodes.Bge]       = Impl_UnimplementedOp;
        dict[OpCodes.Bgt]       = Impl_UnimplementedOp;
        dict[OpCodes.Ble]       = Impl_UnimplementedOp;
        dict[OpCodes.Blt]       = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "<");
        dict[OpCodes.Bne_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Bge_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Bgt_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Ble_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Blt_Un_S]  = (method, instruction) => Impl_Jump_If_Compare(method, instruction, "<");
        dict[OpCodes.Blt_Un]    = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_I1]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_U1]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_I2]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_U2]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_I4]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_U4]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_I8]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_I]   = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_R4]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_R8]  = Impl_UnimplementedOp;
        dict[OpCodes.Ldind_Ref] = Impl_UnimplementedOp;
        dict[OpCodes.Switch]    = Impl_UnimplementedOp;
        dict[OpCodes.Readonly]  = Impl_UnimplementedOp;

        return(dict);
    }
Beispiel #12
0
 static IEnumerable <LazyString> Impl_Stloc(MethodInfo method, int localVariableIndex)
 {
     return(LocalsStack.SetLastElement(GetLocalVariableStackOffset(method, localVariableIndex), VariableStack.GetLastElement(0)).
            Concat(VariableStack.Pop(1)));
 }