private void WriteArrayData(Instruction ins) { Array elements; Type elementtype; int elementsize; MethodBody.CheckArrayData(ins, out elements, out elementtype, out elementsize); WriteShort(PseudoOpCodes.Fill_array_data, ref ExtraOffset); WriteShort(elementsize, ref ExtraOffset); WriteInt(elements.Length, ref ExtraOffset); var firstByte = true; foreach (object element in elements) { switch (elementsize) { case 1: if (firstByte) { Codes[ExtraOffset++] |= (ushort)((byte)Convert.ToSByte(element)); } else { Codes[ExtraOffset - 1] |= (ushort)((byte)(Convert.ToSByte(element)) << 8); } firstByte = !firstByte; break; case 2: WriteShort(element, ref ExtraOffset); break; case 4: WriteInt(element, ref ExtraOffset); break; case 8: WriteLong(element, ref ExtraOffset); break; default: throw new InstructionException(ins, "Unexpected Fill-array-data element size"); } } // Align on 4 bytes (2 units) if (ExtraOffset % 2 != 0) { ExtraOffset++; } }
private void WriteArrayData(Instruction ins) { Array elements; Type elementtype; int elementsize; MethodBody.CheckArrayData(ins, out elements, out elementtype, out elementsize); WriteShort(PseudoOpCodes.FillArrayData, ref _extraOffset); WriteShort(elementsize, ref _extraOffset); WriteInt(elements.Length, ref _extraOffset); var next = false; foreach (var element in elements) { switch (elementsize) { case 1: if (next) { Codes[_extraOffset++] |= (ushort)((byte)(Convert.ToSByte(element)) << 8); } else { Codes[_extraOffset] |= (byte)Convert.ToSByte(element); } next = !next; break; case 2: WriteShort(element, ref _extraOffset); break; case 4: WriteInt(element, ref _extraOffset); break; case 8: WriteLong(element, ref _extraOffset); break; default: throw new InstructionException(ins, "Unexpected Fill-array-data element size"); } } if ((elements.Length % 2 != 0) && (elementsize == 1)) { _extraOffset++; } }