Skip to content

Commit 2a80808

Browse files
Fix compiling methods with explicit this (#103045)
One of the pri1 JIT tests hits asserts because we forget to set the bit.
1 parent cae9e30 commit 2a80808

File tree

5 files changed

+27
-2
lines changed

5 files changed

+27
-2
lines changed

src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
883883
ThrowHelper.ThrowBadImageFormatException();
884884

885885
if (!signature.IsStatic) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_HASTHIS;
886+
if (signature.IsExplicitThis) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_EXPLICITTHIS;
886887

887888
TypeDesc returnType = signature.ReturnType;
888889

src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public enum MethodSignatureFlags
2222
UnmanagedCallingConvention = 0x0009,
2323

2424
Static = 0x0010,
25+
ExplicitThis = 0x0020,
2526
}
2627

2728
public enum EmbeddedSignatureDataKind
@@ -129,6 +130,14 @@ public bool IsStatic
129130
}
130131
}
131132

133+
public bool IsExplicitThis
134+
{
135+
get
136+
{
137+
return (_flags & MethodSignatureFlags.ExplicitThis) != 0;
138+
}
139+
}
140+
132141
public int GenericParameterCount
133142
{
134143
get

src/coreclr/tools/Common/TypeSystem/Ecma/EcmaSignatureParser.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ private MethodSignature ParseMethodSignatureImpl(bool skipEmbeddedSignatureData)
380380
if (!header.IsInstance)
381381
flags |= MethodSignatureFlags.Static;
382382

383+
if (header.HasExplicitThis)
384+
flags |= MethodSignatureFlags.ExplicitThis;
385+
383386
int arity = header.IsGeneric ? _reader.ReadCompressedInteger() : 0;
384387

385388
int count = _reader.ReadCompressedInteger();

src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -658,9 +658,9 @@ public void Pop()
658658
private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature sig, EmbeddedSignatureDataEmitter signatureDataEmitter)
659659
{
660660
signatureDataEmitter.Push();
661-
BlobEncoder signatureEncoder = new BlobEncoder(signatureBuilder);
662661
int genericParameterCount = sig.GenericParameterCount;
663662
bool isInstanceMethod = !sig.IsStatic;
663+
bool isExplicitThis = sig.IsExplicitThis;
664664
SignatureCallingConvention sigCallingConvention = SignatureCallingConvention.Default;
665665
switch (sig.Flags & MethodSignatureFlags.UnmanagedCallingConventionMask)
666666
{
@@ -685,7 +685,15 @@ private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature
685685
if (sigCallingConvention != SignatureCallingConvention.Default)
686686
signatureDataEmitter.UpdateSignatureCallingConventionAtCurrentIndexStack(ref sigCallingConvention);
687687

688-
signatureEncoder.MethodSignature(sigCallingConvention, genericParameterCount, isInstanceMethod);
688+
SignatureAttributes attributes =
689+
(genericParameterCount != 0 ? SignatureAttributes.Generic : 0) |
690+
(isInstanceMethod ? SignatureAttributes.Instance : 0) |
691+
(isExplicitThis ? SignatureAttributes.ExplicitThis : 0);
692+
693+
signatureBuilder.WriteByte(new SignatureHeader(SignatureKind.Method, sigCallingConvention, attributes).RawValue);
694+
if (genericParameterCount != 0)
695+
signatureBuilder.WriteCompressedInteger(genericParameterCount);
696+
689697
signatureBuilder.WriteCompressedInteger(sig.Length);
690698
EncodeType(signatureBuilder, sig.ReturnType, signatureDataEmitter);
691699
for (int i = 0; i < sig.Length; i++)

src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Method.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@ private static SignatureCallingConvention GetSignatureCallingConvention(Cts.Meth
241241
{
242242
callingConvention |= SignatureCallingConvention.HasThis;
243243
}
244+
if ((signature.Flags & Cts.MethodSignatureFlags.ExplicitThis) != 0)
245+
{
246+
callingConvention |= SignatureCallingConvention.ExplicitThis;
247+
}
244248
return callingConvention;
245249
}
246250

0 commit comments

Comments
 (0)