hotspot/src/share/vm/prims/jvmtiTagMap.cpp
changeset 4571 80b553bddc26
parent 3908 24b55ad4c228
child 5547 f4b087cbb361
equal deleted inserted replaced
4569:f372ea9e5ed4 4571:80b553bddc26
   577 }
   577 }
   578 
   578 
   579 // If the object is a java.lang.Class then return the klassOop,
   579 // If the object is a java.lang.Class then return the klassOop,
   580 // otherwise return the original object
   580 // otherwise return the original object
   581 static inline oop klassOop_if_java_lang_Class(oop o) {
   581 static inline oop klassOop_if_java_lang_Class(oop o) {
   582   if (o->klass() == SystemDictionary::class_klass()) {
   582   if (o->klass() == SystemDictionary::Class_klass()) {
   583     if (!java_lang_Class::is_primitive(o)) {
   583     if (!java_lang_Class::is_primitive(o)) {
   584       o = (oop)java_lang_Class::as_klassOop(o);
   584       o = (oop)java_lang_Class::as_klassOop(o);
   585       assert(o != NULL, "class for non-primitive mirror must exist");
   585       assert(o != NULL, "class for non-primitive mirror must exist");
   586     }
   586     }
   587   }
   587   }
   642     if (_o == o) {
   642     if (_o == o) {
   643       _klass = _o->klass();
   643       _klass = _o->klass();
   644     } else {
   644     } else {
   645       // if the object represents a runtime class then use the
   645       // if the object represents a runtime class then use the
   646       // tag for java.lang.Class
   646       // tag for java.lang.Class
   647       _klass = SystemDictionary::class_klass();
   647       _klass = SystemDictionary::Class_klass();
   648     }
   648     }
   649     _klass_tag = tag_for(tag_map, _klass);
   649     _klass_tag = tag_for(tag_map, _klass);
   650   }
   650   }
   651 
   651 
   652   ~CallbackWrapper() {
   652   ~CallbackWrapper() {
   745       _referrer_tag_p = &_referrer_obj_tag;
   745       _referrer_tag_p = &_referrer_obj_tag;
   746 
   746 
   747       // get referrer class tag.
   747       // get referrer class tag.
   748       klassOop k = (_referrer == referrer) ?  // Check if referrer is a class...
   748       klassOop k = (_referrer == referrer) ?  // Check if referrer is a class...
   749           _referrer->klass()                  // No, just get its class
   749           _referrer->klass()                  // No, just get its class
   750          : SystemDictionary::class_klass();   // Yes, its class is Class
   750          : SystemDictionary::Class_klass();   // Yes, its class is Class
   751       _referrer_klass_tag = tag_for(tag_map, k);
   751       _referrer_klass_tag = tag_for(tag_map, k);
   752     }
   752     }
   753   }
   753   }
   754 
   754 
   755   ~TwoOopCallbackWrapper() {
   755   ~TwoOopCallbackWrapper() {
  1124 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
  1124 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
  1125                                          CallbackWrapper* wrapper,
  1125                                          CallbackWrapper* wrapper,
  1126                                          oop str,
  1126                                          oop str,
  1127                                          void* user_data)
  1127                                          void* user_data)
  1128 {
  1128 {
  1129   assert(str->klass() == SystemDictionary::string_klass(), "not a string");
  1129   assert(str->klass() == SystemDictionary::String_klass(), "not a string");
  1130 
  1130 
  1131   // get the string value and length
  1131   // get the string value and length
  1132   // (string value may be offset from the base)
  1132   // (string value may be offset from the base)
  1133   int s_len = java_lang_String::length(str);
  1133   int s_len = java_lang_String::length(str);
  1134   typeArrayOop s_value = java_lang_String::value(str);
  1134   typeArrayOop s_value = java_lang_String::value(str);
  1184    void* user_data)
  1184    void* user_data)
  1185 {
  1185 {
  1186   // for static fields only the index will be set
  1186   // for static fields only the index will be set
  1187   static jvmtiHeapReferenceInfo reference_info = { 0 };
  1187   static jvmtiHeapReferenceInfo reference_info = { 0 };
  1188 
  1188 
  1189   assert(obj->klass() == SystemDictionary::class_klass(), "not a class");
  1189   assert(obj->klass() == SystemDictionary::Class_klass(), "not a class");
  1190   if (java_lang_Class::is_primitive(obj)) {
  1190   if (java_lang_Class::is_primitive(obj)) {
  1191     return 0;
  1191     return 0;
  1192   }
  1192   }
  1193   klassOop k = java_lang_Class::as_klassOop(obj);
  1193   klassOop k = java_lang_Class::as_klassOop(obj);
  1194   Klass* klass = k->klass_part();
  1194   Klass* klass = k->klass_part();
  1496 
  1496 
  1497   // for objects and classes we report primitive fields if callback provided
  1497   // for objects and classes we report primitive fields if callback provided
  1498   if (callbacks()->primitive_field_callback != NULL && obj->is_instance()) {
  1498   if (callbacks()->primitive_field_callback != NULL && obj->is_instance()) {
  1499     jint res;
  1499     jint res;
  1500     jvmtiPrimitiveFieldCallback cb = callbacks()->primitive_field_callback;
  1500     jvmtiPrimitiveFieldCallback cb = callbacks()->primitive_field_callback;
  1501     if (obj->klass() == SystemDictionary::class_klass()) {
  1501     if (obj->klass() == SystemDictionary::Class_klass()) {
  1502       res = invoke_primitive_field_callback_for_static_fields(&wrapper,
  1502       res = invoke_primitive_field_callback_for_static_fields(&wrapper,
  1503                                                                     obj,
  1503                                                                     obj,
  1504                                                                     cb,
  1504                                                                     cb,
  1505                                                                     (void*)user_data());
  1505                                                                     (void*)user_data());
  1506     } else {
  1506     } else {
  1513   }
  1513   }
  1514 
  1514 
  1515   // string callback
  1515   // string callback
  1516   if (!is_array &&
  1516   if (!is_array &&
  1517       callbacks()->string_primitive_value_callback != NULL &&
  1517       callbacks()->string_primitive_value_callback != NULL &&
  1518       obj->klass() == SystemDictionary::string_klass()) {
  1518       obj->klass() == SystemDictionary::String_klass()) {
  1519     jint res = invoke_string_value_callback(
  1519     jint res = invoke_string_value_callback(
  1520                 callbacks()->string_primitive_value_callback,
  1520                 callbacks()->string_primitive_value_callback,
  1521                 &wrapper,
  1521                 &wrapper,
  1522                 obj,
  1522                 obj,
  1523                 (void*)user_data() );
  1523                 (void*)user_data() );
  2379   return (!(res & JVMTI_VISIT_ABORT));
  2379   return (!(res & JVMTI_VISIT_ABORT));
  2380 }
  2380 }
  2381 
  2381 
  2382 // invoke the string value callback
  2382 // invoke the string value callback
  2383 inline bool CallbackInvoker::report_string_value(oop str) {
  2383 inline bool CallbackInvoker::report_string_value(oop str) {
  2384   assert(str->klass() == SystemDictionary::string_klass(), "not a string");
  2384   assert(str->klass() == SystemDictionary::String_klass(), "not a string");
  2385 
  2385 
  2386   AdvancedHeapWalkContext* context = advanced_context();
  2386   AdvancedHeapWalkContext* context = advanced_context();
  2387   assert(context->string_primitive_value_callback() != NULL, "no callback");
  2387   assert(context->string_primitive_value_callback() != NULL, "no callback");
  2388 
  2388 
  2389   // apply class filter
  2389   // apply class filter
  2926     // get the java mirror
  2926     // get the java mirror
  2927     oop mirror = klass->java_mirror();
  2927     oop mirror = klass->java_mirror();
  2928 
  2928 
  2929     // super (only if something more interesting than java.lang.Object)
  2929     // super (only if something more interesting than java.lang.Object)
  2930     klassOop java_super = ik->java_super();
  2930     klassOop java_super = ik->java_super();
  2931     if (java_super != NULL && java_super != SystemDictionary::object_klass()) {
  2931     if (java_super != NULL && java_super != SystemDictionary::Object_klass()) {
  2932       oop super = Klass::cast(java_super)->java_mirror();
  2932       oop super = Klass::cast(java_super)->java_mirror();
  2933       if (!CallbackInvoker::report_superclass_reference(mirror, super)) {
  2933       if (!CallbackInvoker::report_superclass_reference(mirror, super)) {
  2934         return false;
  2934         return false;
  2935       }
  2935       }
  2936     }
  2936     }
  3068     }
  3068     }
  3069   }
  3069   }
  3070 
  3070 
  3071   // if the object is a java.lang.String
  3071   // if the object is a java.lang.String
  3072   if (is_reporting_string_values() &&
  3072   if (is_reporting_string_values() &&
  3073       o->klass() == SystemDictionary::string_klass()) {
  3073       o->klass() == SystemDictionary::String_klass()) {
  3074     if (!CallbackInvoker::report_string_value(o)) {
  3074     if (!CallbackInvoker::report_string_value(o)) {
  3075       return false;
  3075       return false;
  3076     }
  3076     }
  3077   }
  3077   }
  3078   return true;
  3078   return true;
  3253   assert(!ObjectMarker::visited(o), "can't visit same object more than once");
  3253   assert(!ObjectMarker::visited(o), "can't visit same object more than once");
  3254   ObjectMarker::mark(o);
  3254   ObjectMarker::mark(o);
  3255 
  3255 
  3256   // instance
  3256   // instance
  3257   if (o->is_instance()) {
  3257   if (o->is_instance()) {
  3258     if (o->klass() == SystemDictionary::class_klass()) {
  3258     if (o->klass() == SystemDictionary::Class_klass()) {
  3259       o = klassOop_if_java_lang_Class(o);
  3259       o = klassOop_if_java_lang_Class(o);
  3260       if (o->is_klass()) {
  3260       if (o->is_klass()) {
  3261         // a java.lang.Class
  3261         // a java.lang.Class
  3262         return iterate_over_class(klassOop(o));
  3262         return iterate_over_class(klassOop(o));
  3263       }
  3263       }