diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 8adbb56aaa070..85d64b161f7cb 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -883,6 +883,7 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s ThrowHelper.ThrowBadImageFormatException(); if (!signature.IsStatic) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_HASTHIS; + if (signature.IsExplicitThis) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_EXPLICITTHIS; TypeDesc returnType = signature.ReturnType; diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs index 43617899802a4..639455ff98ba2 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs @@ -22,6 +22,7 @@ public enum MethodSignatureFlags UnmanagedCallingConvention = 0x0009, Static = 0x0010, + ExplicitThis = 0x0020, } public enum EmbeddedSignatureDataKind @@ -129,6 +130,14 @@ public bool IsStatic } } + public bool IsExplicitThis + { + get + { + return (_flags & MethodSignatureFlags.ExplicitThis) != 0; + } + } + public int GenericParameterCount { get diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaSignatureParser.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaSignatureParser.cs index be72b3d71accf..e68a042817092 100644 --- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaSignatureParser.cs +++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaSignatureParser.cs @@ -380,6 +380,9 @@ private MethodSignature ParseMethodSignatureImpl(bool skipEmbeddedSignatureData) if (!header.IsInstance) flags |= MethodSignatureFlags.Static; + if (header.HasExplicitThis) + flags |= MethodSignatureFlags.ExplicitThis; + int arity = header.IsGeneric ? _reader.ReadCompressedInteger() : 0; int count = _reader.ReadCompressedInteger(); diff --git a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs index 76582ef0e29ab..77d31895e7b13 100644 --- a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs +++ b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs @@ -658,9 +658,9 @@ public void Pop() private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature sig, EmbeddedSignatureDataEmitter signatureDataEmitter) { signatureDataEmitter.Push(); - BlobEncoder signatureEncoder = new BlobEncoder(signatureBuilder); int genericParameterCount = sig.GenericParameterCount; bool isInstanceMethod = !sig.IsStatic; + bool isExplicitThis = sig.IsExplicitThis; SignatureCallingConvention sigCallingConvention = SignatureCallingConvention.Default; switch (sig.Flags & MethodSignatureFlags.UnmanagedCallingConventionMask) { @@ -685,7 +685,15 @@ private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature if (sigCallingConvention != SignatureCallingConvention.Default) signatureDataEmitter.UpdateSignatureCallingConventionAtCurrentIndexStack(ref sigCallingConvention); - signatureEncoder.MethodSignature(sigCallingConvention, genericParameterCount, isInstanceMethod); + SignatureAttributes attributes = + (genericParameterCount != 0 ? SignatureAttributes.Generic : 0) | + (isInstanceMethod ? SignatureAttributes.Instance : 0) | + (isExplicitThis ? SignatureAttributes.ExplicitThis : 0); + + signatureBuilder.WriteByte(new SignatureHeader(SignatureKind.Method, sigCallingConvention, attributes).RawValue); + if (genericParameterCount != 0) + signatureBuilder.WriteCompressedInteger(genericParameterCount); + signatureBuilder.WriteCompressedInteger(sig.Length); EncodeType(signatureBuilder, sig.ReturnType, signatureDataEmitter); for (int i = 0; i < sig.Length; i++) diff --git a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Method.cs b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Method.cs index 354b7913d533e..02c35466167aa 100644 --- a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Method.cs +++ b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Method.cs @@ -241,6 +241,10 @@ private static SignatureCallingConvention GetSignatureCallingConvention(Cts.Meth { callingConvention |= SignatureCallingConvention.HasThis; } + if ((signature.Flags & Cts.MethodSignatureFlags.ExplicitThis) != 0) + { + callingConvention |= SignatureCallingConvention.ExplicitThis; + } return callingConvention; }