< prev index next >

src/hotspot/share/prims/jvmtiEnv.cpp

Print this page

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
< prev index next >