deduplicating lambda methods

Vicente Romero vicente.romero at oracle.com
Mon Mar 19 13:10:02 UTC 2018



On 03/17/2018 10:04 PM, Liam Miller-Cushon wrote:
> Hi Vicente,
>
> On Sat, Mar 17, 2018 at 11:44 AM Vicente Romero 
> <vicente.romero at oracle.com <mailto:vicente.romero at oracle.com>> wrote:
>
>     overall looks good, but I think that a set of regression tests
>     should be included along with the patch.
>
>
> Definitely, I have some functional tests that I'll work on turning 
> into a jtreg test.
>
> Do you have advice about how much test coverage is appropriate for 
> tree comparison?
> Getting to 100% branch coverage would require a lot of test cases. I 
> could probably
> generate some of them programatically. FWIW a certain amount of 
> TreeDiffer was
> generated and not hand-written, so any bugs are probably structural 
> problems rather
> than typos. (That doesn't lessen the need for tests, of 
> course--there's still the risk of
> adding typos when changes are made in the future.)

well I assume that covering most common cases with a combo test should 
be the general guideline here. I don't think we need 100% coverage to 
validate the approach. I would also add some corner cases, probably in 
separate tests, those corner cases should include lambdas returning 
lambdas, lambdas with inner classes in their bodies, etc.

>     at first glance it seemed to me that the hash function would
>     return the same value for:
>     (int i) -> i / 5; and (int i) -> 5 / i; I haven't test it but this
>     was my impression.
>
>
> The hash function currently traverses all nodes and hashes their tags, 
> so for those two
> examples it would see something like `[DIV, IDENT, LITERAL]` and 
> `[DIV, LITERAL, IDENT]`,
> which would not result in the same value.

yep I got that but I didn't test it manually, thanks for checking it

>
> This does mean that `x + 42` and `y + 43` both hashed to the same 
> value. I updated the
> hash function to include literal values and symbols (with the same 
> handling of method
> parameters as the diff). With that change I am no longer seeing hash 
> collisions that result in
> unnecessary diffing. There are still cases where two lambda bodies 
> hash to the same
> value but have different target types, but that case doesn't require a 
> tree diff (the check
> that the target types are the same happens first).
>
> The updates to hashing are here:
> http://cr.openjdk.java.net/~cushon/lambdadedup/webrev.03/ 
> <http://cr.openjdk.java.net/%7Ecushon/lambdadedup/webrev.03/>



More information about the amber-dev mailing list