Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
f704291
Re-add static interface trimming with more testing
jtschuster May 9, 2022
68c530d
Add static interface tests for library mode
jtschuster May 12, 2022
97cd617
Add sanity check for overrides
jtschuster May 12, 2022
8190bf7
Add sanity check for overrides
jtschuster May 12, 2022
9a5fe0f
Merge branch 'main' into overrideSanityCheck
jtschuster May 12, 2022
3a560d4
Merge branch 'overrideSanityCheck' into staticInterfacesBack
jtschuster May 12, 2022
733bf90
Update comment on override removal in sweep step
jtschuster May 12, 2022
47104d9
Add attributes
jtschuster May 12, 2022
c2f4fd1
formatting
jtschuster May 12, 2022
3d577ce
formatting
jtschuster May 12, 2022
8ac16bb
Merge branch 'overrideSanityCheck' into staticInterfacesBack
jtschuster May 13, 2022
cccca4c
Modify override removal logic and update comment
jtschuster May 13, 2022
c380027
Mark override on explicit implementation
jtschuster May 13, 2022
4813047
Tweak override removal comment
jtschuster May 13, 2022
332e79f
wip
jtschuster May 13, 2022
9f64a32
Merge branch 'main' into staticInterfacesBack
jtschuster May 25, 2022
9d27c3b
Merge remote-tracking branch 'upstream/main' into staticInterfacesBack
jtschuster May 25, 2022
7f1064d
Choose correct merge conflict
jtschuster May 25, 2022
15db395
use FullName in comparison
jtschuster May 26, 2022
1751697
wip
jtschuster Jun 1, 2022
b10cd5f
Update docs/removal-behavior.md
jtschuster Jun 1, 2022
e3fbf12
Add explanation for workaround to remove interface implementation
jtschuster Jun 1, 2022
098cb24
Merge branch 'staticInterfacesBack' of https://github.com/jtschuster/…
jtschuster Jun 1, 2022
7467d82
wip
jtschuster Jun 2, 2022
4efa5f2
Mark static interface implmentations in ProcessOverride
jtschuster Jun 2, 2022
c3a26ca
Format and update comment
jtschuster Jun 2, 2022
62e3cc8
Use separate list for static interface methods
jtschuster Jun 3, 2022
4359792
Add clarifying comments
jtschuster Jun 3, 2022
060345e
Roll early exit case into function
jtschuster Jun 3, 2022
a050fdf
Move check back outside of interface override method
jtschuster Jun 7, 2022
95df541
formatting
jtschuster Jun 7, 2022
2b7a7cc
Use Override pair to store logic for IsStaticInterfaceMethodPair
jtschuster Jun 7, 2022
c00e1d1
Formatting
jtschuster Jun 8, 2022
358b010
Move interfaceImpl marking out of ProcessOverride
jtschuster Jun 13, 2022
5672f0f
Merge remote-tracking branch 'upstream/main' into staticInterfacesBack
jtschuster Jun 14, 2022
432375d
PR Feedback
jtschuster Jun 14, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use Override pair to store logic for IsStaticInterfaceMethodPair
  • Loading branch information
jtschuster committed Jun 7, 2022
commit 2b7a7cc166d6180a0482557056119bf6a3481a80
10 changes: 5 additions & 5 deletions src/linker/Linker.Steps/MarkStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3050,15 +3050,15 @@ protected virtual void ProcessMethod (MethodDefinition method, in DependencyInfo
// Mark overridden methods and interface implementations except for static interface methods
// This will not mark implicit interface methods because they do not have a MethodImpl and aren't in the .Overrides
if (method.HasOverrides) {
foreach (MethodReference ov in method.Overrides) {
foreach (MethodReference @base in method.Overrides) {
// Method implementing a static interface method will have an override to it - note nonstatic methods usually don't unless they're explicit.
// Calling the implementation method directly has no impact on the interface, and as such it should not mark the interface or its method.
// Only if the interface method is referenced, then all the methods which implemented must be kept, but not the other way round.
if (Context.Resolve (ov)?.IsStatic == true
&& Context.Resolve (ov.DeclaringType)?.IsInterface == true)
if (Context.Resolve (@base) is MethodDefinition baseDefinition
&& new OverrideInformation.OverridePair (baseDefinition, method).IsStaticInterfaceMethodPair ())
continue;
MarkMethod (ov, new DependencyInfo (DependencyKind.MethodImplOverride, method), ScopeStack.CurrentScope.Origin);
MarkExplicitInterfaceImplementation (method, ov);
MarkMethod (@base, new DependencyInfo (DependencyKind.MethodImplOverride, method), ScopeStack.CurrentScope.Origin);
MarkExplicitInterfaceImplementation (method, @base);
}
}

Expand Down
19 changes: 10 additions & 9 deletions src/linker/Linker/OverrideInformation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,22 @@ namespace Mono.Linker
public class OverrideInformation
{
readonly ITryResolveMetadata resolver;
readonly OverridePair _pair;

public OverrideInformation (MethodDefinition @base, MethodDefinition @override, ITryResolveMetadata resolver, InterfaceImplementation? matchingInterfaceImplementation = null)
{
Base = @base;
Override = @override;
_pair = new OverridePair (@base, @override);
MatchingInterfaceImplementation = matchingInterfaceImplementation;
this.resolver = resolver;
}

public MethodDefinition Base { get; }
public MethodDefinition Override { get; }
public record struct OverridePair(MethodDefinition Base, MethodDefinition Override)
{
public bool IsStaticInterfaceMethodPair () => Base.DeclaringType.IsInterface && Base.IsStatic && Override.IsStatic;
}

public MethodDefinition Base { get => _pair.Base; }
public MethodDefinition Override { get => _pair.Override; }
public InterfaceImplementation? MatchingInterfaceImplementation { get; }

public bool IsOverrideOfInterfaceMember {
Expand All @@ -44,10 +49,6 @@ public TypeDefinition? InterfaceType {
}
}

public bool IsStaticInterfaceMethodPair {
get => IsOverrideOfInterfaceMember
&& Base.IsAbstract && Base.IsStatic
&& Override.IsStatic;
}
public bool IsStaticInterfaceMethodPair => _pair.IsStaticInterfaceMethodPair ();
}
}