defaultvalue and enclosing instances
srikanth.adayapalam at oracle.com
Fri Sep 14 06:32:13 UTC 2018
The section on defaultvalue opcode in the draft JVMS reads:
"The defaultvalue instruction does provide a completely initialized
instance; known as the
default value of the value class."
This raises the question, if the value type happens to be an inner
class, what is its enclosing instance field initialized to ?
If the source code used the canonical constructor notation (CCN), this
will automatically be taken care of:
the call to new InnerValue() would have supplied an explicit/implicit
enclosing instance of suitable type.
If the source code uses the recently introduced syntax (JDK-8207168 -
which is really a cleaned up version of the older __MakeDefault VT()
InnerValue iv = InnerValue.default;
this gets lowered into the defaultvalue opcode which would not have any
proper enclosing instance (and so will not be a "completely initialized
So what do we do ?
Some options seem to be: (a) disallow InnerValue.default syntax if
InnerValue is a nonstatic nested class and mandate that instances of
such be created using CCN (b) allow InnerValue.default only where an
implicit instance is available and somehow arrange for the proper
initialization of the enclosing instance (c) Allow for explicit
enclosing instance to be specified in the syntax itself and somehow
arrange for the proper initialization of the enclosing instance ... (d)
other solutions ...
Thanks in advance for comments.
More information about the valhalla-dev