JDK 13 RFR of JDK-8224012: AnnotatedType implementations of hashCode() lead to StackOverflowError
Joe Darcy
joe.darcy at oracle.com
Wed May 29 15:51:45 UTC 2019
Hi Joel,
Yes, as far as I know now, only AnnotatedTypeVariable was susceptible to
the stack overflow problem.
Thanks,
-Joe
On 5/29/2019 5:37 AM, Joel Borggrén-Franck wrote:
> Hi Joe!
>
> Looks good to me. Looking at the summary by the end of your mail I
> guess this is the only subtype that needs fixing?
>
> Cheers
> /Joel
>
> On Wed, 29 May 2019 at 07:52, Joe Darcy <joe.darcy at oracle.com
> <mailto:joe.darcy at oracle.com>> wrote:
>
> Hello,
>
> Please review the changes to address:
>
> JDK-8224012: AnnotatedType implementations of hashCode() lead to
> StackOverflowError
> http://cr.openjdk.java.net/~darcy/8224012.1/
>
> As discussed in the JBS entry, this is a follow-up issue to fix an
> implementation flaw in JDK-8058202: "AnnotatedType implementations
> don't
> override toString(), equals(), hashCode()".
>
> In brief, the equals/hashCode methods in the AnnotatedTypeBaseImpl
> classes are updated to avoid possible circularities in their calling
> structure. As described in more detail below, a comparison is made
> against analogous implementation types in the
> sun.reflect.generics.reflectiveObjects package
> (src/java.base/share/classes/sun/reflect/generics/reflectiveObjects).
>
> A brief summary for some additional context, the original core
> reflection had various "getFoo" methods in java.lang.Class and the
> classes in the classes of the java.lang.reflect package. In JDK 5.0,
> many of these methods had a "getGenericFoo" sibling method added to
> preserve behavioral compatibility of the original method while
> providing
> access to information about generic declarations. In JDK 8,
> "getAnnotatedFoo" methods were added, as new sibling methods to
> support
> type annotations, alongside the existing getFoo and getGenericFoo
> methods. Semantically, the getAnnotatedfoo methods are
> "getGenericAnnotatedFoo, but (fortunately) that verbose naming
> convention was not chosen. A family of AnnoatedBar classes was also
> added in JDK 8 to allow annotation on interior structures to be
> modeled,
> such as a method returning "Set<List<@Quux String>>".
>
> Some notes in the implementation, the hierarchy of annotated type
> implementation classes is housed in
> src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java.
>
> The nested classes are subtypes of AnnotatedTypeBaseImpl. The
> building
> blocks of equals and hashCode in that parent type examine the
> underlying
> type, annotations, and (possibly null) owner type.
>
> The four subtypes and the information they examine in their
> equals/hashCode methods:
>
> AnnotatedArrayType: base information + component type;
> GenericArrayTypeImpl.java compares component type
>
> AnnotatedParameterizedType: base information + actual type
> arguments;
> ParameterizedTypeImpl.java compares owner type, raw type,
> and
> actual type arguments
>
> AnnotatedTypeVariable: base information (*changed to omit
> checking
> of bounds*);
> TypeVariableImpl.java compares generic declaration and name
>
> AnnotatedWildcardType: base information + upper bounds +
> lower bounds;
> WildcardTypeImpl.java compares upper bounds and lower bounds
>
> The newly added test cases quickly stackoverflow when run against the
> old implementation.
>
> Thanks,
>
> -Joe
>
More information about the core-libs-dev
mailing list