Skip to content

Commit c413549

Browse files
committed
8349860: Make Class.isArray(), Class.isInterface() and Class.isPrimitive() non-native
Reviewed-by: dlong, rriggs, vlivanov, yzheng, liach
1 parent a9c9f7f commit c413549

File tree

20 files changed

+74
-159
lines changed

20 files changed

+74
-159
lines changed

src/hotspot/share/c1/c1_Canonicalizer.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -536,17 +536,6 @@ void Canonicalizer::do_Intrinsic (Intrinsic* x) {
536536
}
537537
break;
538538
}
539-
case vmIntrinsics::_isPrimitive : {
540-
assert(x->number_of_arguments() == 1, "wrong type");
541-
542-
// Class.isPrimitive is known on constant classes:
543-
InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant();
544-
if (c != nullptr && !c->value()->is_null_object()) {
545-
ciType* t = c->value()->java_mirror_type();
546-
set_constant(t->is_primitive_type());
547-
}
548-
break;
549-
}
550539
default:
551540
break;
552541
}

src/hotspot/share/c1/c1_Compiler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ bool Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
155155
case vmIntrinsics::_longBitsToDouble:
156156
case vmIntrinsics::_getClass:
157157
case vmIntrinsics::_isInstance:
158-
case vmIntrinsics::_isPrimitive:
159158
case vmIntrinsics::_currentCarrierThread:
160159
case vmIntrinsics::_currentThread:
161160
case vmIntrinsics::_scopedValueCache:

src/hotspot/share/c1/c1_LIRGenerator.cpp

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,25 +1278,6 @@ void LIRGenerator::do_getClass(Intrinsic* x) {
12781278
LIR_OprFact::address(new LIR_Address(temp, T_OBJECT)), result);
12791279
}
12801280

1281-
// java.lang.Class::isPrimitive()
1282-
void LIRGenerator::do_isPrimitive(Intrinsic* x) {
1283-
assert(x->number_of_arguments() == 1, "wrong type");
1284-
1285-
LIRItem rcvr(x->argument_at(0), this);
1286-
rcvr.load_item();
1287-
LIR_Opr temp = new_register(T_METADATA);
1288-
LIR_Opr result = rlock_result(x);
1289-
1290-
CodeEmitInfo* info = nullptr;
1291-
if (x->needs_null_check()) {
1292-
info = state_for(x);
1293-
}
1294-
1295-
__ move(new LIR_Address(rcvr.result(), java_lang_Class::klass_offset(), T_ADDRESS), temp, info);
1296-
__ cmp(lir_cond_notEqual, temp, LIR_OprFact::metadataConst(nullptr));
1297-
__ cmove(lir_cond_notEqual, LIR_OprFact::intConst(0), LIR_OprFact::intConst(1), result, T_BOOLEAN);
1298-
}
1299-
13001281
void LIRGenerator::do_getObjectSize(Intrinsic* x) {
13011282
assert(x->number_of_arguments() == 3, "wrong type");
13021283
LIR_Opr result_reg = rlock_result(x);
@@ -2914,7 +2895,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
29142895

29152896
case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break;
29162897
case vmIntrinsics::_isInstance: do_isInstance(x); break;
2917-
case vmIntrinsics::_isPrimitive: do_isPrimitive(x); break;
29182898
case vmIntrinsics::_getClass: do_getClass(x); break;
29192899
case vmIntrinsics::_getObjectSize: do_getObjectSize(x); break;
29202900
case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;

src/hotspot/share/c1/c1_LIRGenerator.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
254254

255255
void do_RegisterFinalizer(Intrinsic* x);
256256
void do_isInstance(Intrinsic* x);
257-
void do_isPrimitive(Intrinsic* x);
258257
void do_getClass(Intrinsic* x);
259258
void do_getObjectSize(Intrinsic* x);
260259
void do_currentCarrierThread(Intrinsic* x);

src/hotspot/share/classfile/javaClasses.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ int java_lang_Class::_classData_offset;
868868
int java_lang_Class::_classRedefinedCount_offset;
869869
int java_lang_Class::_reflectionData_offset;
870870
int java_lang_Class::_modifiers_offset;
871+
int java_lang_Class::_is_primitive_offset;
871872

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

10641065
// Set the modifiers flag.
1065-
int computed_modifiers = k->compute_modifier_flags();
1066+
u2 computed_modifiers = k->compute_modifier_flags();
10661067
set_modifiers(mirror(), computed_modifiers);
10671068

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

12731274
void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) {
12741275
assert(_component_mirror_offset != 0, "must be set");
1275-
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
1276-
}
1276+
assert(java_lang_Class::as_Klass(java_class) != nullptr &&
1277+
java_lang_Class::as_Klass(java_class)->is_array_klass(), "must be");
1278+
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
1279+
}
1280+
12771281
oop java_lang_Class::component_mirror(oop java_class) {
12781282
assert(_component_mirror_offset != 0, "must be set");
12791283
return java_class->obj_field(_component_mirror_offset);
@@ -1347,9 +1351,14 @@ void java_lang_Class::set_source_file(oop java_class, oop source_file) {
13471351
java_class->obj_field_put(_source_file_offset, source_file);
13481352
}
13491353

1354+
void java_lang_Class::set_is_primitive(oop java_class) {
1355+
assert(_is_primitive_offset != 0, "must be set");
1356+
java_class->bool_field_put(_is_primitive_offset, true);
1357+
}
1358+
1359+
13501360
oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1351-
// This should be improved by adding a field at the Java level or by
1352-
// introducing a new VM klass (see comment in ClassFileParser)
1361+
// Mirrors for basic types have a null klass field, which makes them special.
13531362
oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(nullptr, CHECK_NULL);
13541363
if (type != T_VOID) {
13551364
Klass* aklass = Universe::typeArrayKlass(type);
@@ -1361,6 +1370,7 @@ oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, Basic
13611370
assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
13621371
#endif
13631372
set_modifiers(java_class, JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
1373+
set_is_primitive(java_class);
13641374
return java_class;
13651375
}
13661376

@@ -1500,8 +1510,9 @@ oop java_lang_Class::primitive_mirror(BasicType t) {
15001510
macro(_classData_offset, k, "classData", object_signature, false); \
15011511
macro(_reflectionData_offset, k, "reflectionData", java_lang_ref_SoftReference_signature, false); \
15021512
macro(_signers_offset, k, "signers", object_array_signature, false); \
1503-
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
1504-
macro(_protection_domain_offset, k, "protectionDomain", java_security_ProtectionDomain_signature, false);
1513+
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), char_signature, false); \
1514+
macro(_protection_domain_offset, k, "protectionDomain", java_security_ProtectionDomain_signature, false); \
1515+
macro(_is_primitive_offset, k, "primitive", bool_signature, false);
15051516

15061517
void java_lang_Class::compute_offsets() {
15071518
if (_offsets_computed) {
@@ -1537,12 +1548,12 @@ void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
15371548

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

1543-
void java_lang_Class::set_modifiers(oop the_class_mirror, int value) {
1554+
void java_lang_Class::set_modifiers(oop the_class_mirror, u2 value) {
15441555
assert(_modifiers_offset != 0, "offsets should have been initialized");
1545-
the_class_mirror->int_field_put(_modifiers_offset, value);
1556+
the_class_mirror->char_field_put(_modifiers_offset, value);
15461557
}
15471558

15481559

src/hotspot/share/classfile/javaClasses.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ class java_lang_Class : AllStatic {
257257
static int _classRedefinedCount_offset;
258258
static int _reflectionData_offset;
259259
static int _modifiers_offset;
260+
static int _is_primitive_offset;
260261

261262
static bool _offsets_computed;
262263

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

304305
static bool is_primitive(oop java_class);
306+
static void set_is_primitive(oop java_class);
305307
static BasicType primitive_type(oop java_class);
306308
static oop primitive_mirror(BasicType t);
307309
// JVM_NewArray support
@@ -338,7 +340,7 @@ class java_lang_Class : AllStatic {
338340
static void set_source_file(oop java_class, oop source_file);
339341

340342
static int modifiers(oop java_class);
341-
static void set_modifiers(oop java_class, int value);
343+
static void set_modifiers(oop java_class, u2 value);
342344

343345
static size_t oop_size(oop java_class);
344346
static void set_oop_size(HeapWord* java_class, size_t size);

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -293,11 +293,13 @@ inline Klass* java_lang_Class::as_Klass(oop java_class) {
293293

294294
inline bool java_lang_Class::is_primitive(oop java_class) {
295295
// should assert:
296-
//assert(java_lang_Class::is_instance(java_class), "must be a Class object");
296+
// assert(java_lang_Class::is_instance(java_class), "must be a Class object");
297297
bool is_primitive = (java_class->metadata_field(_klass_offset) == nullptr);
298298

299299
#ifdef ASSERT
300-
if (is_primitive) {
300+
// The heapwalker walks through Classes that have had their Klass pointers removed, so can't assert this.
301+
// assert(is_primitive == java_class->bool_field(_is_primitive_offset), "must match what we told Java");
302+
if (java_class->bool_field(_is_primitive_offset)) {
301303
Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
302304
assert(k == nullptr || is_java_primitive(ArrayKlass::cast(k)->element_type()),
303305
"Should be either the T_VOID primitive or a java primitive");

src/hotspot/share/classfile/vmIntrinsics.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,6 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) {
256256
switch (id) {
257257
case vmIntrinsics::_isInstance:
258258
case vmIntrinsics::_isAssignableFrom:
259-
case vmIntrinsics::_isInterface:
260-
case vmIntrinsics::_isArray:
261-
case vmIntrinsics::_isPrimitive:
262259
case vmIntrinsics::_isHidden:
263260
case vmIntrinsics::_getSuperclass:
264261
case vmIntrinsics::_Class_cast:

src/hotspot/share/classfile/vmIntrinsics.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,12 +304,6 @@ class methodHandle;
304304
do_name( isAssignableFrom_name, "isAssignableFrom") \
305305
do_intrinsic(_isInstance, java_lang_Class, isInstance_name, object_boolean_signature, F_RN) \
306306
do_name( isInstance_name, "isInstance") \
307-
do_intrinsic(_isInterface, java_lang_Class, isInterface_name, void_boolean_signature, F_RN) \
308-
do_name( isInterface_name, "isInterface") \
309-
do_intrinsic(_isArray, java_lang_Class, isArray_name, void_boolean_signature, F_RN) \
310-
do_name( isArray_name, "isArray") \
311-
do_intrinsic(_isPrimitive, java_lang_Class, isPrimitive_name, void_boolean_signature, F_RN) \
312-
do_name( isPrimitive_name, "isPrimitive") \
313307
do_intrinsic(_isHidden, java_lang_Class, isHidden_name, void_boolean_signature, F_RN) \
314308
do_name( isHidden_name, "isHidden") \
315309
do_intrinsic(_getSuperclass, java_lang_Class, getSuperclass_name, void_class_signature, F_RN) \

src/hotspot/share/include/jvm.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -546,21 +546,9 @@ JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
546546
JNIEXPORT jboolean JNICALL
547547
JVM_IsInterface(JNIEnv *env, jclass cls);
548548

549-
JNIEXPORT jobject JNICALL
550-
JVM_GetProtectionDomain(JNIEnv *env, jclass cls);
551-
552-
JNIEXPORT jboolean JNICALL
553-
JVM_IsArrayClass(JNIEnv *env, jclass cls);
554-
555-
JNIEXPORT jboolean JNICALL
556-
JVM_IsPrimitiveClass(JNIEnv *env, jclass cls);
557-
558549
JNIEXPORT jboolean JNICALL
559550
JVM_IsHiddenClass(JNIEnv *env, jclass cls);
560551

561-
JNIEXPORT jint JNICALL
562-
JVM_GetClassModifiers(JNIEnv *env, jclass cls);
563-
564552
JNIEXPORT jobjectArray JNICALL
565553
JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass);
566554

0 commit comments

Comments
 (0)