Exemplo n.º 1
0
            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;
                }
            }
Exemplo n.º 2
0
            internal void WriteVerificationInfo(VerificationInfo info)
            {
                _writer.WriteU1((byte)info.Tag);

                switch (info)
                {
                case ObjectVariableInfo objectVariableInfo:
                    WriteVerificationInfo(objectVariableInfo);
                    break;

                case UninitializedVariableInfo uninitializedVariableInfo:
                    WriteVerificationInfo(uninitializedVariableInfo);
                    break;
                }
            }
Exemplo n.º 3
0
        /// <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();
        }
Exemplo n.º 4
0
        /// <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}");
            }
        }