Пример #1
0
        public void ReadConstantPool_ConstantCountIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            // Class file has constant pool size of 98, index 0 is reserved, 2 indices are skipped due to large constants.
            Assert.Equal(95, constantPool.Constants.Count);
        }
Пример #2
0
        public void ReadConstantPool_ClassInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (ClassInfo)constantPool.ResolveConstant(2);

            Assert.Equal(48, constant.NameIndex);
        }
Пример #3
0
        public void ReadConstantPool_MethodTypeInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (MethodTypeInfo)constantPool.ResolveConstant(57);

            Assert.Equal(33, constant.DescriptorIndex);
        }
Пример #4
0
        public void ReadConstantPool_Utf8InfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (Utf8Info)constantPool.ResolveConstant(15);

            Assert.Equal("IntValue", constant.Value);
        }
Пример #5
0
        public void ReadConstantPool_FloatInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (PrimitiveInfo)constantPool.ResolveConstant(25);

            Assert.IsType <float>(constant.Value);
            Assert.Equal(42f, constant.Value);
        }
Пример #6
0
        public void ReadConstantPool_IntegerInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (PrimitiveInfo)constantPool.ResolveConstant(18);

            Assert.IsType <int>(constant.Value);
            Assert.Equal(42, constant.Value);
        }
Пример #7
0
        public void ReadConstantPool_InterfaceMethodRefInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (InterfaceMethodRefInfo)constantPool.ResolveConstant(6);

            Assert.Equal(52, constant.ClassIndex);
            Assert.Equal(53, constant.NameAndTypeIndex);
        }
Пример #8
0
        public void ReadConstantPool_MethodRefInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (MethodRefInfo)constantPool.ResolveConstant(1);

            Assert.Equal(14, constant.ClassIndex);
            Assert.Equal(47, constant.NameAndTypeIndex);
        }
Пример #9
0
        public void ReadConstantPool_FieldRefInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (FieldRefInfo)constantPool.ResolveConstant(11);

            Assert.Equal(62, constant.ClassIndex);
            Assert.Equal(63, constant.NameAndTypeIndex);
        }
Пример #10
0
        public void ReadConstantPool_InvokeDynamicInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (InvokeDynamicInfo)constantPool.ResolveConstant(8);

            Assert.Equal(59, constant.NameAndTypeIndex);
            Assert.Equal(0, constant.BootstrapMethodIndex);
        }
Пример #11
0
        public void ReadConstantPool_MethodHandleInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (MethodHandleInfo)constantPool.ResolveConstant(56);

            Assert.Equal(MethodReferenceKind.InvokeStatic, constant.ReferenceKind);
            Assert.Equal(74, constant.ReferenceIndex);
        }
Пример #12
0
        public void ReadConstantPool_DoubleInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (PrimitiveInfo)constantPool.ResolveConstant(28);

            Assert.IsType <double>(constant.Value);
            Assert.Equal(42d, constant.Value);
        }
Пример #13
0
        public void ReadConstantPool_LongInfoIsCorrect()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            var constant = (PrimitiveInfo)constantPool.ResolveConstant(21);

            Assert.IsType <long>(constant.Value);
            Assert.Equal(42L, constant.Value);
        }
Пример #14
0
        public void ReadConstantPool_ConstantsHaveProperIndices()
        {
            var constantPool = ConstantPool.FromReader(_reader);

            // A constant before large pool entries where indices are sequential.
            var constant1 = constantPool.ResolveString(15);
            // A constant after large pool entries, with indices skipped.
            var constant2 = constantPool.ResolveString(30);

            Assert.Equal("IntValue", constant1);
            Assert.Equal("StringValue", constant2);
        }
Пример #15
0
        /// <summary>
        /// Parses a class file from a binary reader.
        /// </summary>
        /// <param name="reader">The reader to read from.</param>
        /// <returns>The parsed class file.</returns>
        /// <exception cref="BadImageFormatException">Occurs when the file does not provide a valid signature of
        /// a class file.</exception>
        public static JavaClassFile FromReader(IBigEndianReader reader)
        {
            uint magic = reader.ReadUInt32();

            if (magic != Magic)
            {
                throw new BadImageFormatException("Image does not contain a valid class file.");
            }

            var file = new JavaClassFile
            {
                MinorVersion = reader.ReadUInt16(),
                MajorVersion = reader.ReadUInt16(),
                ConstantPool = ConstantPool.FromReader(reader),
                AccessFlags  = (ClassAccessFlags)reader.ReadUInt16(),
                ThisClass    = reader.ReadUInt16(),
                SuperClass   = reader.ReadUInt16(),
            };

            ushort interfaceCount = reader.ReadUInt16();

            for (int i = 0; i < interfaceCount; i++)
            {
                file.Interfaces.Add(reader.ReadUInt16());
            }

            ushort fieldCount = reader.ReadUInt16();

            for (int i = 0; i < fieldCount; i++)
            {
                file.Fields.Add(FieldInfo.FromReader(reader));
            }

            ushort methodCount = reader.ReadUInt16();

            for (int i = 0; i < methodCount; i++)
            {
                file.Methods.Add(MethodInfo.FromReader(reader));
            }

            ushort attributeCount = reader.ReadUInt16();

            for (int i = 0; i < attributeCount; i++)
            {
                file.Attributes.Add(AttributeInfo.FromReader(reader));
            }

            return(file);
        }
Пример #16
0
        public void WriteConstantPool_ByteAreEqual()
        {
            var constantPool   = ConstantPool.FromReader(_reader);
            var stream         = new MemoryStream();
            var writingContext = new WritingContext(new BigEndianStreamWriter(stream));

            constantPool.Write(writingContext);

            var constantPoolLength = (int)_reader.Position - ConstantPoolOffset;

            Assert.Equal(constantPoolLength, stream.Length);
            Assert.Equal(
                new ArraySegment <byte>(Resources.ConstantPoolExample, ConstantPoolOffset, constantPoolLength),
                new ArraySegment <byte>(stream.ToArray()));
        }