/// <summary> /// Reads a raw method body from the given binary input stream. /// </summary> /// <param name="errorListener">The object responsible for recording parser errors.</param> /// <param name="reader">The binary input stream to read from.</param> /// <returns>The raw method body.</returns> /// <exception cref="NotSupportedException">Occurs when the method header indicates an invalid or unsupported /// method body format.</exception> public static CilRawMethodBody FromReader(IErrorListener errorListener, IBinaryStreamReader reader) { var flag = (CilMethodBodyAttributes)reader.ReadByte(); reader.Offset--; if ((flag & CilMethodBodyAttributes.Fat) == CilMethodBodyAttributes.Fat) { return(CilRawFatMethodBody.FromReader(errorListener, reader)); } if ((flag & CilMethodBodyAttributes.Tiny) == CilMethodBodyAttributes.Tiny) { return(CilRawTinyMethodBody.FromReader(errorListener, reader)); } throw new NotSupportedException("Invalid or unsupported method body format."); }
/// <summary> /// Reads a raw method body from the given binary input stream using the tiny method body format. /// </summary> /// <param name="reader">The binary input stream to read from.</param> /// <returns>The raw method body.</returns> /// <exception cref="FormatException">Occurs when the method header indicates an method body that is not in the /// tiny format.</exception> public new static CilRawTinyMethodBody FromReader(IBinaryStreamReader reader) { ulong fileOffset = reader.Offset; uint rva = reader.Rva; var flag = (CilMethodBodyAttributes)reader.ReadByte(); if ((flag & CilMethodBodyAttributes.Tiny) != CilMethodBodyAttributes.Tiny) { throw new FormatException("Invalid tiny CIL method body header."); } int codeSize = (byte)flag >> 2; var code = new byte[codeSize]; reader.ReadBytes(code, 0, codeSize); var methodBody = new CilRawTinyMethodBody(code); methodBody.UpdateOffsets(fileOffset, rva); return(methodBody); }
/// <summary> /// Reads a raw method body from the given binary input stream using the tiny method body format. /// </summary> /// <param name="errorListener">The object responsible for recording parser errors.</param> /// <param name="reader">The binary input stream to read from.</param> /// <returns>The raw method body.</returns> /// <exception cref="FormatException">Occurs when the method header indicates an method body that is not in the /// tiny format.</exception> public new static CilRawTinyMethodBody FromReader(IErrorListener errorListener, ref BinaryStreamReader reader) { ulong fileOffset = reader.Offset; uint rva = reader.Rva; var flag = (CilMethodBodyAttributes)reader.ReadByte(); if ((flag & CilMethodBodyAttributes.Tiny) != CilMethodBodyAttributes.Tiny) { errorListener.BadImage("Invalid tiny CIL method body header."); return(null); } int codeSize = (byte)flag >> 2; var code = new byte[codeSize]; reader.ReadBytes(code, 0, codeSize); var methodBody = new CilRawTinyMethodBody(code); methodBody.UpdateOffsets(fileOffset, rva); return(methodBody); }