Search code examples
javagenericsjvmmethod-signaturejvm-bytecode

Java Bytecode Signatures


As part of the compiler for the programming language I am working on, I came across generic signatures in the bytecode, which I am trying to parse and convert to an AST. The parsing algorithm mostly works, but there seems to be a special case in which the format of these signatures behaves a bit strangely. Here are a few of these cases:

java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.lang.Class#getAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.lang.Class#getDeclaredAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getDeclaredAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.util.Collections#sort: <T::Ljava/lang/Comparable<-TT;>;>(Ljava/util/List<TT;>;)V

Out of all the methods in these classes, these are the only ones that have :: in their signature. My question is what this token does and why it exists.

Edit

I know about the :: operator in the Java Language, but this is something on the Bytecode level.


Solution

  • There is a defined syntax that changed as of JSR 14 to specify the bounds of a generic type.

    variable_name:class_type_bound:interface_type_bounds
    

    So for your example of:

    <T::Ljava/lang/Comparable<-TT;>;>
    

    Which would reflect:

    <T extends Comparable<T>>
    

    The variable name is T, there is no class type bound so it was omitted, and there was an interface bound of type Comparable<T>.

    All your example follow this, but there any many different forms:

    <T:Ljava/lang/Object;>(Ljava/util/Collection<TT;>;)TT;
    <T::Ljava/lang/Comparable;>(Ljava/util/Collection<TT;>;)TT;
    <T:Ljava/lang/Object;:Ljava/lang/Comparable;(Ljava/util/Collection<TT;>;)TT;
    

    Source