src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java

Print this page
rev 2609 : 8065132: Parameter annotations not updated when synthetic parameters are prepended
Summary: Cause javac to add synthetic parameters to Runtime[In]VisibleParameterAnnotations attributes
Reviewed-by: jjg, jfranck


 653                     ((int) s.flags() & (FINAL | SYNTHETIC | MANDATED)) |
 654                     ((int) m.flags() & SYNTHETIC);
 655                 databuf.appendChar(pool.put(s.name));
 656                 databuf.appendChar(flags);
 657             }
 658             // Now write the captured locals
 659             for (VarSymbol s : m.capturedLocals) {
 660                 final int flags =
 661                     ((int) s.flags() & (FINAL | SYNTHETIC | MANDATED)) |
 662                     ((int) m.flags() & SYNTHETIC);
 663                 databuf.appendChar(pool.put(s.name));
 664                 databuf.appendChar(flags);
 665             }
 666             endAttr(attrIndex);
 667             return 1;
 668         } else
 669             return 0;
 670     }
 671 
 672 





















 673     /** Write method parameter annotations;
 674      *  return number of attributes written.
 675      */
 676     int writeParameterAttrs(MethodSymbol m) {
 677         boolean hasVisible = false;
 678         boolean hasInvisible = false;
 679         if (m.params != null) {
 680             for (VarSymbol s : m.params) {
 681                 for (Attribute.Compound a : s.getRawAttributes()) {
 682                     switch (types.getRetention(a)) {
 683                     case SOURCE: break;
 684                     case CLASS: hasInvisible = true; break;
 685                     case RUNTIME: hasVisible = true; break;
 686                     default: ;// /* fail soft */ throw new AssertionError(vis);
 687                     }
 688                 }
 689             }
 690         }
 691 
 692         int attrCount = 0;
 693         if (hasVisible) {
 694             int attrIndex = writeAttr(names.RuntimeVisibleParameterAnnotations);
 695             databuf.appendByte(m.params.length());
 696             for (VarSymbol s : m.params) {
 697                 ListBuffer<Attribute.Compound> buf = new ListBuffer<Attribute.Compound>();
 698                 for (Attribute.Compound a : s.getRawAttributes())
 699                     if (types.getRetention(a) == RetentionPolicy.RUNTIME)
 700                         buf.append(a);
 701                 databuf.appendChar(buf.length());
 702                 for (Attribute.Compound a : buf)
 703                     writeCompoundAttribute(a);
 704             }
 705             endAttr(attrIndex);
 706             attrCount++;
 707         }
 708         if (hasInvisible) {
 709             int attrIndex = writeAttr(names.RuntimeInvisibleParameterAnnotations);
 710             databuf.appendByte(m.params.length());
 711             for (VarSymbol s : m.params) {
 712                 ListBuffer<Attribute.Compound> buf = new ListBuffer<Attribute.Compound>();
 713                 for (Attribute.Compound a : s.getRawAttributes())
 714                     if (types.getRetention(a) == RetentionPolicy.CLASS)
 715                         buf.append(a);
 716                 databuf.appendChar(buf.length());
 717                 for (Attribute.Compound a : buf)
 718                     writeCompoundAttribute(a);
 719             }
 720             endAttr(attrIndex);
 721             attrCount++;
 722         }
 723         return attrCount;
 724     }
 725 
 726 /**********************************************************************
 727  * Writing Java-language annotations (aka metadata, attributes)
 728  **********************************************************************/
 729 
 730     /** Write Java-language annotations; return number of JVM
 731      *  attributes written (zero or one).
 732      */
 733     int writeJavaAnnotations(List<Attribute.Compound> attrs) {
 734         if (attrs.isEmpty()) return 0;
 735         ListBuffer<Attribute.Compound> visibles = new ListBuffer<Attribute.Compound>();
 736         ListBuffer<Attribute.Compound> invisibles = new ListBuffer<Attribute.Compound>();
 737         for (Attribute.Compound a : attrs) {
 738             switch (types.getRetention(a)) {
 739             case SOURCE: break;




 653                     ((int) s.flags() & (FINAL | SYNTHETIC | MANDATED)) |
 654                     ((int) m.flags() & SYNTHETIC);
 655                 databuf.appendChar(pool.put(s.name));
 656                 databuf.appendChar(flags);
 657             }
 658             // Now write the captured locals
 659             for (VarSymbol s : m.capturedLocals) {
 660                 final int flags =
 661                     ((int) s.flags() & (FINAL | SYNTHETIC | MANDATED)) |
 662                     ((int) m.flags() & SYNTHETIC);
 663                 databuf.appendChar(pool.put(s.name));
 664                 databuf.appendChar(flags);
 665             }
 666             endAttr(attrIndex);
 667             return 1;
 668         } else
 669             return 0;
 670     }
 671 
 672 
 673     private void writeParamAnnotations(List<VarSymbol> params,
 674                                        RetentionPolicy retention) {
 675         for (VarSymbol s : params) {
 676             ListBuffer<Attribute.Compound> buf = new ListBuffer<>();
 677             for (Attribute.Compound a : s.getRawAttributes())
 678                 if (types.getRetention(a) == retention)
 679                     buf.append(a);
 680             databuf.appendChar(buf.length());
 681             for (Attribute.Compound a : buf)
 682                 writeCompoundAttribute(a);
 683         }
 684 
 685     }
 686 
 687     private void writeParamAnnotations(MethodSymbol m,
 688                                        RetentionPolicy retention) {
 689         databuf.appendByte(m.params.length() + m.extraParams.length());
 690         writeParamAnnotations(m.extraParams, retention);
 691         writeParamAnnotations(m.params, retention);
 692     }
 693 
 694     /** Write method parameter annotations;
 695      *  return number of attributes written.
 696      */
 697     int writeParameterAttrs(MethodSymbol m) {
 698         boolean hasVisible = false;
 699         boolean hasInvisible = false;
 700         if (m.params != null) {
 701             for (VarSymbol s : m.params) {
 702                 for (Attribute.Compound a : s.getRawAttributes()) {
 703                     switch (types.getRetention(a)) {
 704                     case SOURCE: break;
 705                     case CLASS: hasInvisible = true; break;
 706                     case RUNTIME: hasVisible = true; break;
 707                     default: ;// /* fail soft */ throw new AssertionError(vis);
 708                     }
 709                 }
 710             }
 711         }
 712 
 713         int attrCount = 0;
 714         if (hasVisible) {
 715             int attrIndex = writeAttr(names.RuntimeVisibleParameterAnnotations);
 716             writeParamAnnotations(m, RetentionPolicy.RUNTIME);









 717             endAttr(attrIndex);
 718             attrCount++;
 719         }
 720         if (hasInvisible) {
 721             int attrIndex = writeAttr(names.RuntimeInvisibleParameterAnnotations);
 722             writeParamAnnotations(m, RetentionPolicy.CLASS);









 723             endAttr(attrIndex);
 724             attrCount++;
 725         }
 726         return attrCount;
 727     }
 728 
 729 /**********************************************************************
 730  * Writing Java-language annotations (aka metadata, attributes)
 731  **********************************************************************/
 732 
 733     /** Write Java-language annotations; return number of JVM
 734      *  attributes written (zero or one).
 735      */
 736     int writeJavaAnnotations(List<Attribute.Compound> attrs) {
 737         if (attrs.isEmpty()) return 0;
 738         ListBuffer<Attribute.Compound> visibles = new ListBuffer<Attribute.Compound>();
 739         ListBuffer<Attribute.Compound> invisibles = new ListBuffer<Attribute.Compound>();
 740         for (Attribute.Compound a : attrs) {
 741             switch (types.getRetention(a)) {
 742             case SOURCE: break;