RFR:JDK-8198749 Translation of value constructors in classic constructor notation (original) (raw)

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