public void Write(IBigEndianWriter writer) { writer.Write(StartOffset); writer.Write(EndOffset); writer.Write(HandlerOffset); writer.Write(CatchType); }
/// <summary> /// Writes the inner class info to an output stream. /// </summary> /// <param name="writer">The writer representing the output stream.</param> public void Write(IBigEndianWriter writer) { writer.Write(InnerClassInfoIndex); writer.Write(OuterClassInfoIndex); writer.Write(NameIndex); writer.Write((ushort)InnerClassAccessFlags); }
public void Write(IBigEndianWriter writer) { writer.Write(StartOffset); writer.Write(Length); writer.Write(NameIndex); writer.Write(DescriptorIndex); writer.Write(LocalIndex); }
internal BigEndianSegmentWriter(IBigEndianWriter destination, bool isU2) { _destination = destination; _isU2 = isU2; var temporary = new StreamDataDestination(new MemoryStream(), true); _segment = new BigEndianWriter(temporary); }
/// <inheritdoc /> public void WriteBody(JvmAttribute attribute, IBigEndianWriter writer) { if (attribute.Data is null) { throw new ArgumentException(nameof(attribute)); } writer.Write(attribute.Data); }
/// <inheritdoc /> protected override void WriteBody(StackMapTableAttribute attribute, IBigEndianWriter writer) { var stackMapFrameWriter = new StackMapFrameWriter(writer); foreach (var frame in attribute.Entries) { stackMapFrameWriter.WriteFrame(frame); } }
/// <summary> /// Writes the entry to an output stream. /// </summary> /// <param name="writer">The writer to use.</param> public void Write(IBigEndianWriter writer) { writer.Write(MethodRefIndex); writer.Write((ushort)Arguments.Count); foreach (ushort argument in Arguments) { writer.Write(argument); } }
public void Write(IBigEndianWriter writer, int baseOffset) { writer.Write(DefaultOffset - baseOffset); writer.Write(Table.Count); foreach (var entry in Table) { writer.Write(entry.Key); writer.Write(entry.Value - baseOffset); } }
public void Write(IBigEndianWriter writer, int baseOffset) { writer.Write(DefaultOffset - baseOffset); writer.Write(Low); writer.Write(High); foreach (var offset in Offsets) { writer.Write(offset - baseOffset); } }
private static void WriteExceptionHandlers(IBigEndianWriter writer, CodeAttribute attribute) { writer.WriteU2((ushort)attribute.ExceptionHandlers.Count); foreach (var exceptionHandler in attribute.ExceptionHandlers) { writer.WriteU2(exceptionHandler.TryStart); writer.WriteU2(exceptionHandler.TryEnd); writer.WriteU2(exceptionHandler.HandlerStart); writer.WriteU2(exceptionHandler.CatchType); } }
private static void WriteUtf8Constant(Utf8Constant constant, IBigEndianWriter writer) { var encoder = JavaUtf8.Instance; string value = constant.Value; byte[] array = Pool.Rent(encoder.GetMaxByteCount(value.Length)); int chars = encoder.GetBytes(value, 0, value.Length, array, 0); writer.WriteU2((ushort)chars); writer.Write(array.AsSpan().Slice(0, chars)); Pool.Return(array, true); }
/// <inheritdoc /> protected override void WriteBody(CodeAttribute attribute, IBigEndianWriter writer) { writer.WriteU2(attribute.MaxStack); writer.WriteU2(attribute.MaxLocals); WriteBytecode(writer, attribute); WriteExceptionHandlers(writer, attribute); writer.WriteU2((ushort)attribute.Attributes.Count); foreach (var nestedAttribute in attribute.Attributes) { Director.WriteAttribute(nestedAttribute, writer); } }
/// <inheritdoc /> public void WriteName(JvmAttribute attribute, IBigEndianWriter writer) => writer.WriteU2(attribute.NameIndex);
private void WriteBytecode(IBigEndianWriter writer, CodeAttribute attribute) { using var segment = writer.WithU4Length(); _assembler.Assemble(attribute.Instructions, segment); }
/// <summary> /// Writes the Java class file to a specified binary writer. /// </summary> /// <param name="writer">The writer to use.</param> public void Write(IBigEndianWriter writer) { Write(new WritingContext(writer)); }
internal StackMapFrameWriter(IBigEndianWriter writer) { _writer = writer; _verificationInfoWriter = new(writer); }
/// <inheritdoc cref="WriteBody(T, IBigEndianWriter)" /> protected abstract void WriteBody(T attribute, IBigEndianWriter writer);
internal VerificationInfoWriter(IBigEndianWriter writer) { _writer = writer; }
/// <summary> /// Writes the <paramref name="constant"/> to the given output <paramref name="writer"/>. /// </summary> /// <param name="constant">The <see cref="Constant"/> to serialize.</param> /// <param name="writer">The <see cref="BigEndianWriter"/> to write data to.</param> public static void BuildConstant(Constant constant, IBigEndianWriter writer) { writer.WriteU1((byte)constant.Tag); switch (constant) { case ClassConstant classConstant: writer.WriteU2(classConstant.NameIndex); break; case FieldrefConstant fieldrefConstant: writer.WriteU2(fieldrefConstant.ClassIndex); writer.WriteU2(fieldrefConstant.NameAndTypeIndex); break; case MethodrefConstant methodrefConstant: writer.WriteU2(methodrefConstant.ClassIndex); writer.WriteU2(methodrefConstant.NameAndTypeIndex); break; case InterfaceMethodrefConstant interfaceMethodrefConstant: writer.WriteU2(interfaceMethodrefConstant.ClassIndex); writer.WriteU2(interfaceMethodrefConstant.NameAndTypeIndex); break; case StringConstant stringConstant: writer.WriteU2(stringConstant.StringIndex); break; case IntegerConstant integerConstant: writer.WriteI4(integerConstant.Value); break; case FloatConstant floatConstant: writer.WriteR4(floatConstant.Value); break; case LongConstant longConstant: writer.WriteI8(longConstant.Value); break; case DoubleConstant doubleConstant: writer.WriteR8(doubleConstant.Value); break; case NameAndTypeConstant nameAndTypeConstant: writer.WriteU2(nameAndTypeConstant.NameIndex); writer.WriteU2(nameAndTypeConstant.DescriptorIndex); break; case Utf8Constant utf8Constant: WriteUtf8Constant(utf8Constant, writer); break; case MethodHandleConstant methodHandleConstant: writer.WriteU1((byte)methodHandleConstant.ReferenceKind); writer.WriteU2(methodHandleConstant.ReferenceIndex); break; case MethodTypeConstant methodTypeConstant: writer.WriteU2(methodTypeConstant.DescriptorIndex); break; case InvokeDynamicConstant invokeDynamicConstant: writer.WriteU2(invokeDynamicConstant.BootstrapMethodAttributeIndex); writer.WriteU2(invokeDynamicConstant.NameAndTypeIndex); break; default: throw new NotSupportedException($"Unsupported constant type: {constant.GetType().FullName}"); } }
/// <inheritdoc /> public void WriteBody(JvmAttribute attribute, IBigEndianWriter writer) => WriteBody((T)attribute, (IBigEndianSegmentWriter)writer);
public ByteCodeAssembler(IBigEndianWriter writer) { _writer = writer ?? throw new ArgumentNullException(nameof(writer)); }
/// <summary> /// Writes the <see cref="ClassFileHeader"/> to the <paramref name="writer"/>. /// </summary> /// <param name="writer">The <see cref="IBigEndianWriter"/> to write the <see cref="ClassFileHeader"/> to.</param> public void Write(IBigEndianWriter writer) { writer.WriteU4(Magic); writer.WriteU2(Minor); writer.WriteU2(Major); }
public WritingContext(IBigEndianWriter writer) { Writer = writer ?? throw new ArgumentNullException(nameof(writer)); }
/// <summary> /// Writes the <see cref="MetadataBody"/> to the <paramref name="writer"/>. /// </summary> /// <param name="writer">The <see cref="IBigEndianWriter"/> to write the <see cref="MetadataBody"/> to.</param> /// <param name="director">The <see cref="IJvmAttributeDirector"/> to write <see cref="JvmAttribute"/>s with.</param> public void Write(IBigEndianWriter writer, IJvmAttributeDirector director) => new MetadataBodyWriter(this, writer, director).WriteMetadataBody();
/// <summary> /// Writes the <see cref="ClassFileBody"/> to the <paramref name="writer"/>. /// </summary> /// <param name="writer">The <see cref="IBigEndianWriter"/> to write the <see cref="ClassFileBody"/> to.</param> public void Write(IBigEndianWriter writer) { writer.WriteU2((ushort)AccessFlags); writer.WriteU2(ThisClass); writer.WriteU2(SuperClass); }
internal ConstantPoolWriter(ConstantPool pool, IBigEndianWriter writer) { _pool = pool; _writer = writer; }
/// <summary> /// Writes the <see cref="MetadataBody"/> of a <see cref="ClassFile"/> to the <paramref name="writer"/>. /// </summary> /// <param name="classFile">The <see cref="ClassFile"/> to write the header of.</param> /// <param name="writer">The <see cref="IBigEndianWriter"/> to write the <see cref="ConstantPool"/> to.</param> public static void IntoWriter(ClassFile classFile, IBigEndianWriter writer) => new MetadataBody(classFile).Write(writer, new JvmAttributeDirector(classFile.Constants));