Mono.Cecil.Cil.CodeWriter.ComputePopDelta C# (CSharp) Method

ComputePopDelta() static private method

static private ComputePopDelta ( StackBehaviour pop_behavior, int &stack_size ) : void
pop_behavior StackBehaviour
stack_size int
return void
        static void ComputePopDelta(StackBehaviour pop_behavior, ref int stack_size)
        {
            switch (pop_behavior) {
            case StackBehaviour.Popi:
            case StackBehaviour.Popref:
            case StackBehaviour.Pop1:
                stack_size--;
                break;
            case StackBehaviour.Pop1_pop1:
            case StackBehaviour.Popi_pop1:
            case StackBehaviour.Popi_popi:
            case StackBehaviour.Popi_popi8:
            case StackBehaviour.Popi_popr4:
            case StackBehaviour.Popi_popr8:
            case StackBehaviour.Popref_pop1:
            case StackBehaviour.Popref_popi:
                stack_size -= 2;
                break;
            case StackBehaviour.Popi_popi_popi:
            case StackBehaviour.Popref_popi_popi:
            case StackBehaviour.Popref_popi_popi8:
            case StackBehaviour.Popref_popi_popr4:
            case StackBehaviour.Popref_popi_popr8:
            case StackBehaviour.Popref_popi_popref:
                stack_size -= 3;
                break;
            case StackBehaviour.PopAll:
                stack_size = 0;
                break;
            }
        }

Usage Example

 private static void ComputeStackDelta(Instruction instruction, ref int stack_size)
 {
     if (instruction.opcode.FlowControl != FlowControl.Call)
     {
         CodeWriter.ComputePopDelta(instruction.opcode.StackBehaviourPop, ref stack_size);
         CodeWriter.ComputePushDelta(instruction.opcode.StackBehaviourPush, ref stack_size);
     }
     else
     {
         IMethodSignature methodSignature = (IMethodSignature)instruction.operand;
         if (methodSignature.HasImplicitThis() && instruction.opcode.Code != Code.Newobj)
         {
             stack_size--;
         }
         if (methodSignature.HasParameters)
         {
             stack_size -= methodSignature.Parameters.Count;
         }
         if (instruction.opcode.Code == Code.Calli)
         {
             stack_size--;
         }
         if (methodSignature.ReturnType.etype != ElementType.Void || instruction.opcode.Code == Code.Newobj)
         {
             stack_size++;
             return;
         }
     }
 }