public static FieldSignature Decode(BufferedBinaryReader reader) { var h = (SignatureFlags)reader.ReadUInt8(); if ((h & SignatureFlags.TYPEMASK) != SignatureFlags.FIELD) { throw new BadMetadataException("Incorrect signature for field."); } return(new FieldSignature(TypeSignature.Decode(reader))); }
public static MetadataSignature DecodeMember(BufferedBinaryReader reader) { var flags = (SignatureFlags)reader.ReadUInt8(); var type = flags & SignatureFlags.TYPEMASK; switch (type) { case SignatureFlags.FIELD: return(new FieldSignature(TypeSignature.Decode(reader))); case SignatureFlags.LOCAL: throw new NotImplementedException(); default: return(MethodSignature.Decode(reader, flags)); } }
internal static MethodSignature Decode(BufferedBinaryReader reader, SignatureFlags flags) { var type = (flags & SignatureFlags.TYPEMASK); if (!(type == SignatureFlags.PROPERTY || (type >= SignatureFlags.DEFAULT && type <= SignatureFlags.VARARG))) { throw new BadMetadataException("Incorrect signature for method."); } var sig = new MethodSignature(); if (type == SignatureFlags.PROPERTY) { sig.IsProperty = true; } if ((flags & SignatureFlags.HASTHIS) != 0) { sig.CallingConventions |= CallingConventions.HasThis; } if ((flags & SignatureFlags.EXPLICITTHIS) != 0) { sig.CallingConventions |= CallingConventions.ExplicitThis; } if (type == SignatureFlags.VARARG) { sig.CallingConventions &= CallingConventions.Standard; sig.CallingConventions |= CallingConventions.VarArgs; } if ((flags & SignatureFlags.GENERIC) != 0) { sig.GenericParamCount = reader.ReadPackedInt(); } int paramCount = reader.ReadPackedInt(); sig.Type = TypeSignature.Decode(reader); sig.Params = new TypeSignature[paramCount]; for (int i = 0; i < paramCount; ++i) { sig.Params[i] = TypeSignature.Decode(reader); } return(sig); }