Skip to content

Commit ee3665b

Browse files
committed
8364187: Make getClassAccessFlagsRaw non-native
Reviewed-by: thartmann, rriggs, liach
1 parent 2ba8a06 commit ee3665b

File tree

16 files changed

+92
-67
lines changed

16 files changed

+92
-67
lines changed

src/hotspot/share/classfile/javaClasses.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,7 @@ int java_lang_Class::_classRedefinedCount_offset;
870870
int java_lang_Class::_reflectionData_offset;
871871
int java_lang_Class::_modifiers_offset;
872872
int java_lang_Class::_is_primitive_offset;
873+
int java_lang_Class::_raw_access_flags_offset;
873874

874875
bool java_lang_Class::_offsets_computed = false;
875876
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = nullptr;
@@ -1073,6 +1074,10 @@ void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protecti
10731074
// Set the modifiers flag.
10741075
u2 computed_modifiers = k->compute_modifier_flags();
10751076
set_modifiers(mirror(), computed_modifiers);
1077+
// Set the raw access_flags, this is used by reflection instead of modifier flags.
1078+
// The Java code for array classes gets the access flags from the element type.
1079+
assert(!k->is_array_klass() || k->access_flags().as_unsigned_short() == 0, "access flags are not set for arrays");
1080+
set_raw_access_flags(mirror(), k->access_flags().as_unsigned_short());
10761081

10771082
InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
10781083
assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
@@ -1378,6 +1383,8 @@ oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, Basic
13781383
assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
13791384
#endif
13801385
set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1386+
set_raw_access_flags(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1387+
13811388
set_is_primitive(java_class);
13821389
return java_class;
13831390
}
@@ -1519,6 +1526,7 @@ oop java_lang_Class::primitive_mirror(BasicType t) {
15191526
macro(_reflectionData_offset, k, "reflectionData", java_lang_ref_SoftReference_signature, false); \
15201527
macro(_signers_offset, k, "signers", object_array_signature, false); \
15211528
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), char_signature, false); \
1529+
macro(_raw_access_flags_offset, k, "classFileAccessFlags", char_signature, false); \
15221530
macro(_protection_domain_offset, k, "protectionDomain", java_security_ProtectionDomain_signature, false); \
15231531
macro(_is_primitive_offset, k, "primitive", bool_signature, false);
15241532

@@ -1564,6 +1572,16 @@ void java_lang_Class::set_modifiers(oop the_class_mirror, u2 value) {
15641572
the_class_mirror->char_field_put(_modifiers_offset, value);
15651573
}
15661574

1575+
int java_lang_Class::raw_access_flags(oop the_class_mirror) {
1576+
assert(_raw_access_flags_offset != 0, "offsets should have been initialized");
1577+
return the_class_mirror->char_field(_raw_access_flags_offset);
1578+
}
1579+
1580+
void java_lang_Class::set_raw_access_flags(oop the_class_mirror, u2 value) {
1581+
assert(_raw_access_flags_offset != 0, "offsets should have been initialized");
1582+
the_class_mirror->char_field_put(_raw_access_flags_offset, value);
1583+
}
1584+
15671585

15681586
// Note: JDK1.1 and before had a privateInfo_offset field which was used for the
15691587
// platform thread structure, and a eetop offset which was used for thread

src/hotspot/share/classfile/javaClasses.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ class java_lang_Class : AllStatic {
258258
static int _reflectionData_offset;
259259
static int _modifiers_offset;
260260
static int _is_primitive_offset;
261+
static int _raw_access_flags_offset;
261262

262263
static bool _offsets_computed;
263264

@@ -342,6 +343,9 @@ class java_lang_Class : AllStatic {
342343
static int modifiers(oop java_class);
343344
static void set_modifiers(oop java_class, u2 value);
344345

346+
static int raw_access_flags(oop java_class);
347+
static void set_raw_access_flags(oop java_class, u2 value);
348+
345349
static size_t oop_size(oop java_class);
346350
static void set_oop_size(HeapWord* java_class, size_t size);
347351
static int static_oop_field_count(oop java_class);

src/hotspot/share/classfile/vmIntrinsics.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,6 @@ class methodHandle;
314314
do_intrinsic(_Class_cast, java_lang_Class, Class_cast_name, object_object_signature, F_R) \
315315
do_name( Class_cast_name, "cast") \
316316
\
317-
do_intrinsic(_getClassAccessFlags, reflect_Reflection, getClassAccessFlags_name, class_int_signature, F_SN) \
318-
do_name( getClassAccessFlags_name, "getClassAccessFlags") \
319317
do_intrinsic(_getLength, java_lang_reflect_Array, getLength_name, object_int_signature, F_SN) \
320318
do_name( getLength_name, "getLength") \
321319
\

src/hotspot/share/opto/c2compiler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ bool C2Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
760760
case vmIntrinsics::_isInstance:
761761
case vmIntrinsics::_isHidden:
762762
case vmIntrinsics::_getSuperclass:
763-
case vmIntrinsics::_getClassAccessFlags:
764763
case vmIntrinsics::_floatToRawIntBits:
765764
case vmIntrinsics::_floatToIntBits:
766765
case vmIntrinsics::_intBitsToFloat:

src/hotspot/share/opto/library_call.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,7 @@ bool LibraryCallKit::try_to_inline(int predicate) {
519519

520520
case vmIntrinsics::_isInstance:
521521
case vmIntrinsics::_isHidden:
522-
case vmIntrinsics::_getSuperclass:
523-
case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id());
522+
case vmIntrinsics::_getSuperclass: return inline_native_Class_query(intrinsic_id());
524523

525524
case vmIntrinsics::_floatToRawIntBits:
526525
case vmIntrinsics::_floatToIntBits:
@@ -4007,10 +4006,6 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
40074006
prim_return_value = null();
40084007
return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR);
40094008
break;
4010-
case vmIntrinsics::_getClassAccessFlags:
4011-
prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
4012-
return_type = TypeInt::CHAR;
4013-
break;
40144009
default:
40154010
fatal_unexpected_iid(id);
40164011
break;
@@ -4106,11 +4101,6 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
41064101
}
41074102
break;
41084103

4109-
case vmIntrinsics::_getClassAccessFlags:
4110-
p = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset()));
4111-
query_value = make_load(nullptr, p, TypeInt::CHAR, T_CHAR, MemNode::unordered);
4112-
break;
4113-
41144104
default:
41154105
fatal_unexpected_iid(id);
41164106
break;

src/hotspot/share/opto/memnode.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,13 +1981,11 @@ LoadNode::load_array_final_field(const TypeKlassPtr *tkls,
19811981
"must not happen");
19821982
if (tkls->offset() == in_bytes(Klass::access_flags_offset())) {
19831983
// The field is Klass::_access_flags. Return its (constant) value.
1984-
// (Folds up the 2nd indirection in Reflection.getClassAccessFlags(aClassConstant).)
19851984
assert(Opcode() == Op_LoadUS, "must load an unsigned short from _access_flags");
19861985
return TypeInt::make(klass->access_flags());
19871986
}
19881987
if (tkls->offset() == in_bytes(Klass::misc_flags_offset())) {
19891988
// The field is Klass::_misc_flags. Return its (constant) value.
1990-
// (Folds up the 2nd indirection in Reflection.getClassAccessFlags(aClassConstant).)
19911989
assert(Opcode() == Op_LoadUB, "must load an unsigned byte from _misc_flags");
19921990
return TypeInt::make(klass->misc_flags());
19931991
}

src/hotspot/share/prims/jvm.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,19 +1741,6 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofC
17411741
}
17421742
JVM_END
17431743

1744-
JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1745-
{
1746-
oop mirror = JNIHandles::resolve_non_null(cls);
1747-
if (java_lang_Class::is_primitive(mirror)) {
1748-
// Primitive type
1749-
return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1750-
}
1751-
1752-
Klass* k = java_lang_Class::as_Klass(mirror);
1753-
return k->access_flags().as_class_flags();
1754-
}
1755-
JVM_END
1756-
17571744
JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
17581745
{
17591746
Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));

src/java.base/share/classes/java/lang/Class.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ private static void runtimeSetup() {
240240
* This constructor is not used and prevents the default constructor being
241241
* generated.
242242
*/
243-
private Class(ClassLoader loader, Class<?> arrayComponentType, char mods, ProtectionDomain pd, boolean isPrim) {
243+
private Class(ClassLoader loader, Class<?> arrayComponentType, char mods, ProtectionDomain pd, boolean isPrim, char flags) {
244244
// Initialize final field for classLoader. The initialization value of non-null
245245
// prevents future JIT optimizations from assuming this final field is null.
246246
// The following assignments are done directly by the VM without calling this constructor.
@@ -249,6 +249,7 @@ private Class(ClassLoader loader, Class<?> arrayComponentType, char mods, Protec
249249
modifiers = mods;
250250
protectionDomain = pd;
251251
primitive = isPrim;
252+
classFileAccessFlags = flags;
252253
}
253254

254255
/**
@@ -1012,6 +1013,7 @@ public Module getModule() {
10121013
private transient Object classData; // Set by VM
10131014
private transient Object[] signers; // Read by VM, mutable
10141015
private final transient char modifiers; // Set by the VM
1016+
private final transient char classFileAccessFlags; // Set by the VM
10151017
private final transient boolean primitive; // Set by the VM if the Class is a primitive type.
10161018

10171019
// package-private
@@ -1383,13 +1385,13 @@ public Set<AccessFlag> accessFlags() {
13831385
// Location.CLASS allows SUPER and AccessFlag.MODULE which
13841386
// INNER_CLASS forbids. INNER_CLASS allows PRIVATE, PROTECTED,
13851387
// and STATIC, which are not allowed on Location.CLASS.
1386-
// Use getClassAccessFlagsRaw to expose SUPER status.
1388+
// Use getClassFileAccessFlags to expose SUPER status.
13871389
var location = (isMemberClass() || isLocalClass() ||
13881390
isAnonymousClass() || isArray()) ?
13891391
AccessFlag.Location.INNER_CLASS :
13901392
AccessFlag.Location.CLASS;
13911393
return getReflectionFactory().parseAccessFlags((location == AccessFlag.Location.CLASS) ?
1392-
getClassAccessFlagsRaw() : getModifiers(), location, this);
1394+
getClassFileAccessFlags() : getModifiers(), location, this);
13931395
}
13941396

13951397
/**
@@ -4134,17 +4136,16 @@ int getClassFileVersion() {
41344136

41354137
private native int getClassFileVersion0();
41364138

4137-
/*
4138-
* Return the access flags as they were in the class's bytecode, including
4139-
* the original setting of ACC_SUPER.
4140-
*
4141-
* If the class is an array type then the access flags of the element type is
4142-
* returned. If the class is a primitive then ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC.
4143-
*/
4144-
private int getClassAccessFlagsRaw() {
4145-
Class<?> c = isArray() ? elementType() : this;
4146-
return c.getClassAccessFlagsRaw0();
4147-
}
4148-
4149-
private native int getClassAccessFlagsRaw0();
4139+
/**
4140+
* Return the access flags as they were in the class's bytecode, including
4141+
* the original setting of ACC_SUPER.
4142+
*
4143+
* If this {@code Class} object represents a primitive type or
4144+
* void, the flags are {@code PUBLIC}, {@code ABSTRACT}, and
4145+
* {@code FINAL}.
4146+
* If this {@code Class} object represents an array type, return 0.
4147+
*/
4148+
int getClassFileAccessFlags() {
4149+
return classFileAccessFlags;
4150+
}
41504151
}

src/java.base/share/classes/java/lang/System.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,9 @@ public byte[] getRawClassTypeAnnotations(Class<?> klass) {
20222022
public byte[] getRawExecutableTypeAnnotations(Executable executable) {
20232023
return Class.getExecutableTypeAnnotationBytes(executable);
20242024
}
2025+
public int getClassFileAccessFlags(Class<?> klass) {
2026+
return klass.getClassFileAccessFlags();
2027+
}
20252028
public <E extends Enum<E>>
20262029
E[] getEnumConstantsShared(Class<E> klass) {
20272030
return klass.getEnumConstantsShared();

src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ public interface JavaLangAccess {
112112
*/
113113
byte[] getRawExecutableTypeAnnotations(Executable executable);
114114

115+
/**
116+
* Get the int value of the Class's class-file access flags.
117+
*/
118+
int getClassFileAccessFlags(Class<?> klass);
119+
115120
/**
116121
* Returns the elements of an enum class or null if the
117122
* Class object does not represent an enum type;

0 commit comments

Comments
 (0)