hg: valhalla/valhalla: [lworld] Introduce a new annotation java.lang.ValueBased to distinguish migrating value based classes from pure value types and implement leniet semantics for them; Also flip the default for ACC_Flattenable

Srikanth srikanth.adayapalam at oracle.com
Mon Apr 2 12:49:17 UTC 2018

On Monday 02 April 2018 05:51 PM, srikanth.adayapalam at oracle.com wrote:
> Changeset: 32ff82e6b770
> Author:    sadayapalam
> Date:      2018-04-02 17:50 +0530
> URL:       http://hg.openjdk.java.net/valhalla/valhalla/rev/32ff82e6b770
> [lworld] Introduce a new annotation java.lang.ValueBased to distinguish migrating value based classes from pure value types and implement leniet semantics for them; Also flip the default for ACC_Flattenable


     - Introduces a new annotation java.lang.ValueBased with which a 
__ByValue class may be decorated to indicate that it is a value based 
class evolving to become a value type.
     - A __ByValue class without this annotation is considered a "pure" 
value type.
     - ACC_FLATTENABLE defaults are flipped. A field whose type is a 
pure value type will automatically be flagged ACC_FLATTENABLE in its 
containing instance.
     - For value based classes evolving to value types, the default 
flattenable status is NOT flattenable. Request flattening with the field 
modifier __Flattenable.
     - A field whose type is a pure value type can opt out of flattening 
by using the new field modifier __NotFlattened
     - Javac will redundantly accept __Flattenable with pure value typed 
fields and __NotFlattened with VBC typed fields.
     - @ValueBased instances can be assigned null; null can be cast to 
them - this would result in a warning at compile time and not an error. 
(the unrealistic code pattern "null instanceof VBC" would also trigger a 
warning instead of error)
     - Javac continues to implement a strict mode for pure value types 
(also see below)
     - The lenient mode for @ValueBased classes is only for null 
assignment and (the unrealistic) casting of nulls to @ValueBased types. 
All identity related violations still result in an error. So does 
comparison of @ValueBased type instances. (Rationale: Karen originally 
asked for null related violations to be tolerated on the grounds that 
the documentation for value based classes does not expressly forbid 
these. However since == and != are expressly called out as inadvisable 
operations on value based classes, I have continued to treat them as 
errors - but I can be convinced to relax this)
      - This change set does not identify and annotate the classes in 
JDK that are value based with @ValueBased. Only introduces the 
annotation and the new semantics for it.
     - When an Object instance or a interface instance is cast to a 
value type, javac will insert a null check IFF the target of the cast is 
NOT @ValueBased.
     - When compiling at a source level that is NOT __ByValue aware, if 
javac encounters a class file that has the ACC_VALUE bit set, the class 
will be demoted to @ValueBased even though it may not have been 
annotated with @ValueBased. This will result in null violation warnings 
to be emitted as appropriate.
      - As of this change set the @ValueBased annotation is supposed to 
always be paired with __ByValue modifier (not checked). A new lint mode 
in consideration for JDK11 will implement sanity checks for @ValueBased 
classes that are candidates for evolution at a future date and so are 
not yet ready to be modified with __ByValue.
     - Javac does not inject null checks with any opcode other than 
checkcast - see earlier mail raising some questions about the necessity 
of this with other opcodes.
     - Expect some surprises in tests due to the flipping of defaults 
for flattening.

Karen, please let me know if this adequately covers your proposal.


> + src/java.base/share/classes/java/lang/ValueBased.java
> ! src/java.compiler/share/classes/javax/lang/model/element/Modifier.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java
> ! src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
> ! src/jdk.jshell/share/classes/jdk/jshell/CompletenessAnalyzer.java
> + test/langtools/tools/javac/diags/examples/BadValueBasedAnno.java
> + test/langtools/tools/javac/diags/examples/SuspiciousNullMix.java
> + test/langtools/tools/javac/valhalla/lworld-values/BadValueBased.java
> + test/langtools/tools/javac/valhalla/lworld-values/BadValueBased.out
> ! test/langtools/tools/javac/valhalla/lworld-values/CastNullCheckTest.java
> + test/langtools/tools/javac/valhalla/lworld-values/CheckDefaultFlattenable.java
> ! test/langtools/tools/javac/valhalla/lworld-values/CheckNullCastable.out
> + test/langtools/tools/javac/valhalla/lworld-values/DemoteToValueBasedTest.java
> + test/langtools/tools/javac/valhalla/lworld-values/DemoteToValueBasedTest.out
> + test/langtools/tools/javac/valhalla/lworld-values/DemoteToValueBasedTest10.out
> ! test/langtools/tools/javac/valhalla/lworld-values/FlattenableFlagTest.java
> ! test/langtools/tools/javac/valhalla/lworld-values/Point.java
> + test/langtools/tools/javac/valhalla/lworld-values/ValueBasedWarningsTest.java
> + test/langtools/tools/javac/valhalla/lworld-values/ValueBasedWarningsTest.out

More information about the valhalla-dev mailing list