< prev index next >

src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java

Print this page

  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package com.sun.tools.javap;
 27 


 28 import java.lang.classfile.AccessFlags;
 29 import java.lang.classfile.Attributes;
 30 import java.lang.classfile.ClassFile;
 31 import java.lang.classfile.ClassHierarchyResolver;
 32 import java.lang.classfile.ClassModel;
 33 import java.lang.classfile.ClassSignature;
 34 import java.lang.classfile.FieldModel;
 35 import java.lang.classfile.MethodModel;
 36 import java.lang.classfile.MethodSignature;
 37 import java.lang.classfile.Signature;
 38 import java.lang.classfile.attribute.CodeAttribute;
 39 import java.lang.classfile.attribute.SignatureAttribute;
 40 import java.lang.classfile.constantpool.ClassEntry;
 41 import java.lang.classfile.constantpool.ConstantValueEntry;
 42 import java.lang.classfile.constantpool.PoolEntry;
 43 import java.lang.constant.ClassDesc;
 44 import java.lang.reflect.AccessFlag;
 45 import java.lang.reflect.ClassFileFormatVersion;
 46 import java.lang.reflect.Modifier;
 47 import java.net.URI;

147                     println("Last modified " + df.format(lm));
148                 }
149             } else if (size > 0) {
150                 println("Size " + size + " bytes");
151             }
152             if (digestName != null && digest != null) {
153                 StringBuilder sb = new StringBuilder();
154                 for (byte b: digest)
155                     sb.append(String.format("%02x", b));
156                 println(digestName + " checksum " + sb);
157             }
158         }
159 
160         cm.findAttribute(Attributes.sourceFile()).ifPresent(sfa ->
161             println("Compiled from \"" + sfa.sourceFile().stringValue() + "\""));
162 
163         if (options.sysInfo || options.verbose) {
164             indent(-1);
165         }
166 
167         writeModifiers(getClassModifiers(cm.flags()));
168 
169         if ((classModel.flags().flagsMask() & ACC_MODULE) != 0) {
170             var attr = classModel.findAttribute(Attributes.module());
171             if (attr.isPresent()) {
172                 var modAttr = attr.get();
173                 if ((modAttr.moduleFlagsMask() & ACC_OPEN) != 0) {
174                     print("open ");
175                 }
176                 print("module ");
177                 print(() -> modAttr.moduleName().name().stringValue());
178                 if (modAttr.moduleVersion().isPresent()) {
179                     print("@");
180                     print(() -> modAttr.moduleVersion().get().stringValue());
181                 }
182             } else {
183                 // fallback for malformed class files
184                 print("class ");
185                 print(() -> getJavaName(classModel.thisClass().asInternalName()));
186             }
187         } else {

793             case '\r': return "\\r";
794             case '\\': return "\\\\";
795             case '\'': return "\\'";
796             case '\"': return "\\\"";
797             default:   return String.format("\\u%04x", (int) c);
798         }
799     }
800 
801     private Set<String> getClassModifiers(AccessFlags flags) {
802         var flagSet = flagsReportUnknown(flags, cffv());
803         Set<AccessFlag> set;
804         if (flagSet.contains(AccessFlag.INTERFACE)) {
805             set = EnumSet.copyOf(flagSet);
806             set.remove(AccessFlag.ABSTRACT);
807         } else {
808             set = flagSet;
809         }
810         return getModifiers(set);
811     }
812 














813     private static Set<String> getModifiers(Set<AccessFlag> flags) {
814         Set<String> s = new LinkedHashSet<>();
815         for (var f : flags)
816             if (f.sourceModifier()) s.add(Modifier.toString(f.mask()));
817         return s;
818     }
819 
820     private Set<String> getClassFlags(AccessFlags flags) {
821         return getFlags(flags.flagsMask(), flagsReportUnknown(flags, cffv()));
822     }
823 
824     private static Set<String> getFlags(int mask, Set<AccessFlag> flags) {
825         Set<String> s = new LinkedHashSet<>();
826         for (var f: flags) {
827             s.add("ACC_" + f.name());
828             mask = mask & ~f.mask();
829         }
830         while (mask != 0) {
831             int bit = Integer.highestOneBit(mask);
832             s.add("0x" + Integer.toHexString(bit));

  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package com.sun.tools.javap;
 27 
 28 import com.sun.tools.javac.code.Source;
 29 
 30 import java.lang.classfile.AccessFlags;
 31 import java.lang.classfile.Attributes;
 32 import java.lang.classfile.ClassFile;
 33 import java.lang.classfile.ClassHierarchyResolver;
 34 import java.lang.classfile.ClassModel;
 35 import java.lang.classfile.ClassSignature;
 36 import java.lang.classfile.FieldModel;
 37 import java.lang.classfile.MethodModel;
 38 import java.lang.classfile.MethodSignature;
 39 import java.lang.classfile.Signature;
 40 import java.lang.classfile.attribute.CodeAttribute;
 41 import java.lang.classfile.attribute.SignatureAttribute;
 42 import java.lang.classfile.constantpool.ClassEntry;
 43 import java.lang.classfile.constantpool.ConstantValueEntry;
 44 import java.lang.classfile.constantpool.PoolEntry;
 45 import java.lang.constant.ClassDesc;
 46 import java.lang.reflect.AccessFlag;
 47 import java.lang.reflect.ClassFileFormatVersion;
 48 import java.lang.reflect.Modifier;
 49 import java.net.URI;

149                     println("Last modified " + df.format(lm));
150                 }
151             } else if (size > 0) {
152                 println("Size " + size + " bytes");
153             }
154             if (digestName != null && digest != null) {
155                 StringBuilder sb = new StringBuilder();
156                 for (byte b: digest)
157                     sb.append(String.format("%02x", b));
158                 println(digestName + " checksum " + sb);
159             }
160         }
161 
162         cm.findAttribute(Attributes.sourceFile()).ifPresent(sfa ->
163             println("Compiled from \"" + sfa.sourceFile().stringValue() + "\""));
164 
165         if (options.sysInfo || options.verbose) {
166             indent(-1);
167         }
168 
169         writeModifiers(getClassModifiers(cm.flags(), classModel.majorVersion(), classModel.minorVersion()));
170 
171         if ((classModel.flags().flagsMask() & ACC_MODULE) != 0) {
172             var attr = classModel.findAttribute(Attributes.module());
173             if (attr.isPresent()) {
174                 var modAttr = attr.get();
175                 if ((modAttr.moduleFlagsMask() & ACC_OPEN) != 0) {
176                     print("open ");
177                 }
178                 print("module ");
179                 print(() -> modAttr.moduleName().name().stringValue());
180                 if (modAttr.moduleVersion().isPresent()) {
181                     print("@");
182                     print(() -> modAttr.moduleVersion().get().stringValue());
183                 }
184             } else {
185                 // fallback for malformed class files
186                 print("class ");
187                 print(() -> getJavaName(classModel.thisClass().asInternalName()));
188             }
189         } else {

795             case '\r': return "\\r";
796             case '\\': return "\\\\";
797             case '\'': return "\\'";
798             case '\"': return "\\\"";
799             default:   return String.format("\\u%04x", (int) c);
800         }
801     }
802 
803     private Set<String> getClassModifiers(AccessFlags flags) {
804         var flagSet = flagsReportUnknown(flags, cffv());
805         Set<AccessFlag> set;
806         if (flagSet.contains(AccessFlag.INTERFACE)) {
807             set = EnumSet.copyOf(flagSet);
808             set.remove(AccessFlag.ABSTRACT);
809         } else {
810             set = flagSet;
811         }
812         return getModifiers(set);
813     }
814 
815     private Set<String> getClassModifiers(AccessFlags flags, int majorVersion, int minorVersion) {
816         boolean previewClassFile = minorVersion == ClassFile.PREVIEW_MINOR_VERSION;
817         Set<AccessFlag> flagSet = flagsReportUnknown(flags, cffv());
818         if (flagSet.contains(AccessFlag.INTERFACE)) {
819             flagSet = EnumSet.copyOf(flagSet);
820             flagSet.remove(AccessFlag.ABSTRACT);
821         } else if (Source.isSupported(Source.Feature.VALUE_CLASSES, majorVersion) && previewClassFile) {
822             Set<String> classModifers = getModifiers(flagSet);
823             classModifers.add("value");
824             return classModifers;
825         }
826         return getModifiers(flagSet);
827     }
828 
829     private static Set<String> getModifiers(Set<AccessFlag> flags) {
830         Set<String> s = new LinkedHashSet<>();
831         for (var f : flags)
832             if (f.sourceModifier()) s.add(Modifier.toString(f.mask()));
833         return s;
834     }
835 
836     private Set<String> getClassFlags(AccessFlags flags) {
837         return getFlags(flags.flagsMask(), flagsReportUnknown(flags, cffv()));
838     }
839 
840     private static Set<String> getFlags(int mask, Set<AccessFlag> flags) {
841         Set<String> s = new LinkedHashSet<>();
842         for (var f: flags) {
843             s.add("ACC_" + f.name());
844             mask = mask & ~f.mask();
845         }
846         while (mask != 0) {
847             int bit = Integer.highestOneBit(mask);
848             s.add("0x" + Integer.toHexString(bit));
< prev index next >