2756 *source_name_ptr = (char *) jvmtiMalloc(strlen(sfncp)+1);
2757 strcpy(*source_name_ptr, sfncp);
2758 }
2759
2760 return JVMTI_ERROR_NONE;
2761 } /* end GetSourceFileName */
2762
2763
2764 // k_mirror - may be primitive, this must be checked
2765 // modifiers_ptr - pre-checked for null
2766 jvmtiError
2767 JvmtiEnv::GetClassModifiers(oop k_mirror, jint* modifiers_ptr) {
2768 JavaThread* current_thread = JavaThread::current();
2769 jint result = 0;
2770 if (!java_lang_Class::is_primitive(k_mirror)) {
2771 Klass* k = java_lang_Class::as_Klass(k_mirror);
2772 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2773 result = k->compute_modifier_flags();
2774
2775 // Reset the deleted ACC_SUPER bit (deleted in compute_modifier_flags()).
2776 if (k->is_super()) {
2777 result |= JVM_ACC_SUPER;
2778 }
2779 } else {
2780 result = (JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
2781 }
2782 *modifiers_ptr = result;
2783
2784 return JVMTI_ERROR_NONE;
2785 } /* end GetClassModifiers */
2786
2787
2788 // k_mirror - may be primitive, this must be checked
2789 // method_count_ptr - pre-checked for null
2790 // methods_ptr - pre-checked for null
2791 jvmtiError
2792 JvmtiEnv::GetClassMethods(oop k_mirror, jint* method_count_ptr, jmethodID** methods_ptr) {
2793 JavaThread* current_thread = JavaThread::current();
2794 HandleMark hm(current_thread);
2795
2796 if (java_lang_Class::is_primitive(k_mirror)) {
2797 *method_count_ptr = 0;
2798 *methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
2896 return JVMTI_ERROR_NONE;
2897 }
2898
2899
2900 InstanceKlass* ik = InstanceKlass::cast(k);
2901
2902 int result_count = 0;
2903 // First, count the fields.
2904 FilteredFieldStream flds(ik, true, true);
2905 result_count = flds.field_count();
2906
2907 // Allocate the result and fill it in
2908 jfieldID* result_list = (jfieldID*) jvmtiMalloc(result_count * sizeof(jfieldID));
2909 // The JVMTI spec requires fields in the order they occur in the class file,
2910 // this is the reverse order of what FieldStream hands out.
2911 int id_index = (result_count - 1);
2912
2913 for (FilteredFieldStream src_st(ik, true, true); !src_st.eos(); src_st.next()) {
2914 result_list[id_index--] = jfieldIDWorkaround::to_jfieldID(
2915 ik, src_st.offset(),
2916 src_st.access_flags().is_static());
2917 }
2918 assert(id_index == -1, "just checking");
2919 // Fill in the results
2920 *field_count_ptr = result_count;
2921 *fields_ptr = result_list;
2922
2923 return JVMTI_ERROR_NONE;
2924 } /* end GetClassFields */
2925
2926
2927 // k_mirror - may be primitive, this must be checked
2928 // interface_count_ptr - pre-checked for null
2929 // interfaces_ptr - pre-checked for null
2930 jvmtiError
2931 JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
2932 {
2933 if (java_lang_Class::is_primitive(k_mirror)) {
2934 *interface_count_ptr = 0;
2935 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2936 return JVMTI_ERROR_NONE;
2937 }
2938 JavaThread* current_thread = JavaThread::current();
2939 HandleMark hm(current_thread);
2940 Klass* k = java_lang_Class::as_Klass(k_mirror);
2941 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2942
2943 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
2944 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
2945 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2946
2947 if (!k->is_instance_klass()) {
2948 *interface_count_ptr = 0;
2949 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2950 return JVMTI_ERROR_NONE;
2951 }
2952
2953 Array<InstanceKlass*>* interface_list = InstanceKlass::cast(k)->local_interfaces();
2954 const int result_length = (interface_list == nullptr ? 0 : interface_list->length());
2955 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass));
2956 for (int i_index = 0; i_index < result_length; i_index += 1) {
2957 InstanceKlass* klass_at = interface_list->at(i_index);
2958 assert(klass_at->is_klass(), "interfaces must be Klass*s");
2959 assert(klass_at->is_interface(), "interfaces must be interfaces");
2960 oop mirror_at = klass_at->java_mirror();
2961 Handle handle_at = Handle(current_thread, mirror_at);
2962 result_list[i_index] = (jclass) jni_reference(handle_at);
2963 }
2964 *interface_count_ptr = result_length;
2965 *interfaces_ptr = result_list;
2966 }
2967
2968 return JVMTI_ERROR_NONE;
2969 } /* end GetImplementedInterfaces */
2970
2971
2972 // k_mirror - may be primitive, this must be checked
2973 // minor_version_ptr - pre-checked for null
2974 // major_version_ptr - pre-checked for null
|
2756 *source_name_ptr = (char *) jvmtiMalloc(strlen(sfncp)+1);
2757 strcpy(*source_name_ptr, sfncp);
2758 }
2759
2760 return JVMTI_ERROR_NONE;
2761 } /* end GetSourceFileName */
2762
2763
2764 // k_mirror - may be primitive, this must be checked
2765 // modifiers_ptr - pre-checked for null
2766 jvmtiError
2767 JvmtiEnv::GetClassModifiers(oop k_mirror, jint* modifiers_ptr) {
2768 JavaThread* current_thread = JavaThread::current();
2769 jint result = 0;
2770 if (!java_lang_Class::is_primitive(k_mirror)) {
2771 Klass* k = java_lang_Class::as_Klass(k_mirror);
2772 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2773 result = k->compute_modifier_flags();
2774
2775 // Reset the deleted ACC_SUPER bit (deleted in compute_modifier_flags()).
2776 // if (k->is_super()) {
2777 // result |= JVM_ACC_SUPER;
2778 // }
2779 } else {
2780 result = (JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
2781 }
2782 *modifiers_ptr = result;
2783
2784 return JVMTI_ERROR_NONE;
2785 } /* end GetClassModifiers */
2786
2787
2788 // k_mirror - may be primitive, this must be checked
2789 // method_count_ptr - pre-checked for null
2790 // methods_ptr - pre-checked for null
2791 jvmtiError
2792 JvmtiEnv::GetClassMethods(oop k_mirror, jint* method_count_ptr, jmethodID** methods_ptr) {
2793 JavaThread* current_thread = JavaThread::current();
2794 HandleMark hm(current_thread);
2795
2796 if (java_lang_Class::is_primitive(k_mirror)) {
2797 *method_count_ptr = 0;
2798 *methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
2896 return JVMTI_ERROR_NONE;
2897 }
2898
2899
2900 InstanceKlass* ik = InstanceKlass::cast(k);
2901
2902 int result_count = 0;
2903 // First, count the fields.
2904 FilteredFieldStream flds(ik, true, true);
2905 result_count = flds.field_count();
2906
2907 // Allocate the result and fill it in
2908 jfieldID* result_list = (jfieldID*) jvmtiMalloc(result_count * sizeof(jfieldID));
2909 // The JVMTI spec requires fields in the order they occur in the class file,
2910 // this is the reverse order of what FieldStream hands out.
2911 int id_index = (result_count - 1);
2912
2913 for (FilteredFieldStream src_st(ik, true, true); !src_st.eos(); src_st.next()) {
2914 result_list[id_index--] = jfieldIDWorkaround::to_jfieldID(
2915 ik, src_st.offset(),
2916 src_st.access_flags().is_static(),
2917 src_st.field_descriptor().is_flat());
2918 }
2919 assert(id_index == -1, "just checking");
2920 // Fill in the results
2921 *field_count_ptr = result_count;
2922 *fields_ptr = result_list;
2923
2924 return JVMTI_ERROR_NONE;
2925 } /* end GetClassFields */
2926
2927
2928 // k_mirror - may be primitive, this must be checked
2929 // interface_count_ptr - pre-checked for null
2930 // interfaces_ptr - pre-checked for null
2931 jvmtiError
2932 JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
2933 {
2934 if (java_lang_Class::is_primitive(k_mirror)) {
2935 *interface_count_ptr = 0;
2936 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2937 return JVMTI_ERROR_NONE;
2938 }
2939 JavaThread* current_thread = JavaThread::current();
2940 HandleMark hm(current_thread);
2941 Klass* k = java_lang_Class::as_Klass(k_mirror);
2942 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2943
2944 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
2945 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
2946 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2947
2948 if (!k->is_instance_klass()) {
2949 *interface_count_ptr = 0;
2950 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2951 return JVMTI_ERROR_NONE;
2952 }
2953
2954 InstanceKlass* ik = InstanceKlass::cast(k);
2955 Array<InstanceKlass*>* interface_list = ik->local_interfaces();
2956 int result_length = (interface_list == nullptr ? 0 : interface_list->length());
2957 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass));
2958 for (int i_index = 0; i_index < result_length; i_index += 1) {
2959 InstanceKlass* klass_at = interface_list->at(i_index);
2960 assert(klass_at->is_klass(), "interfaces must be Klass*s");
2961 assert(klass_at->is_interface(), "interfaces must be interfaces");
2962 oop mirror_at = klass_at->java_mirror();
2963 Handle handle_at = Handle(current_thread, mirror_at);
2964 result_list[i_index] = (jclass) jni_reference(handle_at);
2965 }
2966 *interface_count_ptr = result_length;
2967 *interfaces_ptr = result_list;
2968 }
2969
2970 return JVMTI_ERROR_NONE;
2971 } /* end GetImplementedInterfaces */
2972
2973
2974 // k_mirror - may be primitive, this must be checked
2975 // minor_version_ptr - pre-checked for null
2976 // major_version_ptr - pre-checked for null
|