diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2016-09-27 19:56:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-27 19:56:43 +0300 |
commit | a05f4934a88a17288799bc996f8fcd744b414909 (patch) | |
tree | c8115df708b228be37ae58b52feffe2d4d1df38b /src/ILCompiler.MetadataWriter | |
parent | 93e735a43817022df8dcd0b6570a89bfc253f70e (diff) |
Extend metadata schema to support function pointers (#1928)
Also:
* update `MetadataTransform` to emit the new metadata
* a simple unit test
Diffstat (limited to 'src/ILCompiler.MetadataWriter')
2 files changed, 87 insertions, 0 deletions
diff --git a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs index 2767c25ae..e49f28b49 100644 --- a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs +++ b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs @@ -1086,6 +1086,28 @@ namespace Internal.Metadata.NativeFormat.Writer } } // Write + public static void Write(this NativeWriter writer, FunctionPointerSignature record) + { + if (record != null) + writer.WriteUnsigned((uint)record.Handle.Offset); + else + writer.WriteUnsigned(0); + } // Write + + public static void Write(this NativeWriter writer, List<FunctionPointerSignature> values) + { + if (values == null) + { + writer.WriteUnsigned(0); + return; + } + writer.WriteUnsigned((uint)values.Count); + foreach (FunctionPointerSignature value in values) + { + writer.Write(value); + } + } // Write + public static void Write(this NativeWriter writer, GenericParameter record) { if (record != null) diff --git a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs index 1afe7ecdc..79e969c0a 100644 --- a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs +++ b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs @@ -2612,6 +2612,70 @@ namespace Internal.Metadata.NativeFormat.Writer public MetadataRecord Value; } // FixedArgument + public partial class FunctionPointerSignature : MetadataRecord + { + public override HandleType HandleType + { + get + { + return HandleType.FunctionPointerSignature; + } + } // HandleType + + internal override void Visit(IRecordVisitor visitor) + { + Signature = visitor.Visit(this, Signature); + } // Visit + + public override sealed bool Equals(Object obj) + { + if (Object.ReferenceEquals(this, obj)) return true; + var other = obj as FunctionPointerSignature; + if (other == null) return false; + if (!Object.Equals(Signature, other.Signature)) return false; + return true; + } // Equals + + public override sealed int GetHashCode() + { + if (_hash != 0) + return _hash; + EnterGetHashCode(); + int hash = 1733451879; + hash = ((hash << 13) - (hash >> 19)) ^ (Signature == null ? 0 : Signature.GetHashCode()); + LeaveGetHashCode(); + _hash = hash; + return _hash; + } // GetHashCode + + internal override void Save(NativeWriter writer) + { + writer.Write(Signature); + } // Save + + internal static FunctionPointerSignatureHandle AsHandle(FunctionPointerSignature record) + { + if (record == null) + { + return new FunctionPointerSignatureHandle(0); + } + else + { + return record.Handle; + } + } // AsHandle + + internal new FunctionPointerSignatureHandle Handle + { + get + { + return new FunctionPointerSignatureHandle(HandleOffset); + } + } // Handle + + public MethodSignature Signature; + } // FunctionPointerSignature + public partial class GenericParameter : MetadataRecord { public override HandleType HandleType @@ -4813,6 +4877,7 @@ namespace Internal.Metadata.NativeFormat.Writer Signature.HandleType == HandleType.SZArraySignature || Signature.HandleType == HandleType.ArraySignature || Signature.HandleType == HandleType.PointerSignature || + Signature.HandleType == HandleType.FunctionPointerSignature || Signature.HandleType == HandleType.ByReferenceSignature || Signature.HandleType == HandleType.TypeVariableSignature || Signature.HandleType == HandleType.MethodTypeVariableSignature); |