Skip to content

Commit 2425584

Browse files
committed
8367142: Avoid InstanceKlass::cast when converting java mirror to InstanceKlass
Reviewed-by: dholmes, coleenp
1 parent 64155df commit 2425584

File tree

15 files changed

+80
-101
lines changed

15 files changed

+80
-101
lines changed

src/hotspot/share/cds/aotMetaspace.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ void AOTMetaspace::link_all_loaded_classes(JavaThread* current) {
785785
const GrowableArray<OopHandle>* mirrors = collect_classes.mirrors();
786786
for (int i = 0; i < mirrors->length(); i++) {
787787
OopHandle mirror = mirrors->at(i);
788-
InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(mirror.resolve()));
788+
InstanceKlass* ik = java_lang_Class::as_InstanceKlass(mirror.resolve());
789789
if (may_be_eagerly_linked(ik)) {
790790
has_linked |= try_link_class(current, ik);
791791
}
@@ -812,7 +812,7 @@ void AOTMetaspace::link_shared_classes(TRAPS) {
812812
const GrowableArray<OopHandle>* mirrors = collect_classes.mirrors();
813813
for (int i = 0; i < mirrors->length(); i++) {
814814
OopHandle mirror = mirrors->at(i);
815-
InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(mirror.resolve()));
815+
InstanceKlass* ik = java_lang_Class::as_InstanceKlass(mirror.resolve());
816816
AOTConstantPoolResolver::preresolve_string_cp_entries(ik, CHECK);
817817
}
818818
}

src/hotspot/share/cds/unregisteredClasses.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, T
9494
CHECK_NULL);
9595
assert(result.get_type() == T_OBJECT, "just checking");
9696

97-
return InstanceKlass::cast(java_lang_Class::as_Klass(result.get_oop()));
97+
return java_lang_Class::as_InstanceKlass(result.get_oop());
9898
}
9999

100100
bool UnregisteredClasses::check_for_exclusion(const InstanceKlass* k) {

src/hotspot/share/classfile/javaClasses.cpp

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {
990990
create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK);
991991
}
992992

993-
void java_lang_Class::initialize_mirror_fields(Klass* k,
993+
void java_lang_Class::initialize_mirror_fields(InstanceKlass* ik,
994994
Handle mirror,
995995
Handle protection_domain,
996996
Handle classData,
@@ -1005,7 +1005,7 @@ void java_lang_Class::initialize_mirror_fields(Klass* k,
10051005
set_protection_domain(mirror(), protection_domain());
10061006

10071007
// Initialize static fields
1008-
InstanceKlass::cast(k)->do_local_static_fields(&initialize_static_field, mirror, CHECK);
1008+
ik->do_local_static_fields(&initialize_static_field, mirror, CHECK);
10091009

10101010
// Set classData
10111011
set_class_data(mirror(), classData());
@@ -1111,8 +1111,7 @@ void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protecti
11111111
// and java_mirror in this klass.
11121112
} else {
11131113
assert(k->is_instance_klass(), "Must be");
1114-
1115-
initialize_mirror_fields(k, mirror, protection_domain, classData, THREAD);
1114+
initialize_mirror_fields(InstanceKlass::cast(k), mirror, protection_domain, classData, THREAD);
11161115
if (HAS_PENDING_EXCEPTION) {
11171116
// If any of the fields throws an exception like OOM remove the klass field
11181117
// from the mirror so GC doesn't follow it after the klass has been deallocated.
@@ -2590,7 +2589,7 @@ static void print_stack_element_to_stream(outputStream* st, Handle mirror, int m
25902589
ResourceMark rm;
25912590
stringStream ss;
25922591

2593-
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
2592+
InstanceKlass* holder = java_lang_Class::as_InstanceKlass(mirror());
25942593
const char* klass_name = holder->external_name();
25952594
char* method_name = name->as_C_string();
25962595
ss.print("\tat %s.%s(", klass_name, method_name);
@@ -2969,7 +2968,7 @@ void java_lang_Throwable::get_stack_trace_elements(int depth, Handle backtrace,
29692968
THROW(vmSymbols::java_lang_NullPointerException());
29702969
}
29712970

2972-
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));
2971+
InstanceKlass* holder = java_lang_Class::as_InstanceKlass(bte._mirror());
29732972
methodHandle method (THREAD, holder->method_with_orig_idnum(bte._method_id, bte._version));
29742973

29752974
java_lang_StackTraceElement::fill_in(stack_trace_element, holder,
@@ -3055,7 +3054,7 @@ bool java_lang_Throwable::get_top_method_and_bci(oop throwable, Method** method,
30553054
// Get first backtrace element.
30563055
BacktraceElement bte = iter.next(current);
30573056

3058-
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));
3057+
InstanceKlass* holder = java_lang_Class::as_InstanceKlass(bte._mirror());
30593058
assert(holder != nullptr, "first element should be non-null");
30603059
Method* m = holder->method_with_orig_idnum(bte._method_id, bte._version);
30613060

@@ -3441,11 +3440,11 @@ void java_lang_reflect_Method::serialize_offsets(SerializeClosure* f) {
34413440

34423441
Handle java_lang_reflect_Method::create(TRAPS) {
34433442
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3444-
Klass* klass = vmClasses::reflect_Method_klass();
3443+
InstanceKlass* klass = vmClasses::reflect_Method_klass();
34453444
// This class is eagerly initialized during VM initialization, since we keep a reference
34463445
// to one of the methods
3447-
assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized");
3448-
return InstanceKlass::cast(klass)->allocate_instance_handle(THREAD);
3446+
assert(klass->is_initialized(), "must be initialized");
3447+
return klass->allocate_instance_handle(THREAD);
34493448
}
34503449

34513450
oop java_lang_reflect_Method::clazz(oop reflect) {
@@ -3914,17 +3913,15 @@ void reflect_ConstantPool::set_cp(oop reflect, ConstantPool* value) {
39143913
}
39153914

39163915
ConstantPool* reflect_ConstantPool::get_cp(oop reflect) {
3917-
39183916
oop mirror = reflect->obj_field(_oop_offset);
3919-
Klass* k = java_lang_Class::as_Klass(mirror);
3920-
assert(k->is_instance_klass(), "Must be");
3917+
InstanceKlass* ik = java_lang_Class::as_InstanceKlass(mirror);
39213918

39223919
// Get the constant pool back from the klass. Since class redefinition
39233920
// merges the new constant pool into the old, this is essentially the
39243921
// same constant pool as the original. If constant pool merging is
39253922
// no longer done in the future, this will have to change to save
39263923
// the original.
3927-
return InstanceKlass::cast(k)->constants();
3924+
return ik->constants();
39283925
}
39293926

39303927

@@ -5531,7 +5528,7 @@ void JavaClasses::check_offsets() {
55315528
#endif // PRODUCT
55325529

55335530
int InjectedField::compute_offset() {
5534-
InstanceKlass* ik = InstanceKlass::cast(klass());
5531+
InstanceKlass* ik = klass();
55355532
for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
55365533
if (!may_be_java && !fs.field_flags().is_injected()) {
55375534
// Only look at injected fields

src/hotspot/share/classfile/javaClasses.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ class java_lang_Class : AllStatic {
269269
static void set_protection_domain(oop java_class, oop protection_domain);
270270
static void set_class_loader(oop java_class, oop class_loader);
271271
static void set_component_mirror(oop java_class, oop comp_mirror);
272-
static void initialize_mirror_fields(Klass* k, Handle mirror, Handle protection_domain,
272+
static void initialize_mirror_fields(InstanceKlass* ik, Handle mirror, Handle protection_domain,
273273
Handle classData, TRAPS);
274274
static void set_mirror_module_field(JavaThread* current, Klass* K, Handle mirror, Handle module);
275275
public:
@@ -293,8 +293,10 @@ class java_lang_Class : AllStatic {
293293

294294
static void fixup_module_field(Klass* k, Handle module);
295295

296-
// Conversion
296+
// Conversion -- java_class must not be null. The return value is null only if java_class is a primitive type.
297297
static Klass* as_Klass(oop java_class);
298+
static InstanceKlass* as_InstanceKlass(oop java_class);
299+
298300
static void set_klass(oop java_class, Klass* klass);
299301
static BasicType as_BasicType(oop java_class, Klass** reference_klass = nullptr);
300302
static Symbol* as_signature(oop java_class, bool intern_if_not_found);
@@ -1895,11 +1897,11 @@ class InjectedField {
18951897
const vmClassID klass_id;
18961898
const vmSymbolID name_index;
18971899
const vmSymbolID signature_index;
1898-
const bool may_be_java;
1900+
const bool may_be_java;
18991901

19001902

1901-
Klass* klass() const { return vmClasses::klass_at(klass_id); }
1902-
Symbol* name() const { return lookup_symbol(name_index); }
1903+
InstanceKlass* klass() const { return vmClasses::klass_at(klass_id); }
1904+
Symbol* name() const { return lookup_symbol(name_index); }
19031905
Symbol* signature() const { return lookup_symbol(signature_index); }
19041906

19051907
int compute_offset();

src/hotspot/share/classfile/javaClasses.inline.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,12 @@ inline Klass* java_lang_Class::as_Klass(oop java_class) {
291291
return k;
292292
}
293293

294+
inline InstanceKlass* java_lang_Class::as_InstanceKlass(oop java_class) {
295+
Klass* k = as_Klass(java_class);
296+
assert(k == nullptr || k->is_instance_klass(), "type check");
297+
return static_cast<InstanceKlass*>(k);
298+
}
299+
294300
inline bool java_lang_Class::is_primitive(oop java_class) {
295301
// should assert:
296302
// assert(java_lang_Class::is_instance(java_class), "must be a Class object");

src/hotspot/share/classfile/systemDictionary.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,10 +1277,10 @@ InstanceKlass* SystemDictionary::load_instance_class_impl(Symbol* class_name, Ha
12771277
assert(result.get_type() == T_OBJECT, "just checking");
12781278
oop obj = result.get_oop();
12791279

1280-
// Primitive classes return null since forName() can not be
1280+
// Primitive classes return null since forName() cannot be
12811281
// used to obtain any of the Class objects representing primitives or void
12821282
if ((obj != nullptr) && !(java_lang_Class::is_primitive(obj))) {
1283-
InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(obj));
1283+
InstanceKlass* k = java_lang_Class::as_InstanceKlass(obj);
12841284
// For user defined Java class loaders, check that the name returned is
12851285
// the same as that requested. This check is done for the bootstrap
12861286
// loader when parsing the class file.

src/hotspot/share/jfr/leakprofiler/chains/edgeUtils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const Symbol* EdgeUtils::field_name(const Edge& edge, jshort* modifiers) {
6565
if (is_static_field(ref_owner, ik, offset)) {
6666
assert(ik->is_mirror_instance_klass(), "invariant");
6767
assert(java_lang_Class::as_Klass(ref_owner)->is_instance_klass(), "invariant");
68-
ik = InstanceKlass::cast(java_lang_Class::as_Klass(ref_owner));
68+
ik = java_lang_Class::as_InstanceKlass(ref_owner);
6969
}
7070
while (ik != nullptr) {
7171
JavaFieldStream jfs(ik);

src/hotspot/share/jvmci/jvmciRuntime.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ JRT_ENTRY(void, JVMCIRuntime::dynamic_new_array_or_null(JavaThread* current, oop
187187
JRT_END
188188

189189
JRT_ENTRY(void, JVMCIRuntime::dynamic_new_instance_or_null(JavaThread* current, oopDesc* type_mirror))
190-
InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(type_mirror));
190+
InstanceKlass* klass = java_lang_Class::as_InstanceKlass(type_mirror);
191191

192192
if (klass == nullptr) {
193193
ResourceMark rm(current);

src/hotspot/share/prims/jni.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
526526
jint ret = JNI_OK;
527527
DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
528528

529-
InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
529+
InstanceKlass* k = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(clazz));
530530
Symbol* name = k->name();
531531
Handle class_loader (THREAD, k->class_loader());
532532
THROW_MSG_LOADER_(name, (char *)message, class_loader, JNI_OK);

0 commit comments

Comments
 (0)