JVMS draft for L-world value types with support for nullability
karen.kinnear at oracle.com
Mon Feb 5 23:31:29 UTC 2018
Detailed review of the updated JVMS draft - many are just minor typos/edits. A couple
are bigger. Many thanks for the latest changes.
1. 2.4 Reference Types and Values
" whose all instances are identity-less and immutable"
"whose" -> "for which"
2. 2.11.5 Instance Creation and Manipulation
4th bullet: non-staticfields - need a space)
3. 4.1 The Classfile Structure
"If none of the ACC_VALUE_TYPE or the ACC_INTERFACE flag is set"
-> "If neither the ACC_VALUE_TYPE ..."
4. 4.4.1 The CONSTANT_Class_info Structure
Because arrays are objects, ... "but not the opcode new" - perhaps "but not the opcodes new or defaultvalue".
5. 4.9.1. Static Constraints
getfield, putfield, getstatic, putstatic -- also withfield - must refer to a CONSTANT_FieldRef
6. 4.9.1 Static Constraints
operands of instanceof, checkcast, new ...
- also include defaultvalue
7. 4.9.1 Static Constraints
No defaulvalue instruction may reference a constant pool entry ...
- fix indentation
8. 5.3.5 Deriving a Class from a class File Representation
3. Note that if C is an interface it must have Object as its direct superclass, ...
change to "if C is an interface or a value class"
9. 5.3.5 Deriving a Class from a class File Representation
3. "If the class or interface named as the direct superclass of C is in fact an interface, ...
change to "is in fact an interface or value class" -> ICCE
10. 5.3.5 Deriving a Class from a class File Representation
5. Change ACC_VALUE_TYPE flag to ACC_FLATTENABLE
5. Perhaps word: If C has any non-static field FC with the ACC_FLATTENABLE flag set, in order
to use F below in the exception case
Rather than triggering a StackOverflwError, I was expecting a ClassCircularityError
* If any of the fields marked as ACC_FLATTENABLE is not in fact a value class, loading throws
* Otherwise, if any of the ACC_FLATTENABLE fields contains directly or indirectly the class C or the
class FC, loading throws a ClassCircularityError
11. 5.3.5 Deriving a Class from a class File Representation
5. So it looks as though you have made a change to allow ACC_FLATTENABLE on an object class.
I recognize there have been requests to support that in the future, but I think that will
require additional discussions before I would make a JVMS change.
Perhaps a bit of non-normative text here say in italics?
i.e. we do not allow a value class to migrate to an object class
- intention is to allow declaration of a ACC_FLATTENABLE to imply non-nullable for
object classes as well as value classes?
- I would leave this out until we have had further detailed discussions
12. 5.5. Initialization
Thank you for adding step 8 to pre-initialize an ACC_FLATTENABLE field.
Can you also add this to the bullets under "may be initialized only as a result of:
* If C is a reference type and a containing class declares a field C with the
ACC_FLATTENABLE flag set ...
13. General question
Would it make sense to disallow an Interface to define a field with ACC_FLATTENABLE?
14. Chapter 6:
putfield "withe" -> "with the"
I need to double-check - I was expecting a runtime, not a linktime NPE due to ACC_FLATTENABLE.
Does linktime actually know the value you are writing?
15. Chapter 6:
mentions null for value class type throws NPE, but I think that is intended to be if
ACC_FLATTENABLE, and again - isn't this a run-time exception?
16. Chapter 6:
new: if finds interface, abstract class or value class -> throws InstantiationError
defaultvalue: if interface or abstract class, throws InstantiationError
if object class, throws ICCE
We can ask Dan Smith what he prefers here. Given it is ok to migrate object class to value class, but
not value class to object class, perhaps it is appropriate to have asymmetric errors.
17. Chapter 6:
typo: vwithtfield =204
same question: NPE - isn't that a runtime exception
> On Feb 5, 2018, at 2:05 PM, Frederic Parain <frederic.parain at oracle.com> wrote:
> Here’s an update of the JVMS draft:
> with the following changes:
> * Renamed ACC_NON_NULLABLE with ACC_FLATTENABLE
> * Removed restriction that ACC_FLATTENABLE cannot be used on static fields
> * Added rules about circularity restrictions for fields with the ACC_FLATTENABLE flag set
> * Added rules about initialization of classes of flattenable fields
More information about the valhalla-spec-observers