JVMS draft for L-world value types with support for nullability

Karen Kinnear 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. 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

  5. Exceptions:
      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
        an ICCE
      * 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:
> http://cr.openjdk.java.net/~fparain/L-world/L-World-JVMS-4.pdf
> with the following changes:
>  * 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 
> Fred

More information about the valhalla-spec-observers mailing list