A "RecursiveConstants" attribute

Karen Kinnear karen.kinnear at oracle.com
Fri Jan 19 20:39:42 UTC 2018


Dan H,

Thank you for the suggestion. I need to study this in more detail. 

Would it work for you if we finalize the latest Condy JVMS that Dan S sent out and look into
recursion handling in more detail as part of a future cycle?

http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2018-January/000505.html <http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2018-January/000505.html>

thanks,
Karen

> On Jan 19, 2018, at 3:11 PM, Dan Smith <daniel.smith at oracle.com> wrote:
> 
> We had the following discussion in the Dec 20 meeting:
> 
>> On Jan 3, 2018, at 9:11 AM, Karen Kinnear <Karen.Kinnear at oracle.com <mailto:Karen.Kinnear at oracle.com>> wrote:
>> 
>> Dan S: Cycle handling
>> Array types can have cycles
>>   - rather than relying on ordering - perhaps tell tree depth - e.g. component type & dimensions - all in the CP
>> John: perhaps modify to include the depth indicators in an attribute (separate proof of acyclicity)
>> Remi: but if you insert a condy …
>> John: would need to discard the attribute
>> Dan H: concern about a constant array for each dimension
>> ? maybe some adhoc compression techniques
>> Remi: why do you want to be cycle free?
>> Dan S: hard to verify if types cyclical?
>> Remi: why do you need to check in the verifier?
>> John: maybe a structural constraint?
>> Remi: if value - ok, but not for an array of values?
>>   e.g. Object[] with first entity as itself
>> Dan: want array type convertible to finite string, benefit of attribute not tied to construct is it can evolve 
>> 
>> Dan H: Concerns about attributes - will this be as hard to maintain for e.g. class redefiners/bytecode generators as stackmaptables?
>> No - you have to keep the CP indices in sync, but stackmaptables required abstract interpretation - transformer
>> did not have the type information, and the compression mechanism was harder to implement and these
>> would just require bumping indices.
> 
> To flesh the attribute idea out, here's a possible spec. Mentions CONSTANT_Dynamic for now, and would be modified in the future to name other constant types that allow cycles.
> 
> Is this a happy solution to the problems raised in previous discussions about constant cycles? Any new problems introduced?
> 
> —Dan
> 
> 
> 4.7.28 The `RecursiveConstants` Attribute (new)
> -----------------------------------------
> 
> The `RecursiveConstants` attribute is a variable-length attribute in the `attributes` table of a `ClassFile` structure ([4.1]). The `RecursiveConstants` attribute facilitates checks that a `CONSTANT_Dynamic` entry in the `constant_pool` table does not refer, directly or indirectly, to itself ([4.4.13]).
> 
> ~~~~
> RecursiveConstants_attribute {
>     u2 attribute_name_index;
>     u4 attribute_length;
>     u2 num_recursive_constants;
>     {   u2 constant_index;
>         u2 max_recursion_depth;
>     } recursive_constants[num_recursive_constants];
> }
> ~~~~
> 
> The items in the `RecursiveConstants_attribute` structure are as follows:
> 
> `attribute_name_index`
> 
> :  The value of the `attribute_name_index` item must be a valid index into the `constant_pool` table. The `constant_pool` entry at that index must be a `CONSTANT_Utf8_info` structure ([4.4.7]) representing the string `"RecursiveConstants"`.
> 
> `attribute_length`
> 
> : The value of the `attribute_length` item indicates the length of the attribute, excluding the initial six bytes.
> 
> `num_recursive_constants`
> 
> : The value of the `num_recursive_constants` item gives the number of entries in the `recursive_constants` array.
> 
> `recursive_constants`
> 
> : Each entry in the `recursive_constants` table contains the following two items:
> 
>     `constant_index`
>     
>     : The value of `constant_index` must be a valid index into the `constant_pool` table. The `constant_pool` entry at that index must be a `CONSTANT_Dynamic` structure ([4.4.13]).
>     
>         There may be at most one entry in the `recursive_constants` table for each `CONSTANT_Dynamic` structure in the `constant_pool`.
>     
>     `max_recursion_depth`
>     
>     : The value of `max_recursion_depth` designates a _maximum recursion depth_ for the referenced constant.
> 
> 
> 4.4.13 The `CONSTANT_Dynamic_info` Structure (modified)
> --------------------------------------------
> 
> The `CONSTANT_Dynamic_info` structure is used to describe a _dynamically-computed constant_, an arbitrary primitive or reference value produced by invocation of a _bootstrap method_ ([4.7.23]). The structure specifies i) a bootstrap method handle with an optional sequence of _static arguments_ and ii) a referenced name and type.
> 
> ~~~~
> CONSTANT_Dynamic_info {
>    u1 tag;
>    u2 bootstrap_method_attr_index;
>    u2 name_and_type_index;
> }
> ~~~~
> 
> The items of the `CONSTANT_Dynamic_info` structure are as follows:
> 
> `tag`
> 
> : The `tag` item of the `CONSTANT_Dynamic_info` structure has the value
> `CONSTANT_Dynamic` (17).
> 
> `bootstrap_method_attr_index`
> 
> : The value of the `bootstrap_method_attr_index` item must be a valid index into the `bootstrap_methods` array of the bootstrap method table ([4.7.23]) of this class file.
> 
>     **The _maximum recursion depth_ of a `CONSTANT_Dynamic` structure is the value given by `max_recursion_depth` of an entry referencing the `CONSTANT_Dynamic` structure in the `recursive_constants` table of the `RecursiveConstants` attribute ([4.7.28]); or, if no such entry exists, 0. Let _d_ be the maximum recursion depth of this `CONSTANT_Dynamic_info` structure. For each item in the `bootstrap_arguments` array of the `bootstrap_methods` entry referenced by `bootstrap_method_attr_index`, if the item references a `CONSTANT_Dynamic_info` structure, the maximum recursion depth of that structure must be less than (and not equal to) _d_.**
> 
>     > **This check prevents a `CONSTANT_Dynamic_info` structure from referring to itself via one of its static arguments.**
> 
> `name_and_type_index`
> 
> : The value of the `name_and_type_index` item must be a valid index into the `constant_pool` table. The `constant_pool` entry at that index must be a `CONSTANT_NameAndType_info` structure ([4.4.6]) representing a name and field descriptor ([4.3.2]).
> 



More information about the valhalla-spec-observers mailing list