5

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.

Clashsoft
  • 11,553
  • 5
  • 40
  • 79
  • My guess is that it's generics related – k_g Feb 12 '15 at 19:30
  • When implementing a parser for a formal language you should always try to refer to [the official specification](http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.9.1) of that language first. – Holger Feb 12 '15 at 23:30

1 Answers1

9

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

gsamaras
  • 71,951
  • 46
  • 188
  • 305
Obicere
  • 2,999
  • 3
  • 20
  • 31