experiences with prototype

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Feb 3 18:46:42 UTC 2015

Thanks Peter,
this is great feedback; regarding  the support for WhereRef/Val(Z) where 
Z is a method type-variable, I'm not sure it will be done in this 
current form/iteration. I've explored this, and looks not that 
straightforward to implement; given we don't want to support __Where in 
the long run, we might as well, replace the whole thing altogether.

The Object methods on val T seems a plain bug.

I will also investigate on the crash you are getting...

Regarding your choices for any-fying collection, I think they makes most 
sense - this is the road that both Brian and I ended up following in 
separate attempts after few failed attempt; the Stream string is quite a 
big one to pull :-)


On 03/02/15 18:30, Peter Levart wrote:
> Hi,
> I wanted to see what it would take to any-fy a basic subset of java 
> collections library. I thought I would start with basic interfaces 
> (Iterator, Iterable, Collection, List, ...) and then add basic 
> implementations. I quickly learned that any-fying is a viral process. 
> Any dependency that uses a generic type variable from any-fied class 
> has to be any-fied too. So I had to make a cut somewhere or I would be 
> any-fying the whole JDK (exaggerating) :-o ... I removed the methods 
> that have connection to Streams API (stream(), splitterator(), ...) 
> and parallel methods (FJPool) and got a manageable isolated subset. I 
> though I was mostly finished with basic interfaces (which are not just 
> interfaces as from Java 8 on they contain implementation too) as I 
> fixed the last compilation error when javac crashed.
> Since I can't easily isolate the part that crashes javac, here are the 
> sources (19 classes) that I'm trying to compile in one go:
> http://cr.openjdk.java.net/~plevart/misc/valhala-hacks/javany-src.jar
> Perhaps Maurizio could look at it.
> In general, the process of any-fying up to this point went mostly 
> straightforward. A couple of pain points I encountered are:
> __WhereVal(T)/__WhereRef(T) only works when 'T' is a type variable 
> from enclosing generic class. It doesn't work for example with type 
> variables from generic methods.
> The Object-like methods (equals, hashCode, toString) work for <any T> 
> typed receiver, but not when enclosed in __WhereVal(T) { ... } block. 
> Why this restriction?
> Especially tricky for any-fying was the following AbstractCollection 
> method:
> public abstract class AbstractCollection<any E> implements 
> Collection<E> {
>     public <any T> T[] toArray(T[] a)
> ...as it must support things like:
> Collection<int> intCol = ...;
> long[] longArray = intCol.toArray(new long[0]);
> The tricky part was how to code a conversion from values of  type E to 
> values of type T when E and T are both any type variables. The 
> conversions one would like to support are: identity, widening, boxing, 
> unboxing. These tricks are all hacked in javany.util.Any class If 
> anybody is interested.
> Currently there's no support in prototype to solve the 
> List.remove(int) problem, so in my experiment I just renamed the 
> method to removeByIndex.
> All in all I was surprised with the level of completeness in the 
> prototype as early as this. I'll try to go further with this 
> anyfication experiment when the compiler lets me...
> Regards, Peter

More information about the valhalla-dev mailing list