Skip to content

Commit 5645c32

Browse files
committed
added ResolvedJavaRecordComponent
1 parent e84b28b commit 5645c32

26 files changed

+646
-69
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "oops/instanceKlass.inline.hpp"
5050
#include "oops/instanceMirrorKlass.hpp"
5151
#include "oops/method.inline.hpp"
52+
#include "oops/recordComponent.hpp"
5253
#include "oops/objArrayKlass.inline.hpp"
5354
#include "oops/trainingData.hpp"
5455
#include "oops/typeArrayOop.inline.hpp"
@@ -401,7 +402,7 @@ C2V_VMENTRY_NULL(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject e
401402
methodHandle method (THREAD, InstanceKlass::cast(holder)->method_with_idnum(slot));
402403
JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
403404
return JVMCIENV->get_jobject(result);
404-
}
405+
C2V_END
405406

406407
C2V_VMENTRY_PREFIX(jboolean, updateCompilerThreadCanCallJava, (JNIEnv* env, jobject, jboolean newState))
407408
return CompilerThreadCanCallJava::update(thread, newState) != nullptr;
@@ -2246,6 +2247,28 @@ C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, ARGUME
22462247
return JVMCIENV->get_jobjectArray(methods);
22472248
C2V_END
22482249

2250+
C2V_VMENTRY_NULL(jobjectArray, getRecordComponents, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass)))
2251+
Klass* klass = UNPACK_PAIR(Klass, klass);
2252+
if (klass == nullptr) {
2253+
JVMCI_THROW_NULL(NullPointerException);
2254+
}
2255+
if (!klass->is_instance_klass()) {
2256+
return nullptr;
2257+
}
2258+
2259+
InstanceKlass* iklass = InstanceKlass::cast(klass);
2260+
Array<RecordComponent*>* components = iklass->record_components();
2261+
if (components == nullptr) {
2262+
return nullptr;
2263+
}
2264+
JVMCIObjectArray res = JVMCIENV->new_ResolvedJavaRecordComponent_array(components->length(), JVMCI_CHECK_NULL);
2265+
for (int i = 0; i < components->length(); i++) {
2266+
JVMCIObject component = JVMCIENV->new_HotSpotResolvedJavaRecordComponent(JVMCIENV->wrap(klass_obj), i, components->at(i), JVMCI_CHECK_NULL);
2267+
JVMCIENV->put_object_at(res, i, component);
2268+
}
2269+
return JVMCIENV->get_jobjectArray(res);
2270+
C2V_END
2271+
22492272
C2V_VMENTRY_NULL(jobjectArray, getAllMethods, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass)))
22502273
Klass* klass = UNPACK_PAIR(Klass, klass);
22512274
if (klass == nullptr) {
@@ -3107,18 +3130,35 @@ C2V_VMENTRY_NULL(jbyteArray, getEncodedExecutableAnnotationValues, (JNIEnv* env,
31073130
return get_encoded_annotation_values(method->method_holder(), raw_annotations, category, memberType, THREAD, JVMCIENV);
31083131
C2V_END
31093132

3110-
C2V_VMENTRY_NULL(jbyteArray, getEncodedFieldAnnotationValues, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index, jint category))
3133+
C2V_VMENTRY_NULL(jbyteArray, getEncodedFieldAnnotationValues, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index, jboolean is_field, jint category))
31113134
CompilerThreadCanCallJava canCallJava(thread, true); // Requires Java support
31123135
InstanceKlass* holder = check_field(InstanceKlass::cast(UNPACK_PAIR(Klass, klass)), index, JVMCI_CHECK_NULL);
3113-
fieldDescriptor fd(holder, index);
3114-
AnnotationArray* raw_annotations;
3115-
if (category == CompilerToVM::DECLARED_ANNOTATIONS) {
3116-
raw_annotations = fd.annotations();
3117-
} else if (category == CompilerToVM::TYPE_ANNOTATIONS) {
3118-
raw_annotations = fd.type_annotations();
3136+
AnnotationArray* raw_annotations = nullptr;
3137+
if (is_field) {
3138+
fieldDescriptor fd(holder, index);
3139+
if (category == CompilerToVM::DECLARED_ANNOTATIONS) {
3140+
raw_annotations = fd.annotations();
3141+
} else if (category == CompilerToVM::TYPE_ANNOTATIONS) {
3142+
raw_annotations = fd.type_annotations();
3143+
} else {
3144+
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
3145+
err_msg("%d", category));
3146+
}
31193147
} else {
3120-
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
3121-
err_msg("%d", category));
3148+
Array<RecordComponent*>* components = holder->record_components();
3149+
if (components == nullptr) {
3150+
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
3151+
err_msg("%s has no record components", holder->name()->as_C_string()));
3152+
}
3153+
RecordComponent* rc = components->at(index);
3154+
if (category == CompilerToVM::DECLARED_ANNOTATIONS) {
3155+
raw_annotations = rc->annotations();
3156+
} else if (category == CompilerToVM::TYPE_ANNOTATIONS) {
3157+
raw_annotations = rc->type_annotations();
3158+
} else {
3159+
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
3160+
err_msg("%d", category));
3161+
}
31223162
}
31233163
return get_encoded_annotation_values(holder, raw_annotations, category, nullptr, THREAD, JVMCIENV);
31243164
C2V_END
@@ -3324,13 +3364,13 @@ C2V_END
33243364
#define OBJECT "Ljava/lang/Object;"
33253365
#define CLASS "Ljava/lang/Class;"
33263366
#define OBJECTCONSTANT "Ljdk/vm/ci/hotspot/HotSpotObjectConstantImpl;"
3327-
#define EXECUTABLE "Ljava/lang/reflect/Executable;"
33283367
#define STACK_TRACE_ELEMENT "Ljava/lang/StackTraceElement;"
33293368
#define INSTALLED_CODE "Ljdk/vm/ci/code/InstalledCode;"
33303369
#define BYTECODE_FRAME "Ljdk/vm/ci/code/BytecodeFrame;"
33313370
#define JAVACONSTANT "Ljdk/vm/ci/meta/JavaConstant;"
33323371
#define INSPECTED_FRAME_VISITOR "Ljdk/vm/ci/code/stack/InspectedFrameVisitor;"
33333372
#define RESOLVED_METHOD "Ljdk/vm/ci/meta/ResolvedJavaMethod;"
3373+
#define RESOLVED_RECORD_COMPONENT "Ljdk/vm/ci/meta/ResolvedJavaRecordComponent;"
33343374
#define FIELDINFO "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl$FieldInfo;"
33353375
#define HS_RESOLVED_TYPE "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaType;"
33363376
#define HS_INSTALLED_CODE "Ljdk/vm/ci/hotspot/HotSpotInstalledCode;"
@@ -3339,8 +3379,8 @@ C2V_END
33393379
#define HS_CONFIG "Ljdk/vm/ci/hotspot/HotSpotVMConfig;"
33403380
#define HS_STACK_FRAME_REF "Ljdk/vm/ci/hotspot/HotSpotStackFrameReference;"
33413381
#define HS_SPECULATION_LOG "Ljdk/vm/ci/hotspot/HotSpotSpeculationLog;"
3342-
#define REFLECTION_EXECUTABLE "Ljava/lang/reflect/Executable;"
3343-
#define REFLECTION_FIELD "Ljava/lang/reflect/Field;"
3382+
#define EXECUTABLE "Ljava/lang/reflect/Executable;"
3383+
#define FIELD "Ljava/lang/reflect/Field;"
33443384

33453385
// Types wrapping VM pointers. The ...2 macro is for a pair: (wrapper, pointer)
33463386
#define HS_METHOD "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;"
@@ -3436,6 +3476,7 @@ JNINativeMethod CompilerToVM::methods[] = {
34363476
{CC "boxPrimitive", CC "(" OBJECT ")" OBJECTCONSTANT, FN_PTR(boxPrimitive)},
34373477
{CC "getDeclaredConstructors", CC "(" HS_KLASS2 ")[" RESOLVED_METHOD, FN_PTR(getDeclaredConstructors)},
34383478
{CC "getDeclaredMethods", CC "(" HS_KLASS2 ")[" RESOLVED_METHOD, FN_PTR(getDeclaredMethods)},
3479+
{CC "getRecordComponents", CC "(" HS_KLASS2 ")[" RESOLVED_RECORD_COMPONENT, FN_PTR(getRecordComponents)},
34393480
{CC "getAllMethods", CC "(" HS_KLASS2 ")[" RESOLVED_METHOD, FN_PTR(getAllMethods)},
34403481
{CC "getDeclaredFieldsInfo", CC "(" HS_KLASS2 ")[" FIELDINFO, FN_PTR(getDeclaredFieldsInfo)},
34413482
{CC "readStaticFieldValue", CC "(" HS_KLASS2 "JC)" JAVACONSTANT, FN_PTR(readStaticFieldValue)},
@@ -3462,11 +3503,11 @@ JNINativeMethod CompilerToVM::methods[] = {
34623503
{CC "unhand", CC "(J)" OBJECT, FN_PTR(unhand)},
34633504
{CC "updateHotSpotNmethod", CC "(" HS_NMETHOD ")V", FN_PTR(updateHotSpotNmethod)},
34643505
{CC "getCode", CC "(" HS_INSTALLED_CODE ")[B", FN_PTR(getCode)},
3465-
{CC "asReflectionExecutable", CC "(" HS_METHOD2 ")" REFLECTION_EXECUTABLE, FN_PTR(asReflectionExecutable)},
3466-
{CC "asReflectionField", CC "(" HS_KLASS2 "I)" REFLECTION_FIELD, FN_PTR(asReflectionField)},
3506+
{CC "asReflectionExecutable", CC "(" HS_METHOD2 ")" EXECUTABLE, FN_PTR(asReflectionExecutable)},
3507+
{CC "asReflectionField", CC "(" HS_KLASS2 "I)" FIELD, FN_PTR(asReflectionField)},
34673508
{CC "getEncodedClassAnnotationValues", CC "(" HS_KLASS2 "I)[B", FN_PTR(getEncodedClassAnnotationValues)},
34683509
{CC "getEncodedExecutableAnnotationValues", CC "(" HS_METHOD2 HS_KLASS2 "I)[B", FN_PTR(getEncodedExecutableAnnotationValues)},
3469-
{CC "getEncodedFieldAnnotationValues", CC "(" HS_KLASS2 "II)[B", FN_PTR(getEncodedFieldAnnotationValues)},
3510+
{CC "getEncodedFieldAnnotationValues", CC "(" HS_KLASS2 "IZI)[B", FN_PTR(getEncodedFieldAnnotationValues)},
34703511
{CC "getFailedSpeculations", CC "(J[[B)[[B", FN_PTR(getFailedSpeculations)},
34713512
{CC "getFailedSpeculationsAddress", CC "(" HS_METHOD2 ")J", FN_PTR(getFailedSpeculationsAddress)},
34723513
{CC "releaseFailedSpeculations", CC "(J)V", FN_PTR(releaseFailedSpeculations)},

src/hotspot/share/jvmci/jvmciEnv.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "memory/resourceArea.hpp"
3939
#include "memory/universe.hpp"
4040
#include "oops/objArrayKlass.hpp"
41+
#include "oops/recordComponent.hpp"
4142
#include "oops/typeArrayOop.inline.hpp"
4243
#include "prims/jvmtiExport.hpp"
4344
#include "runtime/arguments.hpp"
@@ -1608,6 +1609,30 @@ JVMCIObject JVMCIEnv::new_FieldInfo(FieldInfo* fieldinfo, JVMCI_TRAPS) {
16081609
}
16091610
}
16101611

1612+
JVMCIObject JVMCIEnv::new_HotSpotResolvedJavaRecordComponent(JVMCIObject declaringRecord, int index, RecordComponent* rc, JVMCI_TRAPS) {
1613+
JavaThread* THREAD = JavaThread::current();
1614+
if (is_hotspot()) {
1615+
JavaCallArguments args;
1616+
args.push_oop(Handle(THREAD, HotSpotJVMCI::resolve(declaringRecord)));
1617+
args.push_int(index);
1618+
args.push_int(rc->name_index());
1619+
args.push_int(rc->descriptor_index());
1620+
Handle obj_h = JavaCalls::construct_new_instance(HotSpotJVMCI::HotSpotResolvedJavaRecordComponent::klass(),
1621+
vmSymbols::HotSpotResolvedJavaRecordComponent_constructor_signature(),
1622+
&args,
1623+
THREAD);
1624+
return wrap(obj_h());
1625+
} else {
1626+
JNIAccessMark jni(this, THREAD);
1627+
jobject result = jni()->NewObject(JNIJVMCI::HotSpotResolvedJavaRecordComponent::clazz(),
1628+
JNIJVMCI::HotSpotResolvedJavaRecordComponent::constructor(),
1629+
(jint)rc->name_index(),
1630+
(jint)rc->descriptor_index());
1631+
1632+
return wrap(result);
1633+
}
1634+
}
1635+
16111636
JVMCIObject JVMCIEnv::get_object_constant(oop objOop, bool compressed, bool dont_register) {
16121637
JavaThread* THREAD = JavaThread::current(); // For exception macros.
16131638
Handle obj = Handle(THREAD, objOop);

src/hotspot/share/jvmci/jvmciEnv.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ class JVMCIEnv : public ResourceObj {
433433
JVMCIObject new_HotSpotStackFrameReference(JVMCI_TRAPS);
434434
JVMCIObject new_JVMCIError(JVMCI_TRAPS);
435435
JVMCIObject new_FieldInfo(FieldInfo* fieldinfo, JVMCI_TRAPS);
436+
JVMCIObject new_HotSpotResolvedJavaRecordComponent(JVMCIObject declaringRecord, int index, RecordComponent* rc, JVMCI_TRAPS);
436437

437438
// Makes a handle to a HotSpot heap object. These handles are
438439
// individually reclaimed by JVMCIRuntime::destroy_oop_handle and

src/hotspot/share/jvmci/jvmciJavaClasses.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@
8484
start_class(HotSpotResolvedJavaMethodImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaMethodImpl) \
8585
long_field(HotSpotResolvedJavaMethodImpl, methodHandle) \
8686
end_class \
87+
start_class(HotSpotResolvedJavaRecordComponent, jdk_vm_ci_hotspot_HotSpotResolvedJavaRecordComponent) \
88+
jvmci_constructor(HotSpotResolvedJavaRecordComponent, "(Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;III)V") \
89+
end_class \
8790
start_class(HotSpotMethodData, jdk_vm_ci_hotspot_HotSpotMethodData) \
8891
long_field(HotSpotMethodData, methodDataPointer) \
8992
end_class \
@@ -166,6 +169,8 @@
166169
end_class \
167170
start_class(ResolvedJavaMethod, jdk_vm_ci_meta_ResolvedJavaMethod) \
168171
end_class \
172+
start_class(ResolvedJavaRecordComponent, jdk_vm_ci_meta_ResolvedJavaRecordComponent) \
173+
end_class \
169174
start_class(PrimitiveConstant, jdk_vm_ci_meta_PrimitiveConstant) \
170175
object_field(PrimitiveConstant, kind, "Ljdk/vm/ci/meta/JavaKind;") \
171176
long_field(PrimitiveConstant, primitive) \

src/hotspot/share/jvmci/jvmciRuntime.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,13 @@ class JavaVMRefsInitialization: public StackObj {
13941394
}
13951395
};
13961396

1397+
#ifdef ASSERT
1398+
static void assert_equals(const char* desc, int expect, int actual) {
1399+
assert(expect == actual, "%s: %d != %d", desc, expect, actual);
1400+
1401+
}
1402+
#endif
1403+
13971404
void JVMCIRuntime::initialize(JVMCI_TRAPS) {
13981405
// Check first without _lock
13991406
if (_init_state == fully_initialized) {
@@ -1464,6 +1471,11 @@ void JVMCIRuntime::initialize(JVMCI_TRAPS) {
14641471
create_jvmci_primitive_type(T_VOID, JVMCI_CHECK_EXIT_((void)0));
14651472

14661473
DEBUG_ONLY(CodeInstaller::verify_bci_constants(JVMCIENV);)
1474+
1475+
DEBUG_ONLY(assert_equals("DECLARED_ANNOTATIONS", CompilerToVM::DECLARED_ANNOTATIONS, JVMCIENV->get_VMSupport_DECLARED_ANNOTATIONS()));
1476+
DEBUG_ONLY(assert_equals("PARAMETER_ANNOTATIONS", CompilerToVM::PARAMETER_ANNOTATIONS, JVMCIENV->get_VMSupport_PARAMETER_ANNOTATIONS()));
1477+
DEBUG_ONLY(assert_equals("TYPE_ANNOTATIONS", CompilerToVM::TYPE_ANNOTATIONS, JVMCIENV->get_VMSupport_TYPE_ANNOTATIONS()));
1478+
DEBUG_ONLY(assert_equals("ANNOTATION_MEMBER_VALUE", CompilerToVM::ANNOTATION_MEMBER_VALUE, JVMCIENV->get_VMSupport_ANNOTATION_MEMBER_VALUE()));
14671479
}
14681480

14691481
_init_state = fully_initialized;
@@ -1510,23 +1522,11 @@ JVMCIObject JVMCIRuntime::get_HotSpotJVMCIRuntime(JVMCI_TRAPS) {
15101522
return _HotSpotJVMCIRuntime_instance;
15111523
}
15121524

1513-
#ifdef ASSERT
1514-
static void assert_equals(const char* desc, int expect, int actual) {
1515-
assert(expect == actual, "%s: %d != %d", desc, expect, actual);
1516-
1517-
}
1518-
#endif
1519-
15201525
// Implementation of CompilerToVM.registerNatives()
15211526
// When called from libjvmci, `libjvmciOrHotspotEnv` is a libjvmci env so use JVM_ENTRY_NO_ENV.
15221527
JVM_ENTRY_NO_ENV(void, JVM_RegisterJVMCINatives(JNIEnv *libjvmciOrHotspotEnv, jclass c2vmClass))
15231528
JVMCIENV_FROM_JNI(thread, libjvmciOrHotspotEnv);
15241529

1525-
DEBUG_ONLY(assert_equals("DECLARED_ANNOTATIONS", CompilerToVM::DECLARED_ANNOTATIONS, JVMCIENV->get_VMSupport_DECLARED_ANNOTATIONS()));
1526-
DEBUG_ONLY(assert_equals("PARAMETER_ANNOTATIONS", CompilerToVM::PARAMETER_ANNOTATIONS, JVMCIENV->get_VMSupport_PARAMETER_ANNOTATIONS()));
1527-
DEBUG_ONLY(assert_equals("TYPE_ANNOTATIONS", CompilerToVM::TYPE_ANNOTATIONS, JVMCIENV->get_VMSupport_TYPE_ANNOTATIONS()));
1528-
DEBUG_ONLY(assert_equals("ANNOTATION_MEMBER_VALUE", CompilerToVM::ANNOTATION_MEMBER_VALUE, JVMCIENV->get_VMSupport_ANNOTATION_MEMBER_VALUE()));
1529-
15301530
if (!EnableJVMCI) {
15311531
JVMCI_THROW_MSG(InternalError, JVMCI_NOT_ENABLED_ERROR_MESSAGE);
15321532
}

src/hotspot/share/jvmci/vmStructs_jvmci.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@
223223
volatile_nonstatic_field(InstanceKlass, _init_thread, JavaThread*) \
224224
nonstatic_field(InstanceKlass, _misc_flags._flags, u2) \
225225
nonstatic_field(InstanceKlass, _annotations, Annotations*) \
226+
nonstatic_field(InstanceKlass, _record_components, Array<RecordComponent*>*) \
226227
\
227228
volatile_nonstatic_field(JavaFrameAnchor, _last_Java_sp, intptr_t*) \
228229
volatile_nonstatic_field(JavaFrameAnchor, _last_Java_pc, address) \

0 commit comments

Comments
 (0)