Beispiel #1
0
        private static int GetFieldSize(int Index, Java.ConstantPool Pool)
        {
            Java.Constants.FieldRef Fld = (Java.Constants.FieldRef)Pool[(ushort)Index];

            if ((Fld.Descriptor == "D") || (Fld.Descriptor == "J"))
            {
                return(2);
            }
            else
            {
                return(1);
            }
        }
Beispiel #2
0
        private static int GetMethodParamsCount(int ConstIndex, Java.ConstantPool Pool)
        {
            Java.Constants.MethodRef Method = (Java.Constants.MethodRef)Pool[(ushort)ConstIndex];

            int Result   = 0;
            int Position = 0;

            while (Method.Descriptor[++Position] != ')')
            {
                bool Array = false;

                if (Method.Descriptor[Position] == '[')
                {
                    Array = true;
                    while (Method.Descriptor[Position] == '[')
                    {
                        Position++;
                    }
                }

                if ((Method.Descriptor[Position] == 'D') && (Method.Descriptor[Position] == 'J'))
                {
                    Result += Array ? 1 : 2;
                }
                else
                {
                    Result += 1;
                }

                if (Method.Descriptor[Position] == 'L')
                {
                    while (Method.Descriptor[Position] != ';')
                    {
                        Position++;
                    }
                }
            }

            return(Result);
        }
Beispiel #3
0
        public void Write(Stream Output)
        {
            ConstantPool ConstantPoolCopy = new Java.ConstantPool(ConstantPool);

            MemoryStream ClassBodyStream = new MemoryStream();
            BinaryWriter ClassBodyWriter = new BinaryWriter(ClassBodyStream);

            ClassBodyWriter.WriteBE((ushort)AccessFlag);
            ClassBodyWriter.WriteBE(ConstantPoolCopy.AddConstant(new Constants.Class(ThisClass)));
            if (SuperClass != null)
            {
                ClassBodyWriter.WriteBE(ConstantPoolCopy.AddConstant(new Constants.Class(SuperClass)));
            }
            else
            {
                ClassBodyWriter.WriteBE((ushort)0);
            }

            ClassBodyWriter.WriteBE((ushort)Interfaces.Count);
            foreach (string Interface in Interfaces)
            {
                ClassBodyWriter.WriteBE(ConstantPoolCopy.AddConstant(new Constants.Class(Interface)));
            }

            ClassBodyWriter.WriteBE((ushort)Fields.Count);
            foreach (Field Field in Fields)
            {
                Field.Write(ClassBodyWriter, ConstantPoolCopy);
            }

            ClassBodyWriter.WriteBE((ushort)Methods.Count);
            foreach (Method Method in Methods)
            {
                Method.Write(ClassBodyWriter, ConstantPoolCopy);
            }

            ClassBodyWriter.WriteBE((ushort)Attributes.Count);
            foreach (Attribute Attribute in Attributes)
            {
                Attribute.Write(ClassBodyWriter, ConstantPoolCopy);
            }

            ClassBodyWriter.Flush();
            ClassBodyWriter.Seek(0, SeekOrigin.Begin);

            byte[] ClassBody = ClassBodyStream.ToArray();
            ClassBodyWriter.Close();

            ClassBodyWriter = new BinaryWriter(Output);

            ClassBodyWriter.WriteBE(Magic);
            ClassBodyWriter.WriteBE(MinorVersion);
            ClassBodyWriter.WriteBE(MajorVersion);

            int CountPosition = (int)Output.Position;

            ClassBodyWriter.WriteBE((ushort)0);
            for (ushort i = 0; i < ConstantPoolCopy.Length; i++)
            {
                ConstantPoolCopy[i].Write(ClassBodyWriter, ConstantPoolCopy);
            }
            ClassBodyWriter.Seek(CountPosition, SeekOrigin.Begin);
            ClassBodyWriter.WriteBE(ConstantPoolCopy.Length);
            ClassBodyWriter.Seek(0, SeekOrigin.End);
            ClassBodyWriter.Write(ClassBody);
        }