Exemplo n.º 1
0
        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++;
            }
        }
Exemplo n.º 2
0
        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++;
            }
        }