Dan,

Thank you for the responses. Summary - we are good with the current JVMS 
description of decoupling VCC and DVC initialization and linking
as long as you add vbox to require initialization of the VCC.


> On Jun 13, 2017, at 6:51 PM, Dan Smith <daniel.sm...@oracle.com> wrote:
> 
>> On Jun 13, 2017, at 3:26 PM, Karen Kinnear <karen.kinn...@oracle.com 
>> <mailto:karen.kinn...@oracle.com>> wrote:
>> 
>> I wanted to follow up specifically on the load/link/init relationships for 
>> the Value Capable Class (VCC) and the derived Value Class (DVC) to use the 
>> terms in this JVMS draft. (Note: direct value class is the longer term 
>> directly defined value class which I have been calling a Valhalla Value Type 
>> VVT)
> 
>> Detailed question:
>> In JVMS 5.5 Initialization in your draft - is it intentional that for 
>> anewarray and multianewarray that you mention a direct value class type
>>  - which in your terminology I believe is the future “valhalla value type” 
>> which is directly defined but not derived from a VCC. So that
>> you would not trigger initialization for these instructions for a derived 
>> value class?
>> Would that be the same for vdefault also then?
> 
> I think you're misunderstanding my use of "direct" -- I mean "non-reference" 
> (as opposed to "reference value", which is a pointer). A "value class" is a 
> class with ACC_VALUE set. The only way to get one of those, per current spec, 
> is by deriving it from a VCC, and, sure, "derived value class" is an 
> appropriate term. A "direct value class type" is the Q type of a value class, 
> whether that class is derived or otherwise (were "otherwise" a possibility).
My misunderstanding. Thank you for clearing up the terminology - I will make a 
new cheat sheet :-)
> 
>> I think we are all in agreement that a reference to a DVC must first 
>> pre-load the VCC just as it has to pre-load supertypes.
>> 
>> The question arises about linking and initialization.
>> 
>> So to clarify, the DVC does not have any methods, including <clinit> today, 
>> and does not have any statics.
>>   So linking of the DVC itself does nothing.
>>   So initialization of the DVC itself does nothing.
>> 
>> I think there are two models we would use here.
>> 
>> Option 1: super-type model for root class relative to derived class: 
>> pre-link and pre-init VCC when linking or initialization the DVC
>> 
>> Conceptually I think of a DVC and VCC as sharing one set of statics, and a 
>> value class instance today as a “copy” of the instance fields of a VCC 
>> instance. 
> 
>> Longer-term it is not clear if we will have a root class and a derived 
>> class, or conceptually one class file with two derived
>> classes, but I believe the expectation is that there will continue to be one 
>> set of statics, so I would expect the statics to need
>> to be initialized before either derived class created an instance.
>> 
>>           Longer-term it is expected that we will have a single source file 
>> with methods that must be verified before either class can
>> be used.
> 
> If there's one set of statics, I would say there is one class. This approach 
> seems consistent with a model in which we eliminate "Foo$Value" as a class 
> name and just have reference and value flavors of "Foo" instead. At that 
> point, I would say that we only have one thing to load, link, and initialize, 
> and resolution of Q types should trigger that just like resolution of L types.
There is one set of statics.

From an implementation standpoint - the hotspot JVM would like to keep the 
Foo$Value for Early Access since there would be too many changes internally to
handle the transition from name/class loader pair to the triple of 
name/mode/class loader.
We can explore this again after Early Access.
> 
>> Option 2: lazy initialization, lazy linking
>> 
>> Alternatively we could not initialize the VCC until any of the current 
>> instructions either reference a static or create an instance.
>> Note: I would expect vbox to be added to the instructions requiring 
>> initialization in this case since it creates an instance of the VCC
>> 
>> Even in this case I would continue to require initialization and linking 
>> according to the rules you state, e.g. adding initialization
>> based on vdefault, anewarray, multianewarray even if they do nothing other 
>> than a state change.
>> 
>> I do not know in this case how to handle verification errors in the VCC - 
>> i.e. are you still free to operate on the DVC?
>> What happens when you try to vbox?
> 
> I think this describes the approach I've tried to specify. You have to load 
> the VCC before defining the DVC, but otherwise we're talking about two 
> independent classes.
> 
> Good point, 'vbox' should be on the list of instructions that require 
> initialization of the VCC.
> 
> Linking of the VCC would be subject to the general rules for linking (5.8): 
> must happen sometime after loading, sometime before initialization. Errors 
> occur at a point in the program that "might, directly or indirectly, require 
> linkage". 'vbox' would be one such point in a program.
thanks,
Karen

> 
> —Dan

Reply via email to