internal void WriteFrame(StackMapFrame frame) { _writer.WriteU1(frame.Tag); switch (frame) { case SameLocals1StackItemFrame sameLocals1StackItemFrame: WriteFrame(sameLocals1StackItemFrame); break; case SameLocals1StackItemFrameExtended sameLocals1StackItemFrameExtended: WriteFrame(sameLocals1StackItemFrameExtended); break; case ChopFrame chopFrame: WriteFrame(chopFrame); break; case SameFrameExtended sameFrameExtended: WriteFrame(sameFrameExtended); break; case AppendFrame appendFrame: WriteFrame(appendFrame); break; } }
internal void WriteVerificationInfo(VerificationInfo info) { _writer.WriteU1((byte)info.Tag); switch (info) { case ObjectVariableInfo objectVariableInfo: WriteVerificationInfo(objectVariableInfo); break; case UninitializedVariableInfo uninitializedVariableInfo: WriteVerificationInfo(uninitializedVariableInfo); break; } }
/// <inheritdoc /> public void Dispose() { var temporary = (StreamDataDestination)_segment.Data; var stream = temporary.Stream; long length = stream.Length; if (_isU2) { _destination.WriteU2((ushort)length); } else { _destination.WriteU4((uint)length); } stream.Seek(0, SeekOrigin.Begin); for (int i = 0; i < stream.Length; i++) { _destination.WriteU1((byte)stream.ReadByte()); } temporary.Dispose(); }
/// <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}"); } }