@@ -2672,9 +2672,7 @@ C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, ARGUMEN
26722672 return JNIHandles::make_local(THREAD, executable);
26732673}
26742674
2675- C2V_VMENTRY_NULL (jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index))
2676- requireInHotSpot(" asReflectionField" , JVMCI_CHECK_NULL);
2677- Klass* klass = UNPACK_PAIR(Klass, klass);
2675+ static InstanceKlass* check_field (Klass* klass, jint index, JVMCI_TRAPS) {
26782676 if (!klass->is_instance_klass ()) {
26792677 JVMCI_THROW_MSG_NULL (IllegalArgumentException,
26802678 err_msg (" Expected non-primitive type, got %s" , klass->external_name ()));
@@ -2684,11 +2682,100 @@ C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAI
26842682 JVMCI_THROW_MSG_NULL (IllegalArgumentException,
26852683 err_msg (" Field index %d out of bounds for %s" , index, klass->external_name ()));
26862684 }
2685+ return iklass;
2686+ }
2687+
2688+ C2V_VMENTRY_NULL (jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index))
2689+ requireInHotSpot(" asReflectionField" , JVMCI_CHECK_NULL);
2690+ Klass* klass = UNPACK_PAIR(Klass, klass);
2691+ InstanceKlass* iklass = check_field(klass, index, JVMCIENV);
26872692 fieldDescriptor fd (iklass, index);
26882693 oop reflected = Reflection::new_field(&fd, CHECK_NULL);
26892694 return JNIHandles::make_local(THREAD, reflected);
26902695}
26912696
2697+ static jbyteArray get_encoded_annotation_data (InstanceKlass* holder, AnnotationArray* annotations_array, bool for_class,
2698+ jint filter_length, jlong filter_klass_pointers,
2699+ JavaThread* THREAD, JVMCIEnv* JVMCIENV) {
2700+ // Get a ConstantPool object for annotation parsing
2701+ Handle jcp = reflect_ConstantPool::create (CHECK_NULL);
2702+ reflect_ConstantPool::set_cp (jcp (), holder->constants ());
2703+
2704+ // load VMSupport
2705+ Symbol* klass = vmSymbols::jdk_internal_vm_VMSupport ();
2706+ Klass* k = SystemDictionary::resolve_or_fail (klass, true , CHECK_NULL);
2707+
2708+ InstanceKlass* vm_support = InstanceKlass::cast (k);
2709+ if (vm_support->should_be_initialized ()) {
2710+ vm_support->initialize (CHECK_NULL);
2711+ }
2712+
2713+ typeArrayOop annotations_oop = Annotations::make_java_array (annotations_array, CHECK_NULL);
2714+ typeArrayHandle annotations = typeArrayHandle (THREAD, annotations_oop);
2715+
2716+ InstanceKlass** filter = filter_length == 1 ?
2717+ (InstanceKlass**) &filter_klass_pointers:
2718+ (InstanceKlass**) filter_klass_pointers;
2719+ objArrayOop filter_oop = oopFactory::new_objectArray (filter_length, CHECK_NULL);
2720+ objArrayHandle filter_classes (THREAD, filter_oop);
2721+ for (int i = 0 ; i < filter_length; i++) {
2722+ filter_classes->obj_at_put (i, filter[i]->java_mirror ());
2723+ }
2724+
2725+ // invoke VMSupport.encodeAnnotations
2726+ JavaValue result (T_OBJECT);
2727+ JavaCallArguments args;
2728+ args.push_oop (annotations);
2729+ args.push_oop (Handle (THREAD, holder->java_mirror ()));
2730+ args.push_oop (jcp);
2731+ args.push_int (for_class);
2732+ args.push_oop (filter_classes);
2733+ Symbol* signature = vmSymbols::encodeAnnotations_signature ();
2734+ JavaCalls::call_static (&result,
2735+ vm_support,
2736+ vmSymbols::encodeAnnotations_name (),
2737+ signature,
2738+ &args,
2739+ CHECK_NULL);
2740+
2741+ oop res = result.get_oop ();
2742+ if (JVMCIENV->is_hotspot ()) {
2743+ return (jbyteArray) JNIHandles::make_local (THREAD, res);
2744+ }
2745+
2746+ typeArrayOop ba = typeArrayOop (res);
2747+ int ba_len = ba->length ();
2748+ jbyte* ba_buf = NEW_RESOURCE_ARRAY_IN_THREAD_RETURN_NULL (THREAD, jbyte, ba_len);
2749+ if (ba_buf == nullptr ) {
2750+ JVMCI_THROW_MSG_NULL (InternalError,
2751+ err_msg (" could not allocate %d bytes" , ba_len));
2752+
2753+ }
2754+ memcpy (ba_buf, ba->byte_at_addr (0 ), ba_len);
2755+ JVMCIPrimitiveArray ba_dest = JVMCIENV->new_byteArray (ba_len, JVMCI_CHECK_NULL);
2756+ JVMCIENV->copy_bytes_from (ba_buf, ba_dest, 0 , ba_len);
2757+ return JVMCIENV->get_jbyteArray (ba_dest);
2758+ }
2759+
2760+ C2V_VMENTRY_NULL (jbyteArray, getEncodedClassAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass),
2761+ jobject filter, jint filter_length, jlong filter_klass_pointers))
2762+ InstanceKlass* holder = InstanceKlass::cast(UNPACK_PAIR(Klass, klass));
2763+ return get_encoded_annotation_data(holder, holder->class_annotations (), true, filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2764+ C2V_END
2765+
2766+ C2V_VMENTRY_NULL (jbyteArray, getEncodedExecutableAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(method),
2767+ jobject filter, jint filter_length, jlong filter_klass_pointers))
2768+ methodHandle method(THREAD, UNPACK_PAIR(Method, method));
2769+ return get_encoded_annotation_data(method->method_holder (), method->annotations(), false, filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2770+ C2V_END
2771+
2772+ C2V_VMENTRY_NULL (jbyteArray, getEncodedFieldAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index,
2773+ jobject filter, jint filter_length, jlong filter_klass_pointers))
2774+ InstanceKlass* holder = check_field(InstanceKlass::cast(UNPACK_PAIR(Klass, klass)), index, JVMCIENV);
2775+ fieldDescriptor fd (holder, index);
2776+ return get_encoded_annotation_data(holder, fd.annotations(), false , filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2777+ C2V_END
2778+
26922779C2V_VMENTRY_NULL (jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
26932780 FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
26942781 int result_length = 0 ;
@@ -2969,6 +3056,9 @@ JNINativeMethod CompilerToVM::methods[] = {
29693056 {CC " getCode" , CC " (" HS_INSTALLED_CODE " )[B" , FN_PTR (getCode)},
29703057 {CC " asReflectionExecutable" , CC " (" HS_METHOD2 " )" REFLECTION_EXECUTABLE, FN_PTR (asReflectionExecutable)},
29713058 {CC " asReflectionField" , CC " (" HS_KLASS2 " I)" REFLECTION_FIELD, FN_PTR (asReflectionField)},
3059+ {CC " getEncodedClassAnnotationData" , CC " (" HS_KLASS2 OBJECT " IJ)[B" , FN_PTR (getEncodedClassAnnotationData)},
3060+ {CC " getEncodedExecutableAnnotationData" , CC " (" HS_METHOD2 OBJECT " IJ)[B" , FN_PTR (getEncodedExecutableAnnotationData)},
3061+ {CC " getEncodedFieldAnnotationData" , CC " (" HS_KLASS2 " I" OBJECT " IJ)[B" , FN_PTR (getEncodedFieldAnnotationData)},
29723062 {CC " getFailedSpeculations" , CC " (J[[B)[[B" , FN_PTR (getFailedSpeculations)},
29733063 {CC " getFailedSpeculationsAddress" , CC " (" HS_METHOD2 " )J" , FN_PTR (getFailedSpeculationsAddress)},
29743064 {CC " releaseFailedSpeculations" , CC " (J)V" , FN_PTR (releaseFailedSpeculations)},
0 commit comments