11/*
2- * Copyright (c) 2007, 2024 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2007, 2025 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
2525
2626package com .sun .tools .javap ;
2727
28- import java .lang .reflect .AccessFlag ;
29- import java .net .URI ;
30- import java .text .DateFormat ;
31- import java .util .Collection ;
32- import java .util .Date ;
33- import java .util .EnumSet ;
34- import java .util .List ;
35- import java .util .Set ;
36-
37- import java .lang .constant .ClassDesc ;
38- import java .lang .reflect .Modifier ;
39- import java .util .ArrayList ;
40- import java .util .LinkedHashSet ;
4128import java .lang .classfile .AccessFlags ;
4229import java .lang .classfile .Attributes ;
43- import java .lang .classfile .ClassModel ;
44- import java .lang .classfile .ClassSignature ;
4530import java .lang .classfile .ClassFile ;
46- import static java .lang .classfile .ClassFile .*;
4731import java .lang .classfile .ClassHierarchyResolver ;
48- import java .lang .classfile .constantpool .*;
32+ import java .lang .classfile .ClassModel ;
33+ import java .lang .classfile .ClassSignature ;
4934import java .lang .classfile .FieldModel ;
5035import java .lang .classfile .MethodModel ;
5136import java .lang .classfile .MethodSignature ;
5237import java .lang .classfile .Signature ;
5338import java .lang .classfile .attribute .CodeAttribute ;
5439import 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 ;
48+ import java .text .DateFormat ;
49+ import java .util .ArrayList ;
50+ import java .util .Collection ;
51+ import java .util .Date ;
52+ import java .util .EnumSet ;
53+ import java .util .LinkedHashSet ;
54+ import java .util .List ;
55+ import java .util .Set ;
56+
57+ import static java .lang .classfile .ClassFile .*;
5558
5659/*
5760 * The main javap class to write the contents of a class file as text.
@@ -112,6 +115,16 @@ protected void setMethod(MethodModel m) {
112115 method = m ;
113116 }
114117
118+ protected ClassFileFormatVersion cffv () {
119+ var major = classModel .majorVersion ();
120+ if (major < JAVA_1_VERSION || major > ClassFile .latestMajorVersion ())
121+ return null ;
122+ if (major >= JAVA_12_VERSION && classModel .minorVersion () != 0 ) {
123+ return null ;
124+ }
125+ return ClassFileFormatVersion .fromMajor (major );
126+ }
127+
115128 public boolean write (ClassModel cm ) {
116129 errorReported = false ;
117130 setClassFile (cm );
@@ -249,7 +262,7 @@ public boolean write(ClassModel cm) {
249262 println ("}" );
250263
251264 if (options .verbose ) {
252- attrWriter .write (classModel .attributes ());
265+ attrWriter .write (classModel .attributes (), cffv () );
253266 }
254267
255268 if (options .verify ) {
@@ -266,10 +279,10 @@ public boolean write(ClassModel cm) {
266279 }
267280 // where
268281
269- private static final ClassFile VERIFIER = ClassFile .of (ClassFile . ClassHierarchyResolverOption .of (
282+ private static final ClassFile VERIFIER = ClassFile .of (ClassHierarchyResolverOption .of (
270283 ClassHierarchyResolver .defaultResolver ().orElse (new ClassHierarchyResolver () {
271284 @ Override
272- public ClassHierarchyResolver . ClassHierarchyInfo getClassInfo (ClassDesc classDesc ) {
285+ public ClassHierarchyInfo getClassInfo (ClassDesc classDesc ) {
273286 // mark all unresolved classes as interfaces to exclude them from assignability verification
274287 return ClassHierarchyInfo .ofInterface ();
275288 }
@@ -419,7 +432,7 @@ protected void writeField(FieldModel f) {
419432 return ;
420433
421434 var flags = f .flags ();
422- writeModifiers (flagsReportUnknown (flags ).stream ().filter (fl -> fl .sourceModifier ())
435+ writeModifiers (flagsReportUnknown (flags , cffv () ).stream ().filter (fl -> fl .sourceModifier ())
423436 .map (fl -> Modifier .toString (fl .mask ())).toList ());
424437 print (() -> sigPrinter .print (
425438 f .findAttribute (Attributes .signature ())
@@ -448,11 +461,11 @@ protected void writeField(FieldModel f) {
448461
449462 if (options .verbose )
450463 writeList (String .format ("flags: (0x%04x) " , flags .flagsMask ()),
451- flagsReportUnknown (flags ).stream ().map (fl -> "ACC_" + fl .name ()).toList (),
464+ flagsReportUnknown (flags , cffv () ).stream ().map (fl -> "ACC_" + fl .name ()).toList (),
452465 "\n " );
453466
454467 if (options .showAllAttrs ) {
455- attrWriter .write (f .attributes ());
468+ attrWriter .write (f .attributes (), cffv () );
456469 showBlank = true ;
457470 }
458471
@@ -480,7 +493,7 @@ protected void writeMethod(MethodModel m) {
480493 int flags = m .flags ().flagsMask ();
481494
482495 var modifiers = new ArrayList <String >();
483- for (var f : flagsReportUnknown (m .flags ()))
496+ for (var f : flagsReportUnknown (m .flags (), cffv () ))
484497 if (f .sourceModifier ()) modifiers .add (Modifier .toString (f .mask ()));
485498
486499 String name = "???" ;
@@ -563,7 +576,7 @@ protected void writeMethod(MethodModel m) {
563576 StringBuilder sb = new StringBuilder ();
564577 String sep = "" ;
565578 sb .append (String .format ("flags: (0x%04x) " , flags ));
566- for (var f : flagsReportUnknown (m .flags ())) {
579+ for (var f : flagsReportUnknown (m .flags (), cffv () )) {
567580 sb .append (sep ).append ("ACC_" ).append (f .name ());
568581 sep = ", " ;
569582 }
@@ -573,7 +586,7 @@ protected void writeMethod(MethodModel m) {
573586 var code = (CodeAttribute )m .code ().orElse (null );
574587
575588 if (options .showAllAttrs ) {
576- attrWriter .write (m .attributes ());
589+ attrWriter .write (m .attributes (), cffv () );
577590 } else if (code != null && options .showDisassembled ) {
578591 codeWriter .writeMinimal (code );
579592 }
@@ -786,7 +799,7 @@ else switch (c) {
786799 }
787800
788801 private Set <String > getClassModifiers (AccessFlags flags ) {
789- var flagSet = flagsReportUnknown (flags );
802+ var flagSet = flagsReportUnknown (flags , cffv () );
790803 Set <AccessFlag > set ;
791804 if (flagSet .contains (AccessFlag .INTERFACE )) {
792805 set = EnumSet .copyOf (flagSet );
@@ -797,18 +810,18 @@ private Set<String> getClassModifiers(AccessFlags flags) {
797810 return getModifiers (set );
798811 }
799812
800- private static Set <String > getModifiers (Set <java . lang . reflect . AccessFlag > flags ) {
813+ private static Set <String > getModifiers (Set <AccessFlag > flags ) {
801814 Set <String > s = new LinkedHashSet <>();
802815 for (var f : flags )
803816 if (f .sourceModifier ()) s .add (Modifier .toString (f .mask ()));
804817 return s ;
805818 }
806819
807820 private Set <String > getClassFlags (AccessFlags flags ) {
808- return getFlags (flags .flagsMask (), flagsReportUnknown (flags ));
821+ return getFlags (flags .flagsMask (), flagsReportUnknown (flags , cffv () ));
809822 }
810823
811- private static Set <String > getFlags (int mask , Set <java . lang . reflect . AccessFlag > flags ) {
824+ private static Set <String > getFlags (int mask , Set <AccessFlag > flags ) {
812825 Set <String > s = new LinkedHashSet <>();
813826 for (var f : flags ) {
814827 s .add ("ACC_" + f .name ());
0 commit comments