On Sun, 31 Jul 2022 22:05:15 GMT, David Holmes <dhol...@openjdk.org> wrote:
>> Please review this change to fix JDK-8291360. This fix adds entry points >> getClassFileVersion() and getClassAccessFlagsRaw() to class java.lang.Class. >> The new entry points return the current class's class file version and its >> raw access flags. >> >> The fix was tested by running Mach5 tiers 1-2 on Linux, Mac OS, and Windows, >> and Mach5 tiers 1-3 on Linux x64. Additionally, the JCK lang, vm, and api >> tests and new regression tests were run locally on Linux x64. >> >> Thanks, Harold > > src/hotspot/share/prims/jvm.cpp line 4064: > >> 4062: assert(c->is_instance_klass(), "must be"); >> 4063: InstanceKlass* ik = InstanceKlass::cast(c); >> 4064: return (ik->minor_version() << 16) | ik->major_version(); > > I'm curious why the format is minor:major rather than major:minor ? This was requested by @RogerRiggs Major high vs low bits requires either: High bits: val >>>16 Low bits: val & 0xffff Except for preview, the minor version is 0, so putting major version in the low bits allows trivial comparison (without masking); but may lead to bugs due to carelessness. > src/java.base/share/classes/java/lang/Class.java line 4698: > >> 4696: * >> 4697: * If the class is an array type then the access flags of the >> component type is >> 4698: * returned. If the class is a primitive then ACC_ABSTRACT | >> ACC_FINAL | ACC_PUBLIC. > > The `ACC_ABSTRACT` seems odd - is that way of indicating this "class" can't > be instantiated? Is there some spec document that explains this choice? I don't know why API's such as JVM_GetClassModifiers() and JVM_GetClassAccessFlags return ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC for primitives. Nor could I find a spec that discussed access flags for primitives. But, I didn't want to change what's been returned for primitives in existing code. > test/hotspot/jtreg/runtime/ClassFile/ClassFileVersionTest.java line 31: > >> 29: * @modules java.base/java.lang:open >> 30: * @compile classFileVersions.jcod >> 31: * @run main/othervm --enable-preview ClassFileVersionTest > > What preview feature is being used here? No preview feature is being used but --enable-preview is needed here for the JVM to accept a class with a minor version of 65535. ------------- PR: https://git.openjdk.org/jdk/pull/9688