hg: valhalla/valhalla: 8198748: [lworld] Javac should insert null checks at casts to value types.
Srikanth
srikanth.adayapalam at oracle.com
Mon Mar 12 07:46:12 UTC 2018
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" <srikanth.adayapalam at oracle.com>
>> À: "valhalla-dev" <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, 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
>>>
>>> 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