Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Emit() [10/17]

virtual void System.Reflection.Emit.ILGenerator.Emit ( OpCode opcode,
LocalBuilder local )
inlinevirtual

Definition at line 676 of file ILGenerator.cs.

677 {
678 if (local == null)
679 {
680 throw new ArgumentNullException("local");
681 }
682 int localIndex = local.GetLocalIndex();
683 if (local.GetMethodBuilder() != m_methodBuilder)
684 {
685 throw new ArgumentException(SR.Argument_UnmatchedMethodForLocal, "local");
686 }
687 if (opcode.Equals(OpCodes.Ldloc))
688 {
689 switch (localIndex)
690 {
691 case 0:
692 opcode = OpCodes.Ldloc_0;
693 break;
694 case 1:
695 opcode = OpCodes.Ldloc_1;
696 break;
697 case 2:
698 opcode = OpCodes.Ldloc_2;
699 break;
700 case 3:
701 opcode = OpCodes.Ldloc_3;
702 break;
703 default:
704 if (localIndex <= 255)
705 {
706 opcode = OpCodes.Ldloc_S;
707 }
708 break;
709 }
710 }
711 else if (opcode.Equals(OpCodes.Stloc))
712 {
713 switch (localIndex)
714 {
715 case 0:
716 opcode = OpCodes.Stloc_0;
717 break;
718 case 1:
719 opcode = OpCodes.Stloc_1;
720 break;
721 case 2:
722 opcode = OpCodes.Stloc_2;
723 break;
724 case 3:
725 opcode = OpCodes.Stloc_3;
726 break;
727 default:
728 if (localIndex <= 255)
729 {
730 opcode = OpCodes.Stloc_S;
731 }
732 break;
733 }
734 }
735 else if (opcode.Equals(OpCodes.Ldloca) && localIndex <= 255)
736 {
737 opcode = OpCodes.Ldloca_S;
738 }
740 InternalEmit(opcode);
741 if (opcode.OperandType == OperandType.InlineNone)
742 {
743 return;
744 }
745 if (!OpCodes.TakesSingleByteArgument(opcode))
746 {
748 m_length += 2;
749 return;
750 }
751 if (localIndex > 255)
752 {
753 throw new InvalidOperationException(SR.InvalidOperation_BadInstructionOrIndexOutOfBound);
754 }
755 m_ILStream[m_length++] = (byte)localIndex;
756 }
static void WriteInt16LittleEndian(Span< byte > destination, short value)
void InternalEmit(OpCode opcode)

References System.SR.Argument_UnmatchedMethodForLocal, System.Reflection.Emit.ILGenerator.EnsureCapacity(), System.Reflection.Emit.OpCode.Equals(), System.Reflection.Emit.LocalBuilder.GetLocalIndex(), System.Reflection.Emit.LocalBuilder.GetMethodBuilder(), System.Reflection.Emit.ILGenerator.InternalEmit(), System.SR.InvalidOperation_BadInstructionOrIndexOutOfBound, System.Reflection.Emit.OpCodes.Ldloc, System.Reflection.Emit.OpCodes.Ldloc_0, System.Reflection.Emit.OpCodes.Ldloc_1, System.Reflection.Emit.OpCodes.Ldloc_2, System.Reflection.Emit.OpCodes.Ldloc_3, System.Reflection.Emit.OpCodes.Ldloc_S, System.Reflection.Emit.OpCodes.Ldloca, System.Reflection.Emit.OpCodes.Ldloca_S, System.Reflection.Emit.ILGenerator.m_ILStream, System.Reflection.Emit.ILGenerator.m_length, System.Reflection.Emit.ILGenerator.m_methodBuilder, System.Reflection.Emit.OpCode.OperandType, System.Reflection.Emit.OpCodes.Stloc, System.Reflection.Emit.OpCodes.Stloc_0, System.Reflection.Emit.OpCodes.Stloc_1, System.Reflection.Emit.OpCodes.Stloc_2, System.Reflection.Emit.OpCodes.Stloc_3, System.Reflection.Emit.OpCodes.Stloc_S, System.Reflection.Emit.OpCodes.TakesSingleByteArgument(), and System.Buffers.Binary.BinaryPrimitives.WriteInt16LittleEndian().