-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix type loader not recognizing overridden method (#56337)
* Fix type loader not recognizing overridden method - Result of a bad change when removing support for full stub dispatch in .NET 4.0 timeframe (circa 2008) - Caused issue when the following set of conditions were all true - The type implements an interface - The interface has more virtual methods on it than the number of virtual methods on the base type of the type. - The base type implements the interface partially (and the partial implementation has a slot number greater than the number of virtual methods on the base type + its base types) - The type does not re-implement the interface methods implemented by the base type. - The comment referred to situations where stub dispatch was used to resolve non-virtual calls which is a very long time removed feature and is not applicable to today's codebase. - Not reachable with versions of C# that shipped before the default interfaces feature, but with that feature became easily reachable. Has been a bug since .NET 4 for handwritten IL. Fixes #44533
- Loading branch information
1 parent
598c2da
commit 3ce1168
Showing
4 changed files
with
69 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
src/tests/Loader/classloader/DefaultInterfaceMethods/regressions/github44533.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
|
||
using System; | ||
using System.Linq; | ||
|
||
namespace BugInReflection | ||
{ | ||
class Program | ||
{ | ||
static int Main(string[] args) | ||
{ | ||
// This tests the ability to load a type when | ||
// 1. The type implements an interface | ||
// 2. The interface has more virtual methods on it than the number of virtual methods | ||
// on the base type of the type. | ||
// 3. The base type implements the interface partially (and the partial implementation | ||
// has a slot number greater than the number of virtual methods on the base type + its base types) | ||
// 4. The type does not re-implement the interface methods implemented by the base type. | ||
// | ||
// This is permitted in IL, but is a situation which can only be reached with .il code in versions of | ||
// .NET prior to .NET 5. | ||
// | ||
// In .NET 5, this became straightforward to hit with default interface methods. | ||
// | ||
// To workaround the bug in .NET 5, simply make the Post class have enough virtual methods to match | ||
// the number of virtual methods on the ITitle interface. | ||
new BlogPost(); | ||
return 100; | ||
} | ||
} | ||
|
||
public interface ITitle | ||
{ | ||
// commenting out one or more of these NotMapped properties fixes the problem | ||
public string Temp1 => "abcd"; | ||
public string Temp2 => "abcd"; | ||
public string Temp3 => "abcd"; | ||
public string Temp4 => "abcd"; | ||
public string Temp5 => "abcd"; | ||
|
||
public string Title { get; set; } // commenting out this property also fixes the problem | ||
} | ||
|
||
public abstract class Post : ITitle // making this non-abstract also fixes the problem | ||
{ | ||
public string Title { get; set; } | ||
} | ||
public class BlogPost : Post { } | ||
} |
11 changes: 11 additions & 0 deletions
11
src/tests/Loader/classloader/DefaultInterfaceMethods/regressions/github44533.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
<PropertyGroup> | ||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||
<OutputType>Exe</OutputType> | ||
<CLRTestKind>BuildAndRun</CLRTestKind> | ||
<CLRTestPriority>1</CLRTestPriority> | ||
</PropertyGroup> | ||
<ItemGroup> | ||
<Compile Include="$(MSBuildProjectName).cs" /> | ||
</ItemGroup> | ||
</Project> |