hotspot/src/share/vm/oops/instanceMirrorKlass.inline.hpp
changeset 32606 fdaa30d06ada
parent 30880 efe35e08179f
child 33611 9abd65805e19
equal deleted inserted replaced
32605:dab0de4ff7ff 32606:fdaa30d06ada
    51     oop_oop_iterate_statics_specialized<nv, oop>(obj, closure);
    51     oop_oop_iterate_statics_specialized<nv, oop>(obj, closure);
    52   }
    52   }
    53 }
    53 }
    54 
    54 
    55 template <bool nv, class OopClosureType>
    55 template <bool nv, class OopClosureType>
    56 int InstanceMirrorKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
    56 void InstanceMirrorKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
    57   InstanceKlass::oop_oop_iterate<nv>(obj, closure);
    57   InstanceKlass::oop_oop_iterate<nv>(obj, closure);
    58 
    58 
    59   if (Devirtualizer<nv>::do_metadata(closure)) {
    59   if (Devirtualizer<nv>::do_metadata(closure)) {
    60     Klass* klass = java_lang_Class::as_Klass(obj);
    60     Klass* klass = java_lang_Class::as_Klass(obj);
    61     // We'll get NULL for primitive mirrors.
    61     // We'll get NULL for primitive mirrors.
    62     if (klass != NULL) {
    62     if (klass != NULL) {
    63       Devirtualizer<nv>::do_klass(closure, klass);
    63       if (klass->oop_is_instance() && InstanceKlass::cast(klass)->is_anonymous()) {
       
    64         // An anonymous class doesn't have its own class loader, so when handling
       
    65         // the java mirror for an anonymous class we need to make sure its class
       
    66         // loader data is claimed, this is done by calling do_cld explicitly.
       
    67         // For non-anonymous classes the call to do_cld is made when the class
       
    68         // loader itself is handled.
       
    69         Devirtualizer<nv>::do_cld(closure, klass->class_loader_data());
       
    70       } else {
       
    71         Devirtualizer<nv>::do_klass(closure, klass);
       
    72       }
       
    73     } else {
       
    74       // If klass is NULL then this a mirror for a primitive type.
       
    75       // We don't have to follow them, since they are handled as strong
       
    76       // roots in Universe::oops_do.
       
    77       assert(java_lang_Class::is_primitive(obj), "Sanity check");
    64     }
    78     }
    65   }
    79   }
    66 
    80 
    67   oop_oop_iterate_statics<nv>(obj, closure);
    81   oop_oop_iterate_statics<nv>(obj, closure);
    68 
       
    69   return oop_size(obj);
       
    70 }
    82 }
    71 
    83 
    72 #if INCLUDE_ALL_GCS
    84 #if INCLUDE_ALL_GCS
    73 template <bool nv, class OopClosureType>
    85 template <bool nv, class OopClosureType>
    74 int InstanceMirrorKlass::oop_oop_iterate_reverse(oop obj, OopClosureType* closure) {
    86 void InstanceMirrorKlass::oop_oop_iterate_reverse(oop obj, OopClosureType* closure) {
    75   InstanceKlass::oop_oop_iterate_reverse<nv>(obj, closure);
    87   InstanceKlass::oop_oop_iterate_reverse<nv>(obj, closure);
    76 
    88 
    77   InstanceMirrorKlass::oop_oop_iterate_statics<nv>(obj, closure);
    89   InstanceMirrorKlass::oop_oop_iterate_statics<nv>(obj, closure);
    78 
       
    79   return oop_size(obj);
       
    80 }
    90 }
    81 #endif
    91 #endif
    82 
    92 
    83 template <bool nv, typename T, class OopClosureType>
    93 template <bool nv, typename T, class OopClosureType>
    84 void InstanceMirrorKlass::oop_oop_iterate_statics_specialized_bounded(oop obj,
    94 void InstanceMirrorKlass::oop_oop_iterate_statics_specialized_bounded(oop obj,
   113     oop_oop_iterate_statics_specialized_bounded<nv, oop>(obj, closure, mr);
   123     oop_oop_iterate_statics_specialized_bounded<nv, oop>(obj, closure, mr);
   114   }
   124   }
   115 }
   125 }
   116 
   126 
   117 template <bool nv, class OopClosureType>
   127 template <bool nv, class OopClosureType>
   118 int InstanceMirrorKlass::oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr) {
   128 void InstanceMirrorKlass::oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr) {
   119   InstanceKlass::oop_oop_iterate_bounded<nv>(obj, closure, mr);
   129   InstanceKlass::oop_oop_iterate_bounded<nv>(obj, closure, mr);
   120 
   130 
   121   if (Devirtualizer<nv>::do_metadata(closure)) {
   131   if (Devirtualizer<nv>::do_metadata(closure)) {
   122     if (mr.contains(obj)) {
   132     if (mr.contains(obj)) {
   123       Klass* klass = java_lang_Class::as_Klass(obj);
   133       Klass* klass = java_lang_Class::as_Klass(obj);
   127       }
   137       }
   128     }
   138     }
   129   }
   139   }
   130 
   140 
   131   oop_oop_iterate_statics_bounded<nv>(obj, closure, mr);
   141   oop_oop_iterate_statics_bounded<nv>(obj, closure, mr);
   132 
       
   133   return oop_size(obj);
       
   134 }
   142 }
   135 
   143 
   136 #define ALL_INSTANCE_MIRROR_KLASS_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)  \
   144 #define ALL_INSTANCE_MIRROR_KLASS_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)  \
   137   OOP_OOP_ITERATE_DEFN(          InstanceMirrorKlass, OopClosureType, nv_suffix)   \
   145   OOP_OOP_ITERATE_DEFN(          InstanceMirrorKlass, OopClosureType, nv_suffix)   \
   138   OOP_OOP_ITERATE_DEFN_BOUNDED(  InstanceMirrorKlass, OopClosureType, nv_suffix)   \
   146   OOP_OOP_ITERATE_DEFN_BOUNDED(  InstanceMirrorKlass, OopClosureType, nv_suffix)   \