Example #1
0
        public void Parse(ref BinaryReader reader)
        {
            attribute_name_index = EndianSwap.SwapUInt16(reader.ReadUInt16());

            attribute_length = EndianSwap.SwapUInt32(reader.ReadUInt32());

            info = reader.ReadBytes((int)attribute_length);
        }
Example #2
0
        public void Parse(ref BinaryReader reader)
        {
            access_flags = EndianSwap.SwapUInt16(reader.ReadUInt16());

            name_index = EndianSwap.SwapUInt16(reader.ReadUInt16());

            description_index = EndianSwap.SwapUInt16(reader.ReadUInt16());

            attributes_count = EndianSwap.SwapUInt16(reader.ReadUInt16());

            attributes = new AttributeInfo [attributes_count];

            for (int i = 0; i < attributes_count; ++i)
            {
                attributes [i] = new AttributeInfo();

                attributes [i].Parse(ref reader);
            }
        }
Example #3
0
        public override void Parse(ref BinaryReader reader)
        {
            class_index = EndianSwap.SwapUInt16(reader.ReadUInt16());

            name_and_type_index = EndianSwap.SwapUInt16(reader.ReadUInt16());
        }
Example #4
0
        public override void Parse(ref BinaryReader reader)
        {
            bootstrap_method_attr_index = EndianSwap.SwapUInt16(reader.ReadUInt16());

            name_and_type_index = EndianSwap.SwapUInt16(reader.ReadUInt16());
        }
Example #5
0
 public override void Parse(ref BinaryReader reader)
 {
     descriptor_index = EndianSwap.SwapUInt16(reader.ReadUInt16());
 }
Example #6
0
        public override void Parse(ref BinaryReader reader)
        {
            reference_kind = reader.ReadByte();

            reference_index = EndianSwap.SwapUInt16(reader.ReadUInt16());
        }
Example #7
0
        public override void Parse(ref BinaryReader reader)
        {
            length = EndianSwap.SwapUInt16(reader.ReadUInt16());

            bytes = reader.ReadBytes((int)length);
        }
Example #8
0
        public override void Parse(ref BinaryReader reader)
        {
            high_bytes = EndianSwap.SwapUInt32(reader.ReadUInt32());

            low_bytes = EndianSwap.SwapUInt32(reader.ReadUInt32());
        }
Example #9
0
 public override void Parse(ref BinaryReader reader)
 {
     bytes = EndianSwap.SwapSingle(reader.ReadSingle());
 }
Example #10
0
 public override void Parse(ref BinaryReader reader)
 {
     string_index = EndianSwap.SwapUInt16(reader.ReadUInt16());
 }
Example #11
0
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public ClassFile(BinaryReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            magic_number = EndianSwap.SwapUInt32(reader.ReadUInt32());

            if (magic_number != 0xCAFEBABE)
            {
                throw new InvalidOperationException(string.Format("Unexpected magic number. {0} != 0xCAFEBABE", magic_number.ToString("X")));
            }

            minor_version = EndianSwap.SwapUInt16(reader.ReadUInt16());

            major_version = EndianSwap.SwapUInt16(reader.ReadUInt16());

            constant_pool_count = EndianSwap.SwapUInt16(reader.ReadUInt16()); // constant_pool_count item is equal to the number of entries in the constant_pool table plus one.

            constant_pool = new ConstantInfo [constant_pool_count];

            for (ushort i = 1; i < constant_pool_count; ++i)
            {
                ConstantInfo.Tags tag = (ConstantInfo.Tags)Enum.ToObject(typeof(ConstantInfo.Tags), reader.ReadByte());

                switch (tag)
                {
                case ConstantInfo.Tags.CONSTANT_Class: constant_pool [i] = new ConstantClassInfo(); break;

                case ConstantInfo.Tags.CONSTANT_FieldRef: constant_pool [i] = new ConstantFieldRefInfo(); break;

                case ConstantInfo.Tags.CONSTANT_MethodRef: constant_pool [i] = new ConstantMethodRefInfo(); break;

                case ConstantInfo.Tags.CONSTANT_InterfaceMethodRef: constant_pool [i] = new ConstantInterfaceMethodRefInfo(); break;

                case ConstantInfo.Tags.CONSTANT_String: constant_pool [i] = new ConstantStringInfo(); break;

                case ConstantInfo.Tags.CONSTANT_Integer: constant_pool [i] = new ConstantIntegerInfo(); break;

                case ConstantInfo.Tags.CONSTANT_Float: constant_pool [i] = new ConstantFloatInfo(); break;

                case ConstantInfo.Tags.CONSTANT_Long: constant_pool [i] = new ConstantLongInfo(); break;

                case ConstantInfo.Tags.CONSTANT_Double: constant_pool [i] = new ConstantDoubleInfo(); break;

                case ConstantInfo.Tags.CONSTANT_NameAndType: constant_pool [i] = new ConstantNameAndTypeInfo(); break;

                case ConstantInfo.Tags.CONSTANT_Utf8: constant_pool [i] = new ConstantUtf8Info(); break;

                case ConstantInfo.Tags.CONSTANT_MethodHandle: constant_pool [i] = new ConstantMethodHandleInfo(); break;

                case ConstantInfo.Tags.CONSTANT_MethodType: constant_pool [i] = new ConstantMethodTypeInfo(); break;

                case ConstantInfo.Tags.CONSTANT_InvokeDynamic: constant_pool [i] = new ConstantInvokeDynamicInfo(); break;

                default: throw new InvalidOperationException("Unexpected constant tag: " + tag.ToString()); break;
                }

                constant_pool [i].Parse(ref reader);

                switch (tag)
                {
                case ConstantInfo.Tags.CONSTANT_Long:
                case ConstantInfo.Tags.CONSTANT_Double:
                {
                    //
                    // If a CONSTANT_Long_info or CONSTANT_Double_info structure is the item in the constant_pool table at
                    // index n, then the next usable item in the pool is located at index n+2.
                    //

                    ++i;

                    break;
                }
                }
            }

            access_flags = EndianSwap.SwapUInt16(reader.ReadUInt16());

            this_class = EndianSwap.SwapUInt16(reader.ReadUInt16());

            super_class = EndianSwap.SwapUInt16(reader.ReadUInt16());

            interfaces_count = EndianSwap.SwapUInt16(reader.ReadUInt16());

            interfaces = new ushort [interfaces_count];

            for (ushort i = 0; i < interfaces_count; ++i)
            {
                interfaces [i] = EndianSwap.SwapUInt16(reader.ReadUInt16());
            }

            fields_count = EndianSwap.SwapUInt16(reader.ReadUInt16());

            fields = new FieldInfo [fields_count];

            for (ushort i = 0; i < fields_count; ++i)
            {
                fields [i] = new FieldInfo();

                fields [i].Parse(ref reader);
            }

            methods_count = EndianSwap.SwapUInt16(reader.ReadUInt16());

            methods = new MethodInfo [methods_count];

            for (ushort i = 0; i < methods_count; ++i)
            {
                methods [i] = new MethodInfo();

                methods [i].Parse(ref reader);
            }

            attributes_count = EndianSwap.SwapUInt16(reader.ReadUInt16());

            attributes = new AttributeInfo [attributes_count];

            for (ushort i = 0; i < attributes_count; ++i)
            {
                attributes [i] = new AttributeInfo();

                attributes [i].Parse(ref reader);
            }
        }