Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Interface implementations are not taken into consideration for type analysis. #47

Open
ElektroKill opened this issue Jan 16, 2022 · 1 comment
Labels
bug Something isn't working

Comments

@ElektroKill
Copy link
Contributor

Describe the bug
A class's interface implementations are not taken into consideration for tye inference and type conversion insertion.

Example:
IMyDisposable interface implements System.IDisposable interface and MyDisposable class implements IMyDisposable interface.

OldRod produces the following code:
image
The castclass to System.IDisposable is redundant since the parameter which is loaded before it is of type IMyDisposable which implements IDisposable.

If we look at the code before virtualization and then devirtualization we see exactly that.
image

Similar behavior can be seen where the aforementioned method is used:
image
We see another redundant cast to, this time, IMyDisposable. As before this cast is redundant as the MyDisposable class already implements that interface.

If we look at the non-processed code we see the cast is missing:
image

To Reproduce
Devirtualize the sample provided in the zip file below:
sample2.zip

@Washi1337
Copy link
Owner

This is a direct result of

public ITypeDescriptor GetCommonBaseType(ICollection<ITypeDescriptor> types)
only collecting base types during the construction of the type hierarchy. This "works" because every interface eventually is an object, as was mentioned in #48, so these casts aren't wrong.

Including interfaces in the type hierarchy complicates things, as the inheritance graph is no longer necessarily a tree any more. This makes looking for common base types more involved, especially if there is diverging paths in the inheritance graphs (which path to take? do we take a path or just resort to Object in those cases?).

We'll have to think about what is best here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants