Struggling with Valhalla conversion of library

Philippe Marschall kustos at gmx.net
Sat Aug 17 15:05:25 UTC 2019


Hello Srikanth

I was able to retest with the tip of the lworld branch. I can confirm
the lambda issue, the first issue, is gone.

As for the second issue I was able to extract this minimal reproducer

interface Sample<K extends Comparable<? super K>, V> {

   void doesCompile(InlineType<? extends K> argument);

   void doesNotCompile(java.util.Map.Entry<InlineType<? extends K>, ?
extends V> argument);

}

inline class InlineType<E> {

   private E element;

   InlineType(E element) {
     this.element = element;
   }

}

The method #doesCompile doe compile but the method #doesNotCompile does
not compile and instead I get the following error:

error: unexpected type
   void doesNotCompile(java.util.Map.Entry<InlineType<? extends K>, ?
extends V> argument);
                                                     ^
   required: reference
   found:    InlineType<? extends K>
   where K is a type-variable:
     K extends Comparable<? super K> declared in interface Sample


Cheers
Philippe

On 14.08.19 12:51, Srikanth wrote:
> Hello Philippe,
>
> There has been a further defect fix
> https://bugs.openjdk.java.net/browse/JDK-8229700 that should also help
> you. If you are able to test the tip of valhalla repo lworld branch,
> that is great!
>
> If not, I am told this Friday there will a refresh of the EA bits. That
> should simplify testing for those that don't want to work with source
> forests.
>
> Could you in any case please see if you are able to extract test cases
> and send them inline in mail ?
> That would greatly speed up the turn around time for any remaining
> problems.
>
> Appreciate your testing and the defect reports!
> Srikanth
>
> On 14/08/19 2:39 PM, Srikanth wrote:
>> Hello Philippe,
>>
>> With the resolution of
>> https://bugs.openjdk.java.net/browse/JDK-8229537 via the push
>> http://hg.openjdk.java.net/valhalla/valhalla/rev/7ec951ef532d at least
>> the first of your
>> problems should have been fixed and the explicit lambda version viz:
>>
>> public static AdjacencyTester<U96?> adjacencyTester() {
>>     return (U96? low, U96? high) -> {
>>       // lambda body
>>     };
>>   }
>>
>> should compile.
>>
>> Can you check with the lworld branch tip of valhalla ?
>>
>> I am happy to verify this fix and also investigate a fix for the other
>> problems you reported.
>> But it would help if I have test cases extracted and attached to mail
>> - is that possible ?
>> I am not familiar with github and having a bit of a bother getting
>> what I need from the
>> pointers.
>>
>> TIA
>> Srikanth
>>
>> On 05/08/19 3:14 AM, Philippe Marschall wrote:
>>> Hi
>>>
>>> As you published the LW2 prototype I thought I tried to convert one of
>>> my libraries [1] to Valhalla and see how it goes. Right now I'm
>>> struggling with generics.
>>>
>>> Some context about the library. The library implements a range tree that
>>> allows to map a range of keys to a single value. Eg. {[100,199] -> "1",
>>> [200,299] -> "2"}. The library should support both inline and reference
>>> types as keys and values.
>>> The potential for inline classes is limited as the tree nodes are
>>> mutable and recursive. There are however two good candidates, the range
>>> class and an unsigned 96bit integer class (called U96) that is provided
>>> for convenience.
>>>
>>> The unsigned 96bit integer class  was easy to convert. I had to change
>>> it to implements Comparable<U96?>. I am not yet sure how I want to treat
>>> null / 0.
>>> But there are two cases where I struggled.
>>>
>>> First, I have an interface
>>>
>>> public interface AdjacencyTester<T> {
>>>
>>>   boolean areAdjacent(T low, T high);
>>>
>>> }
>>>
>>> I want to implement this for the unsigned 96bit integer class (called
>>> U96). Right know in Java 8 this is implemented as
>>>
>>>   public static AdjacencyTester<U96> adjacencyTester() {
>>>     return (low, high) -> {
>>>       // lambda body
>>>     };
>>>   }
>>>
>>> Simply converting this to
>>>
>>>   public static AdjacencyTester<U96?> adjacencyTester() {
>>>     return (low, high) -> {
>>>       // lambda body
>>>     };
>>>   }
>>>
>>> did not work, I got
>>>
>>> com/github/marschall/rangetree/key/U96.java:[51,12] incompatible types:
>>> incompatible parameter types in lambda expression
>>>
>>> Converting it to an anonymous inner class worked
>>>
>>>   public static AdjacencyTester<U96?> adjacencyTester() {
>>>     return new AdjacencyTester<U96?>() {
>>>       public boolean areAdjacent(U96? low, U96? high) {
>>>         // method body
>>>       }
>>>     };
>>>
>>>   }
>>>
>>> Using U96? as types for the lambda arguments did not compile
>>>
>>>   public static AdjacencyTester<U96?> adjacencyTester() {
>>>     return (U96? low, U96? high) -> {
>>>       // lambda body
>>>     };
>>>   }
>>>
>>> Compilation failure:
>>> /src/main/java/com/github/marschall/rangetree/key/U96.java:[51,16] ')'
>>> expected
>>> src/main/java/com/github/marschall/rangetree/key/U96.java:[51,21] :
>>> expected
>>> src/main/java/com/github/marschall/rangetree/key/U96.java:[51,32] ';'
>>> expected
>>>
>>> Second I have a simple Range class which is supposed to hold both
>>> reference and inline types. That was easy to convert but integrating
>>> into my existing interfaces failed.
>>>
>>> public inline class Range<E> {
>>>
>>>   private E low;
>>>   private E high;
>>>
>>> In my RangeMap interface I have #computeIfAbsent similar to the one from
>>> Map.
>>>
>>> V computeIfAbsent(K key, Function<? super K, Entry<Range<? extends K>, ?
>>> extends V>> mappingFunction)
>>>
>>> src/main/java/com/github/marschall/rangetree/RangeMap.java:[52,59]
>>> unexpected type
>>> [ERROR]   required: reference
>>> [ERROR]   found:    com.github.marschall.rangetree.Range<? extends K>
>>>
>>> I tried to switch to
>>> Range<? extends K?>
>>>
>>> but that did not help.
>>>
>>> You can find the code and building instructions here [2]
>>>
>>>  [1] https://github.com/marschall/range-tree
>>>  [2] https://github.com/marschall/range-tree/tree/valhalla
>>>
>>> Cheers
>>> Philippe
>>
>
>


More information about the valhalla-dev mailing list