Skip to content
Closed
11 changes: 0 additions & 11 deletions src/hotspot/share/c1/c1_Canonicalizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,17 +536,6 @@ void Canonicalizer::do_Intrinsic (Intrinsic* x) {
}
break;
}
case vmIntrinsics::_isPrimitive : {
assert(x->number_of_arguments() == 1, "wrong type");

// Class.isPrimitive is known on constant classes:
InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant();
if (c != nullptr && !c->value()->is_null_object()) {
ciType* t = c->value()->java_mirror_type();
set_constant(t->is_primitive_type());
}
break;
}
default:
break;
}
Expand Down
1 change: 0 additions & 1 deletion src/hotspot/share/c1/c1_Compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ bool Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
case vmIntrinsics::_longBitsToDouble:
case vmIntrinsics::_getClass:
case vmIntrinsics::_isInstance:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_currentCarrierThread:
case vmIntrinsics::_currentThread:
case vmIntrinsics::_scopedValueCache:
Expand Down
20 changes: 0 additions & 20 deletions src/hotspot/share/c1/c1_LIRGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1278,25 +1278,6 @@ void LIRGenerator::do_getClass(Intrinsic* x) {
LIR_OprFact::address(new LIR_Address(temp, T_OBJECT)), result);
}

// java.lang.Class::isPrimitive()
void LIRGenerator::do_isPrimitive(Intrinsic* x) {
assert(x->number_of_arguments() == 1, "wrong type");

LIRItem rcvr(x->argument_at(0), this);
rcvr.load_item();
LIR_Opr temp = new_register(T_METADATA);
LIR_Opr result = rlock_result(x);

CodeEmitInfo* info = nullptr;
if (x->needs_null_check()) {
info = state_for(x);
}

__ move(new LIR_Address(rcvr.result(), java_lang_Class::klass_offset(), T_ADDRESS), temp, info);
__ cmp(lir_cond_notEqual, temp, LIR_OprFact::metadataConst(nullptr));
__ cmove(lir_cond_notEqual, LIR_OprFact::intConst(0), LIR_OprFact::intConst(1), result, T_BOOLEAN);
}

void LIRGenerator::do_getObjectSize(Intrinsic* x) {
assert(x->number_of_arguments() == 3, "wrong type");
LIR_Opr result_reg = rlock_result(x);
Expand Down Expand Up @@ -2914,7 +2895,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {

case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break;
case vmIntrinsics::_isInstance: do_isInstance(x); break;
case vmIntrinsics::_isPrimitive: do_isPrimitive(x); break;
case vmIntrinsics::_getClass: do_getClass(x); break;
case vmIntrinsics::_getObjectSize: do_getObjectSize(x); break;
case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;
Expand Down
1 change: 0 additions & 1 deletion src/hotspot/share/c1/c1_LIRGenerator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,6 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {

void do_RegisterFinalizer(Intrinsic* x);
void do_isInstance(Intrinsic* x);
void do_isPrimitive(Intrinsic* x);
void do_getClass(Intrinsic* x);
void do_getObjectSize(Intrinsic* x);
void do_currentCarrierThread(Intrinsic* x);
Expand Down
31 changes: 21 additions & 10 deletions src/hotspot/share/classfile/javaClasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,7 @@ int java_lang_Class::_classData_offset;
int java_lang_Class::_classRedefinedCount_offset;
int java_lang_Class::_reflectionData_offset;
int java_lang_Class::_modifiers_offset;
int java_lang_Class::_is_primitive_offset;

bool java_lang_Class::_offsets_computed = false;
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = nullptr;
Expand Down Expand Up @@ -1062,7 +1063,7 @@ void java_lang_Class::allocate_mirror(Klass* k, bool is_scratch, Handle protecti
set_klass(mirror(), k);

// Set the modifiers flag.
int computed_modifiers = k->compute_modifier_flags();
u2 computed_modifiers = k->compute_modifier_flags();
set_modifiers(mirror(), computed_modifiers);

InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
Expand Down Expand Up @@ -1272,8 +1273,11 @@ void java_lang_Class::set_protection_domain(oop java_class, oop pd) {

void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) {
assert(_component_mirror_offset != 0, "must be set");
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
}
assert(java_lang_Class::as_Klass(java_class) != nullptr &&
java_lang_Class::as_Klass(java_class)->is_array_klass(), "must be");
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
}

oop java_lang_Class::component_mirror(oop java_class) {
assert(_component_mirror_offset != 0, "must be set");
return java_class->obj_field(_component_mirror_offset);
Expand Down Expand Up @@ -1347,9 +1351,14 @@ void java_lang_Class::set_source_file(oop java_class, oop source_file) {
java_class->obj_field_put(_source_file_offset, source_file);
}

void java_lang_Class::set_is_primitive(oop java_class) {
assert(_is_primitive_offset != 0, "must be set");
java_class->bool_field_put(_is_primitive_offset, true);
}


oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
// This should be improved by adding a field at the Java level or by
// introducing a new VM klass (see comment in ClassFileParser)
// Mirrors for basic types have a null klass field, which makes them special.
oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
if (type != T_VOID) {
Klass* aklass = Universe::typeArrayKlass(type);
Expand All @@ -1361,6 +1370,7 @@ oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, Basic
assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
#endif
set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
set_is_primitive(java_class);
return java_class;
}

Expand Down Expand Up @@ -1500,8 +1510,9 @@ oop java_lang_Class::primitive_mirror(BasicType t) {
macro(_classData_offset, k, "classData", object_signature, false); \
macro(_reflectionData_offset, k, "reflectionData", java_lang_ref_SoftReference_signature, false); \
macro(_signers_offset, k, "signers", object_array_signature, false); \
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
macro(_protection_domain_offset, k, "protectionDomain", java_security_ProtectionDomain_signature, false);
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), char_signature, false); \
macro(_protection_domain_offset, k, "protectionDomain", java_security_ProtectionDomain_signature, false); \
macro(_is_primitive_offset, k, "primitive", bool_signature, false);

void java_lang_Class::compute_offsets() {
if (_offsets_computed) {
Expand Down Expand Up @@ -1537,12 +1548,12 @@ void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {

int java_lang_Class::modifiers(oop the_class_mirror) {
assert(_modifiers_offset != 0, "offsets should have been initialized");
return the_class_mirror->int_field(_modifiers_offset);
return the_class_mirror->char_field(_modifiers_offset);
}

void java_lang_Class::set_modifiers(oop the_class_mirror, int value) {
void java_lang_Class::set_modifiers(oop the_class_mirror, u2 value) {
assert(_modifiers_offset != 0, "offsets should have been initialized");
the_class_mirror->int_field_put(_modifiers_offset, value);
the_class_mirror->char_field_put(_modifiers_offset, value);
}


Expand Down
4 changes: 3 additions & 1 deletion src/hotspot/share/classfile/javaClasses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ class java_lang_Class : AllStatic {
static int _classRedefinedCount_offset;
static int _reflectionData_offset;
static int _modifiers_offset;
static int _is_primitive_offset;

static bool _offsets_computed;

Expand Down Expand Up @@ -302,6 +303,7 @@ class java_lang_Class : AllStatic {
static bool is_instance(oop obj);

static bool is_primitive(oop java_class);
static void set_is_primitive(oop java_class);
static BasicType primitive_type(oop java_class);
static oop primitive_mirror(BasicType t);
// JVM_NewArray support
Expand Down Expand Up @@ -338,7 +340,7 @@ class java_lang_Class : AllStatic {
static void set_source_file(oop java_class, oop source_file);

static int modifiers(oop java_class);
static void set_modifiers(oop java_class, int value);
static void set_modifiers(oop java_class, u2 value);

static size_t oop_size(oop java_class);
static void set_oop_size(HeapWord* java_class, size_t size);
Expand Down
8 changes: 5 additions & 3 deletions src/hotspot/share/classfile/javaClasses.inline.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -293,11 +293,13 @@ inline Klass* java_lang_Class::as_Klass(oop 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");
// assert(java_lang_Class::is_instance(java_class), "must be a Class object");
bool is_primitive = (java_class->metadata_field(_klass_offset) == nullptr);

#ifdef ASSERT
if (is_primitive) {
// The heapwalker walks through Classes that have had their Klass pointers removed, so can't assert this.
// assert(is_primitive == java_class->bool_field(_is_primitive_offset), "must match what we told Java");
if (java_class->bool_field(_is_primitive_offset)) {
Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
assert(k == nullptr || is_java_primitive(ArrayKlass::cast(k)->element_type()),
"Should be either the T_VOID primitive or a java primitive");
Expand Down
3 changes: 0 additions & 3 deletions src/hotspot/share/classfile/vmIntrinsics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,6 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) {
switch (id) {
case vmIntrinsics::_isInstance:
case vmIntrinsics::_isAssignableFrom:
case vmIntrinsics::_isInterface:
case vmIntrinsics::_isArray:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_isHidden:
case vmIntrinsics::_getSuperclass:
case vmIntrinsics::_Class_cast:
Expand Down
6 changes: 0 additions & 6 deletions src/hotspot/share/classfile/vmIntrinsics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,6 @@ class methodHandle;
do_name( isAssignableFrom_name, "isAssignableFrom") \
do_intrinsic(_isInstance, java_lang_Class, isInstance_name, object_boolean_signature, F_RN) \
do_name( isInstance_name, "isInstance") \
do_intrinsic(_isInterface, java_lang_Class, isInterface_name, void_boolean_signature, F_RN) \
do_name( isInterface_name, "isInterface") \
do_intrinsic(_isArray, java_lang_Class, isArray_name, void_boolean_signature, F_RN) \
do_name( isArray_name, "isArray") \
do_intrinsic(_isPrimitive, java_lang_Class, isPrimitive_name, void_boolean_signature, F_RN) \
do_name( isPrimitive_name, "isPrimitive") \
do_intrinsic(_isHidden, java_lang_Class, isHidden_name, void_boolean_signature, F_RN) \
do_name( isHidden_name, "isHidden") \
do_intrinsic(_getSuperclass, java_lang_Class, getSuperclass_name, void_class_signature, F_RN) \
Expand Down
12 changes: 0 additions & 12 deletions src/hotspot/share/include/jvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -546,21 +546,9 @@ JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
JNIEXPORT jboolean JNICALL
JVM_IsInterface(JNIEnv *env, jclass cls);

JNIEXPORT jobject JNICALL
JVM_GetProtectionDomain(JNIEnv *env, jclass cls);

JNIEXPORT jboolean JNICALL
JVM_IsArrayClass(JNIEnv *env, jclass cls);

JNIEXPORT jboolean JNICALL
JVM_IsPrimitiveClass(JNIEnv *env, jclass cls);

JNIEXPORT jboolean JNICALL
JVM_IsHiddenClass(JNIEnv *env, jclass cls);

JNIEXPORT jint JNICALL
JVM_GetClassModifiers(JNIEnv *env, jclass cls);

JNIEXPORT jobjectArray JNICALL
JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass);

Expand Down
3 changes: 0 additions & 3 deletions src/hotspot/share/opto/c2compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -749,9 +749,6 @@ bool C2Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
case vmIntrinsics::_clone:
case vmIntrinsics::_isAssignableFrom:
case vmIntrinsics::_isInstance:
case vmIntrinsics::_isInterface:
case vmIntrinsics::_isArray:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_isHidden:
case vmIntrinsics::_getSuperclass:
case vmIntrinsics::_getClassAccessFlags:
Expand Down
36 changes: 0 additions & 36 deletions src/hotspot/share/opto/library_call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,9 +515,6 @@ bool LibraryCallKit::try_to_inline(int predicate) {
case vmIntrinsics::_isAssignableFrom: return inline_native_subtype_check();

case vmIntrinsics::_isInstance:
case vmIntrinsics::_isInterface:
case vmIntrinsics::_isArray:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_isHidden:
case vmIntrinsics::_getSuperclass:
case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id());
Expand Down Expand Up @@ -3890,17 +3887,6 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
prim_return_value = intcon(0);
obj = argument(1);
break;
case vmIntrinsics::_isInterface:
prim_return_value = intcon(0);
break;
case vmIntrinsics::_isArray:
prim_return_value = intcon(0);
expect_prim = true; // cf. ObjectStreamClass.getClassSignature
break;
case vmIntrinsics::_isPrimitive:
prim_return_value = intcon(1);
expect_prim = true; // obviously
break;
case vmIntrinsics::_isHidden:
prim_return_value = intcon(0);
break;
Expand Down Expand Up @@ -3969,28 +3955,6 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
query_value = gen_instanceof(obj, kls, safe_for_replace);
break;

case vmIntrinsics::_isInterface:
// (To verify this code sequence, check the asserts in JVM_IsInterface.)
if (generate_interface_guard(kls, region) != nullptr)
// A guard was added. If the guard is taken, it was an interface.
phi->add_req(intcon(1));
// If we fall through, it's a plain class.
query_value = intcon(0);
break;

case vmIntrinsics::_isArray:
// (To verify this code sequence, check the asserts in JVM_IsArrayClass.)
if (generate_array_guard(kls, region) != nullptr)
// A guard was added. If the guard is taken, it was an array.
phi->add_req(intcon(1));
// If we fall through, it's a plain class.
query_value = intcon(0);
break;

case vmIntrinsics::_isPrimitive:
query_value = intcon(0); // "normal" path produces false
break;

case vmIntrinsics::_isHidden:
// (To verify this code sequence, check the asserts in JVM_IsHiddenClass.)
if (generate_hidden_class_guard(kls, region) != nullptr)
Expand Down
44 changes: 17 additions & 27 deletions src/hotspot/share/prims/jvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1187,20 +1187,6 @@ JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
JVM_END


JVM_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
oop mirror = JNIHandles::resolve_non_null(cls);
if (java_lang_Class::is_primitive(mirror)) {
return JNI_FALSE;
}
Klass* k = java_lang_Class::as_Klass(mirror);
jboolean result = k->is_interface();
assert(!result || k->is_instance_klass(),
"all interfaces are instance types");
// The compiler intrinsic for isInterface tests the
// Klass::_access_flags bits in the same way.
return result;
JVM_END

JVM_ENTRY(jboolean, JVM_IsHiddenClass(JNIEnv *env, jclass cls))
oop mirror = JNIHandles::resolve_non_null(cls);
if (java_lang_Class::is_primitive(mirror)) {
Expand Down Expand Up @@ -1259,18 +1245,6 @@ JVM_ENTRY(jobject, JVM_FindScopedValueBindings(JNIEnv *env, jclass cls))
return nullptr;
JVM_END

JVM_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
return (k != nullptr) && k->is_array_klass() ? true : false;
JVM_END


JVM_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))
oop mirror = JNIHandles::resolve_non_null(cls);
return (jboolean) java_lang_Class::is_primitive(mirror);
JVM_END


JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
JvmtiVMObjectAllocEventCollector oam;
// ofClass is a reference to a java_lang_Class object. The mirror object
Expand Down Expand Up @@ -2305,7 +2279,23 @@ JVM_END
// The function returns a Klass* of the _scratch_class if the verifier
// was invoked in the middle of the class redefinition.
// Otherwise it returns its argument value which is the _the_class Klass*.
// Please, refer to the description in the jvmtiThreadSate.hpp.
// Please, refer to the description in the jvmtiThreadState.hpp.

Copy link
Member

Choose a reason for hiding this comment

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

Does this "RedefineClasses support" comment still belong here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think so. The comment in jvmtiThreadState.hpp has details why this is. We do a mirror switch before verification apparently because of bug 6214132 it says.

JVM_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
Copy link
Contributor

Choose a reason for hiding this comment

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

JVM_IsInteface is deleted in Class.c, what purpose is this?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The old classfile verifier uses JVM_IsInterface.

oop mirror = JNIHandles::resolve_non_null(cls);
if (java_lang_Class::is_primitive(mirror)) {
return JNI_FALSE;
}
Klass* k = java_lang_Class::as_Klass(mirror);
// This isn't necessary since answer is the same since redefinition
// has already checked this matches for the scratch class.
// k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
jboolean result = k->is_interface();
assert(!result || k->is_instance_klass(),
"all interfaces are instance types");
return result;
JVM_END


JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
Expand Down
Loading