Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src/hotspot/share/classfile/javaClasses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,9 +295,7 @@ class java_lang_Class : AllStatic {

// Conversion -- java_class must not be null. The return value is null only if java_class is a primitive type.
static Klass* as_Klass(oop java_class);
static Klass* as_Klass(jobject java_class);
static InstanceKlass* as_InstanceKlass(oop java_class);
static InstanceKlass* as_InstanceKlass(jobject java_class);

static void set_klass(oop java_class, Klass* klass);
static BasicType as_BasicType(oop java_class, Klass** reference_klass = nullptr);
Expand Down Expand Up @@ -1899,11 +1897,11 @@ class InjectedField {
const vmClassID klass_id;
const vmSymbolID name_index;
const vmSymbolID signature_index;
const bool may_be_java;
const bool may_be_java;


InstanceKlass* klass() const { return vmClasses::klass_at(klass_id); }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you fix the indentation?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed all indentation alignments from this class, as they no longer seem warranted.

Symbol* name() const { return lookup_symbol(name_index); }
Symbol* name() const { return lookup_symbol(name_index); }
Symbol* signature() const { return lookup_symbol(signature_index); }

int compute_offset();
Expand Down
9 changes: 0 additions & 9 deletions src/hotspot/share/classfile/javaClasses.inline.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
#include "oops/oop.inline.hpp"
#include "oops/oopsHierarchy.hpp"
#include "oops/typeArrayOop.inline.hpp"
#include "runtime/jniHandles.inline.hpp"

void java_lang_String::set_coder(oop string, jbyte coder) {
string->byte_field_put(_coder_offset, coder);
Expand Down Expand Up @@ -292,20 +291,12 @@ inline Klass* java_lang_Class::as_Klass(oop java_class) {
return k;
}

inline Klass* java_lang_Class::as_Klass(jobject java_class) {
return as_Klass(JNIHandles::resolve_non_null(java_class));
}

inline InstanceKlass* java_lang_Class::as_InstanceKlass(oop java_class) {
Klass* k = as_Klass(java_class);
assert(k == nullptr || k->is_instance_klass(), "type check");
return static_cast<InstanceKlass*>(k);
}

inline InstanceKlass* java_lang_Class::as_InstanceKlass(jobject java_class) {
return as_InstanceKlass(JNIHandles::resolve_non_null(java_class));
}

inline bool java_lang_Class::is_primitive(oop java_class) {
// should assert:
// assert(java_lang_Class::is_instance(java_class), "must be a Class object");
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/jfr/jni/jfrJavaSupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -867,7 +867,7 @@ bool JfrJavaSupport::set_configuration(jobject clazz, jobject configuration, TRA

bool JfrJavaSupport::is_instrumented(jobject clazz, TRAPS) {
DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
const Klass* const k = java_lang_Class::as_Klass(clazz);
const Klass* const k = java_lang_Class::as_Klass(resolve_non_null(clazz));
assert(k->is_instance_klass(), "invariant");
return JfrEventClassTransformer::is_instrumented(InstanceKlass::cast(k));
}
Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ C2V_VMENTRY_NULL(jobject, lookupClass, (JNIEnv* env, jobject, jclass mirror))
return nullptr;
}
JVMCIKlassHandle klass(THREAD);
klass = java_lang_Class::as_Klass(mirror);
klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
if (klass == nullptr) {
JVMCI_THROW_MSG_NULL(IllegalArgumentException, "Primitive classes are unsupported");
}
Expand Down Expand Up @@ -2607,7 +2607,7 @@ C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclas
if (mirror == nullptr) {
JVMCI_THROW_NULL(NullPointerException);
}
Klass* klass = java_lang_Class::as_Klass(mirror);
Klass* klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
if (klass == nullptr || !klass->is_instance_klass()) {
JVMCI_THROW_MSG_NULL(IllegalArgumentException, "clazz is for primitive type");
}
Expand Down
23 changes: 12 additions & 11 deletions src/hotspot/share/prims/jni.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
result = find_class_from_class_loader(env, class_name, true, loader, true, thread);

if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
trace_class_resolution(java_lang_Class::as_Klass(result));
trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
}

return result;
Expand Down Expand Up @@ -526,7 +526,7 @@ JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
jint ret = JNI_OK;
DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);

InstanceKlass* k = java_lang_Class::as_InstanceKlass(clazz);
InstanceKlass* k = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(clazz));
Symbol* name = k->name();
Handle class_loader (THREAD, k->class_loader());
THROW_MSG_LOADER_(name, (char *)message, class_loader, JNI_OK);
Expand Down Expand Up @@ -1041,7 +1041,8 @@ JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclas
jboolean ret = JNI_TRUE;
if (obj != nullptr) {
ret = JNI_FALSE;
Klass* k = java_lang_Class::as_Klass(clazz);
Klass* k = java_lang_Class::as_Klass(
JNIHandles::resolve_non_null(clazz));
if (k != nullptr) {
ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
}
Expand Down Expand Up @@ -1600,7 +1601,7 @@ JNI_ENTRY(ResultType, \
JavaValue jvalue(Tag); \
JNI_ArgumentPusherVaArg ap(methodID, args); \
/* Make sure class is initialized before trying to invoke its method */ \
Klass* k = java_lang_Class::as_Klass(cls); \
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); \
k->initialize(CHECK_(ResultType{})); \
jni_invoke_static(env, &jvalue, nullptr, JNI_STATIC, methodID, &ap, CHECK_(ResultType{})); \
va_end(args); \
Expand Down Expand Up @@ -1745,7 +1746,7 @@ JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
jfieldID ret = nullptr;
DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);

Klass* k = java_lang_Class::as_Klass(clazz);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));

// The class should have been loaded (we have an instance of the class
// passed in) so the field and signature should already be in the symbol
Expand Down Expand Up @@ -1939,7 +1940,7 @@ JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldI

fieldDescriptor fd;
bool found = false;
Klass* k = java_lang_Class::as_Klass(cls);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));

assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");

Expand Down Expand Up @@ -1980,7 +1981,7 @@ JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
if (fieldname == nullptr || signame == nullptr) {
THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
}
Klass* k = java_lang_Class::as_Klass(clazz);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
// Make sure class is initialized before handing id's out to static fields
k->initialize(CHECK_NULL);

Expand Down Expand Up @@ -2281,7 +2282,7 @@ JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass ele
HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(env, length, elementClass, initialElement);
jobjectArray ret = nullptr;
DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
Klass* ek = java_lang_Class::as_Klass(elementClass);
Klass* ek = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass));

// Make sure bottom_klass is initialized.
ek->initialize(CHECK_NULL);
Expand Down Expand Up @@ -2626,7 +2627,7 @@ JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
jint ret = 0;
DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);

Klass* k = java_lang_Class::as_Klass(clazz);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));

// There are no restrictions on native code registering native methods,
// which allows agents to redefine the bindings to native methods, however
Expand Down Expand Up @@ -2689,7 +2690,7 @@ JNI_END

JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
HOTSPOT_JNI_UNREGISTERNATIVES_ENTRY(env, clazz);
Klass* k = java_lang_Class::as_Klass(clazz);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
//%note jni_2
if (k->is_instance_klass()) {
for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) {
Expand Down Expand Up @@ -2925,7 +2926,7 @@ static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) {
jclass result = find_class_from_class_loader(env, sym, true, loader, true, CHECK_NULL);

if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
trace_class_resolution(java_lang_Class::as_Klass(result));
trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
}
return result;
}
Expand Down
36 changes: 18 additions & 18 deletions src/hotspot/share/prims/jvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,7 @@ JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
false, THREAD);

if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
trace_class_resolution(java_lang_Class::as_Klass(result));
trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
}
return result;
JVM_END
Expand All @@ -840,8 +840,8 @@ JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
if (log_is_enabled(Debug, class, resolve) && result != nullptr) {
// this function is generally only used for class loading during verification.
ResourceMark rm;
const char * from_name = java_lang_Class::as_Klass(from)->external_name();
const char * to_name = java_lang_Class::as_Klass(result)->external_name();
const char* from_name = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(from))->external_name();
const char* to_name = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))->external_name();
log_debug(class, resolve)("%s %s (verification)", from_name, to_name);
}

Expand Down Expand Up @@ -906,10 +906,11 @@ static jclass jvm_lookup_define_class(jclass lookup, const char *name,
jboolean init, int flags, jobject classData, TRAPS) {
ResourceMark rm(THREAD);

InstanceKlass* lookup_k = java_lang_Class::as_InstanceKlass(lookup);
// Lookup class must not be a primitive class (whose mirror null Klass*)
InstanceKlass* lookup_k = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(lookup));
// Lookup class must not be a primitive class (whose mirror has a null Klass*)
if (lookup_k == nullptr) {
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is primitive");
// The error message is wrong. We come here only if lookup is a primitive class
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");
}

Handle class_loader (THREAD, lookup_k->class_loader());
Expand Down Expand Up @@ -1444,7 +1445,7 @@ JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
ResourceMark rm(THREAD);
// Return null for arrays and primitives
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(cls);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
if (k->is_instance_klass()) {
AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
if (type_annotations != nullptr) {
Expand Down Expand Up @@ -1596,7 +1597,7 @@ JVM_END
// java.lang.Record and has a Record attribute; otherwise, it is not a record.
JVM_ENTRY(jboolean, JVM_IsRecord(JNIEnv *env, jclass cls))
{
Klass* k = java_lang_Class::as_Klass(cls);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
if (k != nullptr && k->is_instance_klass()) {
InstanceKlass* ik = InstanceKlass::cast(k);
return ik->is_record();
Expand All @@ -1613,7 +1614,7 @@ JVM_END
// even if the class is not a record.
JVM_ENTRY(jobjectArray, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))
{
InstanceKlass* ik = java_lang_Class::as_InstanceKlass(ofClass);
InstanceKlass* ik = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(ofClass));

Array<RecordComponent*>* components = ik->record_components();
if (components != nullptr) {
Expand Down Expand Up @@ -1734,16 +1735,16 @@ JVM_END

JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
{
InstanceKlass* c = java_lang_Class::as_InstanceKlass(current);
InstanceKlass* m = java_lang_Class::as_InstanceKlass(member);
InstanceKlass* c = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(current));
InstanceKlass* m = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(member));
return c->has_nestmate_access_to(m, THREAD);
}
JVM_END

JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
{
// current is not a primitive or array class
InstanceKlass* c = java_lang_Class::as_InstanceKlass(current);
InstanceKlass* c = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(current));
InstanceKlass* host = c->nest_host(THREAD);
return (jclass) (host == nullptr ? nullptr :
JNIHandles::make_local(THREAD, host->java_mirror()));
Expand All @@ -1754,7 +1755,7 @@ JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
{
// current is not a primitive or array class
ResourceMark rm(THREAD);
InstanceKlass* c = java_lang_Class::as_InstanceKlass(current);
InstanceKlass* c = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(current));
InstanceKlass* host = c->nest_host(THREAD);

log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",
Expand Down Expand Up @@ -3337,7 +3338,7 @@ JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjec
JVM_END

JVM_ENTRY(void, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))
Klass* k = java_lang_Class::as_Klass(cls);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
HeapShared::initialize_from_archived_subgraph(THREAD, k);
JVM_END

Expand All @@ -3354,15 +3355,14 @@ JVM_ENTRY(void, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,
return;
}

Klass* caller_k = java_lang_Class::as_Klass(caller);
InstanceKlass* caller_ik = java_lang_Class::as_InstanceKlass(JNIHandles::resolve(caller));
if (caller_ik->is_hidden()) {
// Hidden classes not of type lambda proxy classes are currently not being archived.
// If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be
// registered for archiving.
return;
}
InstanceKlass* lambda_ik = java_lang_Class::as_InstanceKlass(lambdaProxyClass);
InstanceKlass* lambda_ik = java_lang_Class::as_InstanceKlass(JNIHandles::resolve(lambdaProxyClass));
assert(lambda_ik->is_hidden(), "must be a hidden class");
assert(!lambda_ik->is_non_strong_hidden(), "expected a strong hidden class");

Expand Down Expand Up @@ -3402,7 +3402,7 @@ JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
THROW_(vmSymbols::java_lang_NullPointerException(), nullptr);
}

InstanceKlass* caller_ik = java_lang_Class::as_InstanceKlass(caller);
InstanceKlass* caller_ik = java_lang_Class::as_InstanceKlass(JNIHandles::resolve(caller));
if (!caller_ik->in_aot_cache()) {
// there won't be a shared lambda class if the caller_ik is not in the shared archive.
return nullptr;
Expand Down Expand Up @@ -3499,7 +3499,7 @@ JVM_END

JVM_ENTRY(jboolean, JVM_NeedsClassInitBarrierForCDS(JNIEnv* env, jclass cls))
#if INCLUDE_CDS
Klass* k = java_lang_Class::as_Klass(cls);
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
if (!k->is_instance_klass()) {
return false;
} else {
Expand Down
6 changes: 3 additions & 3 deletions src/hotspot/share/prims/methodHandles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1094,7 +1094,7 @@ JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh,
// Reflection::verify_class_access can only handle instance classes.
if (reference_klass != nullptr && reference_klass->is_instance_klass()) {
// Emulate LinkResolver::check_klass_accessability.
Klass* caller = java_lang_Class::as_Klass(caller_jh);
Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
// access check on behalf of the caller if this is not a public lookup
// i.e. lookup mode is not UNCONDITIONAL
if ((lookup_mode & LM_UNCONDITIONAL) == 0
Expand All @@ -1111,7 +1111,7 @@ JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh,
}

Klass* caller = caller_jh == nullptr ? nullptr :
java_lang_Class::as_Klass(caller_jh);
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
Handle resolved = MethodHandles::resolve_MemberName(mname, caller, lookup_mode,
speculative_resolve == JNI_TRUE,
CHECK_NULL);
Expand Down Expand Up @@ -1239,7 +1239,7 @@ JVM_ENTRY(void, MHN_copyOutBootstrapArguments(JNIEnv* env, jobject igcls,
// caller->constants->copy_bootstrap_arguments_at performs a runtime
// range check, but let's assert earlier as well.
assert(start < end && start >= 0, "invariant");
Klass* caller_k = java_lang_Class::as_Klass(caller_jh);
Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller_jh));
if (caller_k == nullptr || !caller_k->is_instance_klass()) {
THROW_MSG(vmSymbols::java_lang_InternalError(), "bad caller");
}
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/prims/unsafe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ static jlong find_known_instance_field_offset(jclass clazz, jstring name, TRAPS)
ResourceMark rm(THREAD);
char *utf_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));

InstanceKlass* k = java_lang_Class::as_InstanceKlass(clazz);
InstanceKlass* k = java_lang_Class::as_InstanceKlass(JNIHandles::resolve_non_null(clazz));

jint offset = -1; // Not found
for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
Expand Down
Loading