Пример #1
0
        public void Remove(Instruction instr)
        {
            if (!m_instrs.Contains(instr))
            {
                throw new ArgumentException("Instruction not in method body");
            }

            if (instr.Previous != null)
            {
                instr.Previous.Next = instr.Next;
            }
            if (instr.Next != null)
            {
                instr.Next.Previous = instr.Previous;
            }
            m_instrs.Remove(instr);
        }
Пример #2
0
		void ComputeMaxStack (InstructionCollection instructions)
		{
			InstructionCollection ehs = new InstructionCollection (null);
			foreach (ExceptionHandler eh in instructions.Container.ExceptionHandlers)
				switch (eh.Type) {
				case ExceptionHandlerType.Catch :
					ehs.Add (eh.HandlerStart);
					break;
				case ExceptionHandlerType.Filter :
					ehs.Add (eh.FilterStart);
					break;
				}

			int max = 0, current = 0;
			foreach (Instruction instr in instructions) {

				if (ehs.Contains (instr))
					current++;

				switch (instr.OpCode.StackBehaviourPush) {
				case StackBehaviour.Push1:
				case StackBehaviour.Pushi:
				case StackBehaviour.Pushi8:
				case StackBehaviour.Pushr4:
				case StackBehaviour.Pushr8:
				case StackBehaviour.Pushref:
				case StackBehaviour.Varpush:
					current++;
					break;
				case StackBehaviour.Push1_push1:
					current += 2;
					break;
				}

				if (max < current)
					max = current;

				switch (instr.OpCode.StackBehaviourPop) {
				case StackBehaviour.Varpop:
					break;
				case StackBehaviour.Pop1:
				case StackBehaviour.Popi:
				case StackBehaviour.Popref:
					current--;
					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:
					current -= 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:
					current -= 3;
					break;
				}
			}

			instructions.Container.MaxStack = max;
		}
Пример #3
0
        static void ComputeMaxStack(InstructionCollection instructions)
        {
            InstructionCollection ehs = new InstructionCollection(null);

            foreach (ExceptionHandler eh in instructions.Container.ExceptionHandlers)
            {
                switch (eh.Type)
                {
                case ExceptionHandlerType.Catch:
                    ehs.Add(eh.HandlerStart);
                    break;

                case ExceptionHandlerType.Filter:
                    ehs.Add(eh.FilterStart);
                    break;
                }
            }

            int max = 0, current = 0;

            foreach (Instruction instr in instructions)
            {
                if (ehs.Contains(instr))
                {
                    current++;
                }

                switch (instr.OpCode.StackBehaviourPush)
                {
                case StackBehaviour.Push1:
                case StackBehaviour.Pushi:
                case StackBehaviour.Pushi8:
                case StackBehaviour.Pushr4:
                case StackBehaviour.Pushr8:
                case StackBehaviour.Pushref:
                case StackBehaviour.Varpush:
                    current++;
                    break;

                case StackBehaviour.Push1_push1:
                    current += 2;
                    break;
                }

                if (max < current)
                {
                    max = current;
                }

                switch (instr.OpCode.StackBehaviourPop)
                {
                case StackBehaviour.Varpop:
                    break;

                case StackBehaviour.Pop1:
                case StackBehaviour.Popi:
                case StackBehaviour.Popref:
                    current--;
                    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:
                    current -= 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:
                    current -= 3;
                    break;
                }

                if (current < 0)
                {
                    current = 0;
                }
            }

            instructions.Container.MaxStack = max;
        }
Пример #4
0
        static void ComputeMaxStack(InstructionCollection instructions)
        {
            InstructionCollection ehs = new InstructionCollection (null);
            foreach (ExceptionHandler eh in instructions.Container.ExceptionHandlers) {
                switch (eh.Type) {
                case ExceptionHandlerType.Catch :
                    ehs.Add (eh.HandlerStart);
                    break;
                case ExceptionHandlerType.Filter :
                    ehs.Add (eh.FilterStart);
                    break;
                }
            }

            int max = 0;
            foreach (Instruction instr in instructions) {
                if (ehs.Contains (instr))
                    max++;

                switch (instr.OpCode.StackBehaviourPush) {
                case StackBehaviour.Push1:
                case StackBehaviour.Pushi:
                case StackBehaviour.Pushi8:
                case StackBehaviour.Pushr4:
                case StackBehaviour.Pushr8:
                case StackBehaviour.Pushref:
                case StackBehaviour.Varpush:
                    max++;
                    break;
                case StackBehaviour.Push1_push1:
                    max += 2;
                    break;
                }

                if (instr.OpCode.OperandType == OperandType.InlineMethod) {
                    IMethodSignature signature = instr.Operand as IMethodSignature;
                    if (signature != null && signature.ReturnType.ReturnType.FullName != Constants.Void)
                        max++;
                }
            }

            instructions.Container.MaxStack = max;
        }