RFR:JDK-8198749 Translation of value constructors in classic constructor notation

Remi Forax forax at univ-mlv.fr
Sun Jul 15 13:09:20 UTC 2018


Hi Srikanth,

----- Mail original -----
> De: "Srikanth" <srikanth.adayapalam at oracle.com>
> À: "Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>, "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Jeudi 12 Juillet 2018 11:04:34
> Objet: Re: RFR:JDK-8198749 Translation of value constructors in classic constructor notation

> On Wednesday 11 July 2018 06:38 PM, Maurizio Cimadamore wrote:
>>
>> * tests - mayeb for later, and depending on whether we support inner
>> values (seems to, looking at InnerValueNew) - one kind of super
>> constructor call that might get you in trouble is the qualified super
>> constructor call - e.g., with regular ordinary classes you can have this:
>>
>> class A {
>>
>>     class Inner { }
>> }
>>
>>
>> class B extends A.Inner {
>>
>>        B(A encl) {
>>            enc.super();
>>        }
>> }
>>
>>
>> It would be interesting to verify at some point that this kind of
>> idiom works with your value desugaring too.
>>
> 
> 
> Perhaps I am missing some nuance:
> 
> Of the three classes involved, A, B and A.Inner, only A can be a value
> class. B and A.Inner cannot be since values don't extend and can't be
> extended.
> 
> In that case, after the prevailing desugaring/lowering we end up with
> 
> class B extends A$Inner {
> 
>     B(A encl) {
>         super(<*nullchk*>encl);
>     }
> }
> 
> that is being fed as *input* to the new translator. The nullcheck is
> bogus and should be eliminated for
> value typed `encl' - but what other complication do you see ?
> 
> I do have tests that verify that constructors that receive synthetics
> such as enclosing instances and captured outer locals are translated
> properly.
> 
> Thanks
> Srikanth


I've just tested several inner classes cases and everything seems fine,
Maurizio, most of the trouble comes as you said when you mix inheritance and inner classes, but a value type can only inherits from Object,
so what you can do that may prevent the rewriting of the value type constructor is limited.

I've still found a bug :)
the field that reference the outer class is not marked as ACC_FLATENABLE even if the outer class is a value type.

in this example,
public __ByValue class Outer {
  private final  int value;
  
  public Outer(int value) {
    this.value = value;
  }
  
  public __ByValue class Inner {
    private final int value2;
    
    public Inner(int value2) {
      this.value2 = value2;
    }
  }
}

javap says that inside Outer$Inner.class, this$0 is not ACC_FLATENABLE
  final fr.umlv.valuetype.Outer this$0;
    descriptor: Lfr/umlv/valuetype/Outer;
    flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC


> 
> 
>>
>> That's all I can think of.
>>
>> Cheers
>> Maurizio


cheers,
Rémi


More information about the valhalla-dev mailing list