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));
2889 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
2890 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2891 }
2892
2893 if (!k->is_instance_klass()) {
2894 *field_count_ptr = 0;
2895 *fields_ptr = (jfieldID*) jvmtiMalloc(0 * sizeof(jfieldID));
2896 return JVMTI_ERROR_NONE;
2897 }
2898
2899 InstanceKlass* ik = InstanceKlass::cast(k);
2900
2901 FilteredJavaFieldStream flds(ik);
2902
2903 int result_count = flds.field_count();
2904
2905 // Allocate the result and fill it in.
2906 jfieldID* result_list = (jfieldID*)jvmtiMalloc(result_count * sizeof(jfieldID));
2907 for (int i = 0; i < result_count; i++, flds.next()) {
2908 result_list[i] = jfieldIDWorkaround::to_jfieldID(ik, flds.offset(),
2909 flds.access_flags().is_static());
2910 }
2911 assert(flds.done(), "just checking");
2912
2913 // Fill in the results
2914 *field_count_ptr = result_count;
2915 *fields_ptr = result_list;
2916
2917 return JVMTI_ERROR_NONE;
2918 } /* end GetClassFields */
2919
2920
2921 // k_mirror - may be primitive, this must be checked
2922 // interface_count_ptr - pre-checked for null
2923 // interfaces_ptr - pre-checked for null
2924 jvmtiError
2925 JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
2926 {
2927 if (java_lang_Class::is_primitive(k_mirror)) {
2928 *interface_count_ptr = 0;
2929 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2930 return JVMTI_ERROR_NONE;
2931 }
2932 JavaThread* current_thread = JavaThread::current();
2933 HandleMark hm(current_thread);
2934 Klass* k = java_lang_Class::as_Klass(k_mirror);
2935 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2936
2937 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
2938 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
2939 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2940
2941 if (!k->is_instance_klass()) {
2942 *interface_count_ptr = 0;
2943 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2944 return JVMTI_ERROR_NONE;
2945 }
2946
2947 Array<InstanceKlass*>* interface_list = InstanceKlass::cast(k)->local_interfaces();
2948 const int result_length = (interface_list == nullptr ? 0 : interface_list->length());
2949 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass));
2950 for (int i_index = 0; i_index < result_length; i_index += 1) {
2951 InstanceKlass* klass_at = interface_list->at(i_index);
2952 assert(klass_at->is_klass(), "interfaces must be Klass*s");
2953 assert(klass_at->is_interface(), "interfaces must be interfaces");
2954 oop mirror_at = klass_at->java_mirror();
2955 Handle handle_at = Handle(current_thread, mirror_at);
2956 result_list[i_index] = (jclass) jni_reference(handle_at);
2957 }
2958 *interface_count_ptr = result_length;
2959 *interfaces_ptr = result_list;
2960 }
2961
2962 return JVMTI_ERROR_NONE;
2963 } /* end GetImplementedInterfaces */
2964
2965
2966 // k_mirror - may be primitive, this must be checked
2967 // minor_version_ptr - pre-checked for null
2968 // 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));
2889 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
2890 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2891 }
2892
2893 if (!k->is_instance_klass()) {
2894 *field_count_ptr = 0;
2895 *fields_ptr = (jfieldID*) jvmtiMalloc(0 * sizeof(jfieldID));
2896 return JVMTI_ERROR_NONE;
2897 }
2898
2899 InstanceKlass* ik = InstanceKlass::cast(k);
2900
2901 FilteredJavaFieldStream flds(ik);
2902
2903 int result_count = flds.field_count();
2904
2905 // Allocate the result and fill it in.
2906 jfieldID* result_list = (jfieldID*)jvmtiMalloc(result_count * sizeof(jfieldID));
2907 for (int i = 0; i < result_count; i++, flds.next()) {
2908 result_list[i] = jfieldIDWorkaround::to_jfieldID(ik, flds.offset(),
2909 flds.access_flags().is_static(),
2910 flds.field_descriptor().is_flat());
2911 }
2912 assert(flds.done(), "just checking");
2913
2914 // Fill in the results
2915 *field_count_ptr = result_count;
2916 *fields_ptr = result_list;
2917
2918 return JVMTI_ERROR_NONE;
2919 } /* end GetClassFields */
2920
2921
2922 // k_mirror - may be primitive, this must be checked
2923 // interface_count_ptr - pre-checked for null
2924 // interfaces_ptr - pre-checked for null
2925 jvmtiError
2926 JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
2927 {
2928 if (java_lang_Class::is_primitive(k_mirror)) {
2929 *interface_count_ptr = 0;
2930 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2931 return JVMTI_ERROR_NONE;
2932 }
2933 JavaThread* current_thread = JavaThread::current();
2934 HandleMark hm(current_thread);
2935 Klass* k = java_lang_Class::as_Klass(k_mirror);
2936 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
2937
2938 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
2939 if (!(k->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
2940 return JVMTI_ERROR_CLASS_NOT_PREPARED;
2941
2942 if (!k->is_instance_klass()) {
2943 *interface_count_ptr = 0;
2944 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
2945 return JVMTI_ERROR_NONE;
2946 }
2947
2948 InstanceKlass* ik = InstanceKlass::cast(k);
2949 Array<InstanceKlass*>* interface_list = ik->local_interfaces();
2950 int result_length = (interface_list == nullptr ? 0 : interface_list->length());
2951 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass));
2952 for (int i_index = 0; i_index < result_length; i_index += 1) {
2953 InstanceKlass* klass_at = interface_list->at(i_index);
2954 assert(klass_at->is_klass(), "interfaces must be Klass*s");
2955 assert(klass_at->is_interface(), "interfaces must be interfaces");
2956 oop mirror_at = klass_at->java_mirror();
2957 Handle handle_at = Handle(current_thread, mirror_at);
2958 result_list[i_index] = (jclass) jni_reference(handle_at);
2959 }
2960 *interface_count_ptr = result_length;
2961 *interfaces_ptr = result_list;
2962 }
2963
2964 return JVMTI_ERROR_NONE;
2965 } /* end GetImplementedInterfaces */
2966
2967
2968 // k_mirror - may be primitive, this must be checked
2969 // minor_version_ptr - pre-checked for null
2970 // major_version_ptr - pre-checked for null
|