null checks vs. class resolution, and translation strategy for casts

Brian Goetz brian.goetz at
Thu Apr 9 20:03:39 UTC 2020

> I have a proposal for a translation strategy:

Casts to inline classes from their reference projections will be 
frequent.  Because the reference projection is sealed to permit only the 
value projection, a cast is morally equivalent to a null check. We want 
to preserve this performance model, because otherwise we're reinventing 

Going through `ldc X.class / invokevirtual Class.cast` will surely be 
slow in the interpreter, but also risks being slow elsewhere (as do many 
of the other options.)

So let me add to your list: is it time for a `checknonnull` bytecode, 
which throws NPE if null, or some other more flexible checking 
bytecode?  (Alternatively, if we're saving bytecodes: `invokevirtual 
Object.<nullcheck>`), where <nullcheck> is a fake method that always 
links to a no-op, but invokevirtual NPEs on a null receiver.)

More information about the valhalla-spec-observers mailing list