sebastienros / jint

Javascript Interpreter for .NET
BSD 2-Clause "Simplified" License
4.11k stars 563 forks source link

Don't find hidden property instead of the hiding property #1963

Closed mspertus closed 2 months ago

mspertus commented 2 months ago

resolves sebastienros/jint#1962

When TypeResolver:TryFindMemberAccessor resolves a property, it might find one that was hidden where the non-hidden one would normally be found by C++ member access.

For example, when you access the A member from JavaScript, you may get the hidden one (I say "may" because Type:GetProperties does not specify an order in a number of versions of .NET supported by jint).

class Foo
{
    public int A {get;set;}
    public string B {get;set;}
}

class Bar :  Foo
{
    public new float A { get; set; }
}

(This dotnet fiddle shows that both A elements are iterated by GetProperties even though if b is a Bar, b.A unambiguously refers to Bar:A)

This change ensures that in the case where a property in a derived class hides another, the derived one is resolved to.

mspertus commented 2 months ago

Thank you for the PR, can you also add a test case ensuring this works as expected and won't break later on by accident.

Thanks, Lahma. I've added a test and confirmed that it fails without the PR (dotnet462 windows) and passes with it.

mspertus commented 2 months ago

Thanks, @lahma!