Model 3 classfile design document

Brian Goetz brian.goetz at oracle.com
Wed Feb 10 20:52:01 UTC 2016


I see, yes, I goofed in those lines.  I guess I was eager to explicate ArrayType and didn’t type-check the results….

R(Foo<int[]>) should be just ParamType[LFoo, _].  


On Feb 10, 2016, at 8:05 PM, Bjorn B Vardal <bjornvar at ca.ibm.com> wrote:

> Thanks! That matches the behaviour I would expect.
>  
> The piece in the document that led me to the different understanding of point 3/4 was point 4  in the examples on page 4:
>     R(Foo<int[]>) = ParameterizedType['L', "Foo", ArrayType[1, "I"]]
>  
> According to point 3 and 4 in your answer, this should be:
>     R(Foo<int[]>) = ParameterizedType['L', "Foo", "_"]
>  
> And just to confirm, not the following:
>     R(Foo<int[]>) = ParameterizedType['L', "Foo", ArrayType[1, "_"]]
>  
> --
> Bjørn Vårdal
>  
>  
> ----- Original message -----
> From: Brian Goetz <brian.goetz at oracle.com>
> To: Bjorn B Vardal/Ottawa/IBM at IBMCA
> Cc: valhalla-spec-experts at openjdk.java.net
> Subject: Re: Model 3 classfile design document
> Date: Wed, Feb 10, 2016 11:51 AM
>  
> So, there’s two layers to this:
>  - What can you express in the bytecode;
>  - What will javac emit
>  
> We want the VM to be as dumb as possible with respect to parameterization and erasure.  Therefore, we don’t ask the VM to reason about things like “ref types are erased”; the language compiler asks for either reification or erasure, and the VM happily complies.  So ParamType[List, String] is a reified List<String>, and ParamType[List, erased] is an erased List.  
>  
> Javac will likely never emit reified generics over references, but other languages could.  
>  
> To your examples:
>  
> 1.  Javac will emit ParamType[Foo, erased]
> 2.  Javac will emit ParamType[Foo, int] (reified)
> 3.  Javac will emit ParamType[Foo, erased] (since int[] is a reference type)
> 4.  Javac will emit ParamType[Foo, erased] (same)
>  
> Did I make a mistake in the doc that suggested otherwise for 3/4?  Please correct me!  
>  
> On Feb 10, 2016, at 3:50 PM, Bjorn B Vardal <bjornvar at ca.ibm.com> wrote:
>  
>> 
>> I have a question about reifying array types. This is what I understand is the proposed behaviour:
>> Foo<String> - Reference, so erased
>> Foo<int> - Primitive, so reified
>> Foo<int[]> - In the Model 3 Classfile Design document, this is reified.
>> Foo<String[]> - Unclear - erased as reference, or reified as array?
>> The first two are quite clear, but I'm wondering about 3 and 4. What is the reason for reifying the int[] in the Model 3 document? Considering that both int[] and String are subclasses of Object, can we not erase array types? If we can't erase them, does that apply to reference arrays as well, e.g. String[]?
>> --
>> Bjørn Vårdal
>>  
>>  
>> ----- Original message -----
>> From: Brian Goetz <brian.goetz at oracle.com>
>> Sent by: "valhalla-spec-experts" <valhalla-spec-experts-bounces at openjdk.java.net>
>> To: valhalla-spec-experts at openjdk.java.net
>> Cc:
>> Subject: Model 3 classfile design document
>> Date: Fri, Jan 22, 2016 11:53 AM
>>  
>> Please find a document here:
>> 
>> http://cr.openjdk.java.net/~briangoetz/valhalla/eg-attachments/model3-01.html
>> 
>> that describes our current thinking for evolving the classfile format to
>> clearly and efficiently represent parametric polymorphism.  The early
>> concepts of this approach were outlined in my talk at JVMLS last year;
>> this represents a refinement of those ideas, and a reasonable "stake in
>> the ground" description of what seems the most sensible way to balance
>> preserving parametric information in the classfile without imposing
>> excessive runtime costs for loading specializations.
>> 
>> We're working on an updated compiler prototype which people will be able
>> to play with soon (along with a formal model.)
>> 
>> Please ask questions!
>> 
>> Some things this document does not address yet:
>>   - How we deal with types implicit in the bytecodes (aload vs iload)
>> and how they get specialized;
>>   - How we represent restricted methods in the classfile;
>>   - How we represent the wildcard type Foo<any>
>> 
>>  
>>  
> 
>  
> 



More information about the valhalla-spec-observers mailing list