A "RecursiveConstants" attribute

Dan Smith daniel.smith at oracle.com
Fri Jan 19 20:11:27 UTC 2018


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> 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