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

Srikanth srikanth.adayapalam at oracle.com
Mon Jul 16 06:46:34 UTC 2018


Thanks so much for testing this, Remi!

I raised https://bugs.openjdk.java.net/browse/JDK-8207330 and fixed it with a push of http://hg.openjdk.java.net/valhalla/valhalla/rev/f0e1ddcd0054

(Same problem existed for synthetics storing captured outer locals - also fixed)

Thanks Srikanth

On Sunday 15 July 2018 06:39 PM, Remi Forax wrote:

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 ACCFLATENABLE 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 ACCFLATENABLE final fr.umlv.valuetype.Outer this$0; descriptor: Lfr/umlv/valuetype/Outer; flags: (0x1010) ACCFINAL, ACCSYNTHETIC That's all I can think of. Cheers Maurizio cheers, Rémi



More information about the valhalla-dev mailing list