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); } }
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); }
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); }