Looks good Peter, cheers /Joel
On 2013-09-15, Peter Levart wrote: > Hi, > > I rebased the changes and added @bug tag to test. Here's new webrev: > > http://cr.openjdk.java.net/~plevart/jdk8-tl/AnnotationData/webrev.04/ > > > Joel, I believe you've got the "R" mojo now... > > > Regards, Peter > > On 09/09/2013 06:57 PM, Peter Levart wrote: > >Hi Joel, > > > >Thanks for reviewing. > > > >On 09/09/2013 04:25 PM, Joel Borggrén-Franck wrote: > >>Hi Peter, > >> > >>Thanks for this, please add a "@bug 8011940" tag to your test. IMO you > >>don't need a re-review for that. Otherwise looks good. > > > >I'll do that. I just didn't know whether tagging with bug-ID is > >meant for all tests that arise from fixing a particular bug or > >just those that test the presence/fixture of the bug. The 8011940 > >bug is about scalability and the test is not testing scalability > >(it has been demonstrated by a micro-benchmark, but that is not > >included in the test). The test is just covering the logic that > >has been re-factored and has not had any tests before. > > > >Regards, Peter > > > >>We still need a Reviewer, Chris, you reviewed a previous version, can you > >>look at this one too? > >>cheers > >>/Joel > >> > >>On 27 aug 2013, at 15:00, Peter Levart<peter.lev...@gmail.com> wrote: > >> > >>>Hi Joel and others, > >>> > >>>Here's a 3rd revision of this proposed patch: > >>> > >>>http://cr.openjdk.java.net/~plevart/jdk8-tl/AnnotationData/webrev.03/ > >>> > >>>I used LinkedHashMap for annotations in this one. It means that now even > >>>.getAnnotations() are reported in "declaration order": 1st inherited > >>>(includes overridden) then declared (that are not overriding). For > >>>example, using @Inherited annotations A1, A2, A3: > >>> > >>>@A1("C") > >>>@A2("C") > >>>class C {} > >>> > >>>@A1("D") > >>>@A3("D") > >>>class D extends C {} > >>> > >>>D.class.getAnnotations() now returns: { @A1("D"), @A2("C"), @A3("D") } ... > >>> > >>>The LHM constructor uses the following expression to estimate the initial > >>>capacity of the LHM: > >>> > >>>3326 annotations = new LinkedHashMap<>((Math.max( > >>>3327 declaredAnnotations.size(), > >>>3328 Math.min(12, > >>>declaredAnnotations.size() + superAnnotations.size()) > >>>3329 ) * 4 + 2) / 3 > >>>3330 ); > >>> > >>> > >>>I think this strikes some balance between effectivity and accuracy of > >>>estimation. I could pre-scan the superclass annotations and calculate the > >>>exact final size of the annotations Map before constructing it though. > >>>Tell me if this is worth the effort. > >>> > >>>I also created a test that tests 3 things: > >>>- class annotation inheritance > >>>- order of class annotations reported by .getAnnotations() and > >>>.getDeclaredAnnotations() methods (although not specified, the order is > >>>now stable and resembles declaration order) > >>>- behaviour of class annotation caching when class is redefined > >>> > >>> > >>>Regards, Peter > >>> > >>>On 08/13/2013 09:52 AM, Joel Borggrén-Franck wrote: > >>>>Hi, > >>>> > >>>>Comments inline, > >>>> > >>>>On 12 aug 2013, at 14:40, Peter Levart<peter.lev...@gmail.com> wrote: > >>>>>On 08/12/2013 12:54 PM, Joel Borggren-Franck wrote: > >>>>>- annotation (@interface) declarations can themselves be redefined (for > >>>>>example, defaults changed). Such redefinitions don't affect already > >>>>>initialized annotations. Default values are cached in AnnotationType > >>>>>which is not invalidated as a result of class redefinition. Maybe it > >>>>>should be. And even if AnnotationType was invalidated as a result of > >>>>>class redefinition, the defaults are looked-up when particular > >>>>>annotations are initialized and then combined with parsed values in a > >>>>>single values map inside each annotation instance (proxy), so > >>>>>invalidating AnnotationType would have no effect on those annotations. > >>>>> > >>>>>>3326 if (annotations == null) { // lazy construction > >>>>>>3327 annotations = new HashMap<>(); > >>>>>>3328 } > >>>>>> > >>>>>>I think this should be a LinkedHashMap, so that iteration is predictable > >>>>>>(I know it isn't in the current code). Also the size of the map is known > >>>>>>so you can use a constructor with an explicit initial capacity. > >>>>>Right, AnnotationParser does return LinkedHashMap, so at least > >>>>>decalredAnnotations are in parse-order. I will change the code to use > >>>>>LinkedHashMap for inherited/combined case too. > >>>>Thanks. > >>>> > >>>>>The number of annotations that end-up in inherited/combined Map is not > >>>>>known in advance. I could make a separate pre-scan for superclass > >>>>>annotations that are @Inheritable and don't have the same key as any of > >>>>>declared annotations and then sum this count with declared annotations > >>>>>count, but I don't think this will be very effective. I could allocate a > >>>>>large-enough Map to always fit (the count of superclass annotations + > >>>>>the count of declared annotations), but that could sometimes lead to > >>>>>much over-allocated Maps. I could take the min(DEFAULT_CAPACITY, > >>>>>superclass annotations count + declared annotations count) as the > >>>>>initial capacity for the Map. What do you think which of those 3 > >>>>>alternatives is the best? > >>>>My bad. I was thinking of the case where every inherited annotation was > >>>>overridden, in that case annotations.size() == > >>>>declaredAnnotations.size(). That is of course not generally true. I'm > >>>>fine with handling this as a follow up since the situation is no worse > >>>>than today and the surrounding code is better. However, > >>>> > >>>>1) We should really measure this. > >>>>2) My gut feeling is that the ratio of not overridden inherited > >>>>annotations to declared annotations is small IE the expected nr of > >>>>annotations is much closer to declare annotations than to declared + > >>>>superclass annotations. > >>>>3) The default initial capacity is 16 and load factor is 0.75. I do think > >>>>the mean nr of annotations is closer to 3 than to 12. We are probably > >>>>wasting some space here. > >>>> > >>>>Perhaps use min(default cap, (total annotations/0.75 (+ 1?))) for now as > >>>>that will make the situation no worse than today and often better? > >>>> > >>>>>>Since this is a fairly significant rewrite I think it might be good to > >>>>>>make sure our tests exercise the new code. Can you run some kind of > >>>>>>coverage report on this? > >>>>>I successfully ran the jdk_lang jtreg tests which contain several tests > >>>>>for annotations. > >>>>I'm a bit worried these tests doesn't cover annotations + class redefine. > >>>>But I might be persuaded to have more extensive testing as a follow up as > >>>>well. > >>>> > >>>>cheers > >>>>/Joel > > >