Improving the format of type annotation attributes

Michael Ernst mernst at cs.washington.edu
Wed Nov 7 10:26:20 PST 2012


I have now updated the specification to account for the type_path
representation of compound types.  This made the spec shorter and simpler,
which is nice.  The changelog is at
http://jsr308-langtools.googlecode.com/hg/doc/jsr308-changes.html but
you'll want to see the actual spec in the repository instead.  (Let me know
if you want me to send you a formatted HTML or PDF version.)  Comments are
welcome, as always.

		    -Mike


> Subject: Re: Improving the format of type annotation attributes
> From: Michael Ernst <mernst at cs.washington.edu>
> To: type-annotations-spec-experts at openjdk.java.net
> Date: Tue, 06 Nov 2012 13:07:33 -0800 (PST)
>
> Eric Bruneton made the following suggestion about restructuring the class
> file format for
>
> This approach combines elements of earlier proposals by John Rose, Alex
> Buckley, Eric Bruneton, and others.  It seems to be the right mix.  I am
> editing the JSR 308 specification to specify the below class file format
> (though some of the names in the union have subsequently changed).
>
> Thanks, Eric!
>
> 		    -Mike
>
>
>
> > Subject: Re: Improving the format of type annotation attributes
> > From: Eric Bruneton <ebruneton at free.fr>
> > To: type-annotations-spec-comments at openjdk.java.net
> > Date: Sat, 22 Sep 2012 17:15:16 +0200
> >
> > I have one comment about the "fully nested" format proposed by John
> > Rose. As noted by Alex Buckley this is an "inside-out" encoding for all
> > kinds of targets. For reasons that I explained previously, I think it would
> > be better to have an outside-in encoding for all targets. This can be done
> > with a "nested" approach too, as follows:
> >
> > type_annotation {
> >     // New fields in JSR 308:
> >     u1 target_type; // CHANGE: u1 and remove the 18 odd types
> >     union {
> >         typeparam_target;
> >         supertype_target;
> >         typeparam_bound_target;
> >         empty_target;
> >         methodparam_target;
> >         exception_target;
> >         localvar_target;
> >         catch_target;
> >         offset_target;
> >         typearg_target;
> >     } target_info;
> >     type_path target_path; // ++ADDED, see below
> >     // Original fields from "annotation" structure:
> >     u2 type_index;
> >     u2 num_element_value_pairs;
> >     {
> >         u2 element_name_index;
> >         element_value value;
> >     } element_value_pairs[num_element_value_pairs];
> > }
> >
> > ADDED structure:
> >
> > struct type_path {
> >     u1 path_type; // five possible values, one for each case below
> >     union {
> >         struct empty_path {};
> >         struct array_type_path { type_path subpath; };
> >         struct inner_type_path { type_path subpath; };
> >         struct wildcard_path { type_path subpath; };
> >         struct type_argument_path { u1 parameter_index; type_path subpath; };
> >     }
> > }
> >
> > In this way we have the annotation target first, from most significant to
> > least significant parts, followed by the annotation value. From the ASM
> > point of view, both this proposed format and the current "counted" format
> > (with nested types numbering reversed) would be fine.
> >
> > Eric


More information about the type-annotations-spec-experts mailing list