State of javac support for lworld-values.
Srikanth
srikanth.adayapalam at oracle.com
Wed Mar 14 00:12:14 UTC 2018
Hi Karen,
For value arrays, I don't think there is anything that expressly needs
to be handled by javac. I will double check.
For nullability, my understanding is that expectations are different for
javac and the VM. That javac should regardless of the flattenable/array
element status, forbid injection of nulls.
I will for wait comments to trickle through and raise tickets to follow
up on them beginning next week.
Thanks
Srikanth
On Wednesday 14 March 2018 03:34 AM, Karen Kinnear wrote:
> Srikanth,
>
> Many thanks for all of the work, thoughtful questions and flexibility.
> And extra thanks on working through withfield handling.
>
> Your timing could not have been better. I was just reviewing all of
> what you have changed to see where things have evolved since we spoke,
> and which issues are still under discussion. And
> your latest notes cleared up most of my questions.
>
> 1. Frederic made a good point - a value type can not have an inner
> class, i.e. a non-static nested class, since it does not have identity.
>
> 2. Arrays extract from EG minutes: - which I just typed in Friday night
>
> - I don’t think you have had time to make the value array changes yet?
>
> Based on emails this week between Mr Simms, Remi, John on
> valhalla-dev at openjdk.java.net <mailto:valhalla-dev at openjdk.java.net>,
> here is a summary of a new proposal:
>
> Value type arrays are always flattenable, and therefore not nullable
>
> If the end user wants non-flattenable/nullable they can use
> Object[] or Interface[] or maybe a future reflective API if needed
> that creates a reference array - but for now let us assume that value
> type arrays are always flattenable, prototype that and then we can
> assess what the cost might be if we need dynamic checking.
>
> As with fields, implementation determines if the component is
> actually flattened.
>
> bytecode implications:
> aaload - returns default from default initialized value type
> component
> aastore - throws NPE if attempt to store null. Must store
> default value for component
> anewarray/multianewarray - if the component is a value type,
> create a value type array
>
> I believe there are two major open issues:
> 1. you identified one - which is the discussion around <init>, which I
> think also includes
> handling of __MakeDefault
>
> 2. I think we are still working through nullability of a value type issues
> I know you and John exchanged a number of emails over the past few weeks.
> I also believe that last Wednesday at both the Valhalla-vm and
> valhalla EG meetings
> we discussed again nullability relative to value type fields.
>
> Value type fields:
> I would like to have a follow-up discussion about nullability of
> value types based on ACC_FLATTENABLE,
> and how to handle migration.
>
> The key points below that I want us to revisit are:
>> - Value instances may not be compared with == or !=. == and !=
>> cannot have any value operand(s)
>> - Null cannot be assigned to value types
>> - Null cannot be casted to or compared with value types.
>> - Fields may be flagged as being__Flattenable. This results in
>> the ACC_FLATTENABLE(0x100) field flag bit being set in the class
>> file. Besides setting this flag bit, the compiler does not use this flag.
>
> thanks,
> Karen
>
>
>> On Mar 13, 2018, at 7:46 AM, Srikanth <srikanth.adayapalam at oracle.com
>> <mailto:srikanth.adayapalam at oracle.com>> wrote:
>>
>>
>> Hello Frederic, Karen and list,
>>
>> I have taken stock of and reviewed the changes made so far to javac
>> to support lworld values and I think the work looks complete as far
>> as I can tell (except for
>> https://bugs.openjdk.java.net/browse/JDK-8198749: Role of
>> constructors and <init> methods for value classes - which is still
>> under discussion)
>>
>> I would be happy to follow up on any errors of omission and/or
>> commission or to accommodate any new requirements that emerge as the
>> prototype work evolves.
>>
>> Here is an inventory of features, constructs and behaviors already
>> pushed to lworld branch tip:
>>
>> - A class declaration may be tagged as being a value type by
>> using the `__ByValue' modifier
>> - This feature is allowed as of now, at source level >= JDK11
>> - Only a class may be tagged as being a value type - interfaces,
>> annotation types, enums cannot be.
>> - Top level, inner, nested, local classes may be tagged as __ByValue.
>> - Value classes must be declared to be final and so abstract
>> classes or interfaces cannot be value types.
>> - Akin to enums, annotation types and interfaces, value types may
>> not declare an explicit super class (not even j.l.O). All value types
>> implicitly extend j.l.O. They may declare explicit super interfaces.
>> - Value types can be type arguments in generic type
>> parameterizations.
>> - Value types can be explicit type witnesses in generic method
>> invocations
>> - Value types can be wildcard bounds (even if only with limited
>> utility on account of being final classes - a la String)
>> - Value types can be intersection (cast) type components (FWIW),
>> - Value instances can be enclosing instances in instance creation
>> expressions.
>> - At the class file, a value class is signalled by the class flag
>> ACC_VALUE(0x100). Javac will ignore this flag *from* class files when
>> compiling for a source level that does not recognize value classes as
>> such.
>> - All instance fields of a value class must be declared to be final.
>> - Value instances are created with __MakeDefault. `new' cannot be
>> used with value classes and likewise __MakeDefault cannot be used
>> with non-value reference types.
>> - __MakeDefault does not accept any parameters. No constructor
>> invocation - not even the no-arg constructor invocation - is involved.
>> - Values have no instance lock and so may not be synchronized upon.
>> - Values have no identity and consequently the method
>> java.lang.System.identityHashCode may not be invoked on them
>> - The following methods from j.l.O are not allowed on value
>> receivers:
>> clone(), finalize(), wait(), wait(long), wait(long, int),
>> notify(), notifyAll()
>> - Value instances may not be compared with == or !=. == and !=
>> cannot have any value operand(s)
>> - instance methods of value types do not have a monitor
>> associated with their this and so cannot be declared as synchronized
>> - Null cannot be assigned to value types
>> - Null cannot be casted to or compared with value types.
>> - Fields may be flagged as being__Flattenable. This results in
>> the ACC_FLATTENABLE(0x100) field flag bit being set in the class
>> file. Besides setting this flag bit, the compiler does not use this flag.
>> - There may not be a cycle that passes through fields tagged as
>> being Flattenable.
>> - With the compiler option -XDrejectValueMembershipCycles, javac
>> will not allow a value type to declare fields of its own type either
>> directly or indirectly (flattenable or otherwise)
>> - An instance field of a value class may be updated via the
>> __WithField "operator". This does not update the original value
>> instance, but produces an updated copy.
>> - The first operand of the __WithField operator must be an
>> instance field of a value class, while the second operand is of
>> suitable type that is assignable to the the first operand field.
>> - __WithField may be used to update an instance field of a value
>> type only from, but anywhere from the same nest.
>> - __Withfield may not be used to update a value field with null.
>> - There is no implicit write back - the result of the __WithField
>> operator must be assigned to a suitable *writeable* handle - There is
>> no relaxation of the rules around finality when it comes to value
>> types. So final variables cannot be written to. Nor can `this`
>> - (non-blank) final *instance* fields of value types that are
>> initialized with compile time constants are not treated as constant
>> expressions and do not take part in constant propagation/folding.
>> Each read of such a field would result in a fresh getField and the
>> ConstantValue attribute would be missing in the class file.
>> - The compiler will insert a null check when an object or
>> interface type is cast into a value class.
>> - Two new opcodes: defaultvalue(203) and withfield(204)
>> - Byte code library has been brought up to date
>> - Tests for all the above.
>>
>> Thanks!
>> Srikanth
>
More information about the valhalla-dev
mailing list