hg: valhalla/valhalla: 8198748: [lworld] Javac should insert null checks at casts to value types.
forax at univ-mlv.fr
forax at univ-mlv.fr
Tue Mar 13 13:23:29 UTC 2018
Thanks Srikanth,
it's very helpful, currently i only deal with java 6 code (i control the compiler) for the transformations i was thinking about, but with Java 11 being a LTS, i suppose the target 6 will disappear and i will have to deal with this new kind of nullcheck.
Rémi
> De: "Srikanth" <srikanth.adayapalam at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Lundi 12 Mars 2018 08:46:12
> Objet: Re: hg: valhalla/valhalla: 8198748: [lworld] Javac should insert null
> checks at casts to value types.
> On Monday 12 March 2018 12:29 PM, Remi Forax wrote:
>> Hi Srikanth,
>> thanks for doing that.
>> There is already a code path in the compiler to generate nullchecks using
>> getClass() + pop,
>> i think you should reuse this code instead of adding another way to do a
>> nullcheck.
> Hello Remi,
> Javac *already* employs two distinct mechanisms to implement null checks:
> Please see: Gen#genNullCheck
> /** Generate a null check from the object value at stack top. */ private void
> genNullCheck (JCTree tree) { code .statBegin(tree. pos ) ; if (
> allowBetterNullChecks ) {
> callMethod(tree.pos() , syms . objectsType , names . requireNonNull , List. of (
> syms . objectType ) , true ) ; } else {
> callMethod(tree.pos() , syms . objectType , names . getClass , List. nil () ,
> false ) ; } code .emitop0( pop ) ; }
> where the controlling boolean is initialized as:
> allowBetterNullChecks = target .hasObjects() ;
> and target.hasObjects() is really:
> /** Does the target JDK contains the java.util.Objects class? */ public boolean
> hasObjects () { return compareTo( JDK1_7 ) >= 0 ; }
> In short, I am not expressly selecting the method of implementing the null
> check, only inserting a null-check AST node.
> So this pattern is already emitted by javac and any/all analyzers should anyway
> be upgraded (should have been upgraded already)
> Thanks!
> Srikanth
>> And with my hat of backporter/bytecode analyzer writer, adding a new runtime
>> dependency, here, to Objects.requireNonNull, makes things more complex because
>> some analyzers may have to be enhanced to recognize this new pattern.
>> cheers,
>> Rémi
>> ----- Mail original -----
>>> De: "Srikanth" [ mailto:srikanth.adayapalam at oracle.com |
>>> <srikanth.adayapalam at oracle.com> ] À: "valhalla-dev" [
>>> mailto:valhalla-dev at openjdk.java.net | <valhalla-dev at openjdk.java.net> ]
>>> Envoyé: Lundi 12 Mars 2018 07:32:13
>>> Objet: Re: hg: valhalla/valhalla: 8198748: [lworld] Javac should insert null
>>> checks at casts to value types.
>>> On Monday 12 March 2018 11:51 AM, [ mailto:srikanth.adayapalam at oracle.com |
>>> srikanth.adayapalam at oracle.com ] wrote:
>>>> Changeset: 7c1c51c340e6
>>>> Author: sadayapalam
>>>> Date: 2018-03-12 11:46 +0530
>>>> URL: [ http://hg.openjdk.java.net/valhalla/valhalla/rev/7c1c51c340e6 |
>>>> http://hg.openjdk.java.net/valhalla/valhalla/rev/7c1c51c340e6 ] 8198748:
>>>> [lworld] Javac should insert null checks at casts to value types.
>>> Notes:
>>> Where Point is a value type, code generated for casting an object to
>>> Point as in:
>>> Object o = ...
>>> Point p = (Point) o;
>>> is:
>>> 2: aload_1
>>> 3: dup
>>> 4: invokestatic #2 // Method
>>> java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
>>> 7: pop
>>> 8: checkcast #3 // class Point
>>> 11: astore_2
>>> If the cast occurs in source code compiled at a level where value types
>>> are not recognized as such, then there is no insertion of null check.
>>> (FWIW, Javac is not in the business of nullness tracking, so these
>>> checks will be inserted even where a cursory glance of source code
>>> context could inform a reader that no null check would be needed)
>>> Thanks
>>> Srikanth
>>>> ! src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
>>>> ! src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java
>>>> + test/langtools/tools/javac/valhalla/lworld-values/CastNoNullCheckTest.java
>>>> + test/langtools/tools/javac/valhalla/lworld-values/CastNullCheckTest.java
More information about the valhalla-dev
mailing list