2613 if (java_lang_Class::is_primitive(k_mirror)) { 2614 *interface_count_ptr = 0; 2615 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass)); 2616 return JVMTI_ERROR_NONE; 2617 } 2618 JavaThread* current_thread = JavaThread::current(); 2619 HandleMark hm(current_thread); 2620 Klass* k = java_lang_Class::as_Klass(k_mirror); 2621 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS); 2622 2623 // Return CLASS_NOT_PREPARED error as per JVMTI spec. 2624 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) 2625 return JVMTI_ERROR_CLASS_NOT_PREPARED; 2626 2627 if (!k->is_instance_klass()) { 2628 *interface_count_ptr = 0; 2629 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass)); 2630 return JVMTI_ERROR_NONE; 2631 } 2632 2633 Array<Klass*>* interface_list = InstanceKlass::cast(k)->local_interfaces(); 2634 const int result_length = (interface_list == NULL ? 0 : interface_list->length()); 2635 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass)); 2636 for (int i_index = 0; i_index < result_length; i_index += 1) { 2637 Klass* klass_at = interface_list->at(i_index); 2638 assert(klass_at->is_klass(), "interfaces must be Klass*s"); 2639 assert(klass_at->is_interface(), "interfaces must be interfaces"); 2640 oop mirror_at = klass_at->java_mirror(); 2641 Handle handle_at = Handle(current_thread, mirror_at); 2642 result_list[i_index] = (jclass) jni_reference(handle_at); 2643 } 2644 *interface_count_ptr = result_length; 2645 *interfaces_ptr = result_list; 2646 } 2647 2648 return JVMTI_ERROR_NONE; 2649 } /* end GetImplementedInterfaces */ 2650 2651 2652 // k_mirror - may be primitive, this must be checked 2653 // minor_version_ptr - pre-checked for NULL 2654 // major_version_ptr - pre-checked for NULL 2655 jvmtiError 2656 JvmtiEnv::GetClassVersionNumbers(oop k_mirror, jint* minor_version_ptr, jint* major_version_ptr) { 2657 if (java_lang_Class::is_primitive(k_mirror)) { | 2613 if (java_lang_Class::is_primitive(k_mirror)) { 2614 *interface_count_ptr = 0; 2615 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass)); 2616 return JVMTI_ERROR_NONE; 2617 } 2618 JavaThread* current_thread = JavaThread::current(); 2619 HandleMark hm(current_thread); 2620 Klass* k = java_lang_Class::as_Klass(k_mirror); 2621 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS); 2622 2623 // Return CLASS_NOT_PREPARED error as per JVMTI spec. 2624 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) 2625 return JVMTI_ERROR_CLASS_NOT_PREPARED; 2626 2627 if (!k->is_instance_klass()) { 2628 *interface_count_ptr = 0; 2629 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass)); 2630 return JVMTI_ERROR_NONE; 2631 } 2632 2633 Array<InstanceKlass*>* interface_list = InstanceKlass::cast(k)->local_interfaces(); 2634 const int result_length = (interface_list == NULL ? 0 : interface_list->length()); 2635 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass)); 2636 for (int i_index = 0; i_index < result_length; i_index += 1) { 2637 InstanceKlass* klass_at = interface_list->at(i_index); 2638 assert(klass_at->is_klass(), "interfaces must be Klass*s"); 2639 assert(klass_at->is_interface(), "interfaces must be interfaces"); 2640 oop mirror_at = klass_at->java_mirror(); 2641 Handle handle_at = Handle(current_thread, mirror_at); 2642 result_list[i_index] = (jclass) jni_reference(handle_at); 2643 } 2644 *interface_count_ptr = result_length; 2645 *interfaces_ptr = result_list; 2646 } 2647 2648 return JVMTI_ERROR_NONE; 2649 } /* end GetImplementedInterfaces */ 2650 2651 2652 // k_mirror - may be primitive, this must be checked 2653 // minor_version_ptr - pre-checked for NULL 2654 // major_version_ptr - pre-checked for NULL 2655 jvmtiError 2656 JvmtiEnv::GetClassVersionNumbers(oop k_mirror, jint* minor_version_ptr, jint* major_version_ptr) { 2657 if (java_lang_Class::is_primitive(k_mirror)) { |