hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 17826 9ad5cd464a75
parent 17370 59a0620561fa
child 17828 17131ab4b3b5
equal deleted inserted replaced
17825:b6fc2755ec91 17826:9ad5cd464a75
   266   set_transitive_interfaces(NULL);
   266   set_transitive_interfaces(NULL);
   267   init_implementor();
   267   init_implementor();
   268   set_fields(NULL, 0);
   268   set_fields(NULL, 0);
   269   set_constants(NULL);
   269   set_constants(NULL);
   270   set_class_loader_data(NULL);
   270   set_class_loader_data(NULL);
   271   set_protection_domain(NULL);
       
   272   set_signers(NULL);
       
   273   set_source_file_name(NULL);
   271   set_source_file_name(NULL);
   274   set_source_debug_extension(NULL, 0);
   272   set_source_debug_extension(NULL, 0);
   275   set_array_name(NULL);
   273   set_array_name(NULL);
   276   set_inner_classes(NULL);
   274   set_inner_classes(NULL);
   277   set_static_oop_field_count(0);
   275   set_static_oop_field_count(0);
   278   set_nonstatic_field_size(0);
   276   set_nonstatic_field_size(0);
   279   set_is_marked_dependent(false);
   277   set_is_marked_dependent(false);
   280   set_init_state(InstanceKlass::allocated);
   278   set_init_state(InstanceKlass::allocated);
   281   set_init_thread(NULL);
   279   set_init_thread(NULL);
   282   set_init_lock(NULL);
       
   283   set_reference_type(rt);
   280   set_reference_type(rt);
   284   set_oop_map_cache(NULL);
   281   set_oop_map_cache(NULL);
   285   set_jni_ids(NULL);
   282   set_jni_ids(NULL);
   286   set_osr_nmethods_head(NULL);
   283   set_osr_nmethods_head(NULL);
   287   set_breakpoints(NULL);
   284   set_breakpoints(NULL);
   406   if (inner_classes() != Universe::the_empty_short_array()) {
   403   if (inner_classes() != Universe::the_empty_short_array()) {
   407     MetadataFactory::free_array<jushort>(loader_data, inner_classes());
   404     MetadataFactory::free_array<jushort>(loader_data, inner_classes());
   408   }
   405   }
   409   set_inner_classes(NULL);
   406   set_inner_classes(NULL);
   410 
   407 
   411   // Null out Java heap objects, although these won't be walked to keep
       
   412   // alive once this InstanceKlass is deallocated.
       
   413   set_protection_domain(NULL);
       
   414   set_signers(NULL);
       
   415   set_init_lock(NULL);
       
   416 
       
   417   // We should deallocate the Annotations instance
   408   // We should deallocate the Annotations instance
   418   MetadataFactory::free_metadata(loader_data, annotations());
   409   MetadataFactory::free_metadata(loader_data, annotations());
   419   set_annotations(NULL);
   410   set_annotations(NULL);
   420 }
   411 }
   421 
   412 
   449     instanceKlassHandle this_oop(thread, this);
   440     instanceKlassHandle this_oop(thread, this);
   450     eager_initialize_impl(this_oop);
   441     eager_initialize_impl(this_oop);
   451   }
   442   }
   452 }
   443 }
   453 
   444 
       
   445 // JVMTI spec thinks there are signers and protection domain in the
       
   446 // instanceKlass.  These accessors pretend these fields are there.
       
   447 // The hprof specification also thinks these fields are in InstanceKlass.
       
   448 oop InstanceKlass::protection_domain() const {
       
   449   // return the protection_domain from the mirror
       
   450   return java_lang_Class::protection_domain(java_mirror());
       
   451 }
       
   452 
       
   453 // To remove these from requires an incompatible change and CCC request.
       
   454 objArrayOop InstanceKlass::signers() const {
       
   455   // return the signers from the mirror
       
   456   return java_lang_Class::signers(java_mirror());
       
   457 }
       
   458 
       
   459 volatile oop InstanceKlass::init_lock() const {
       
   460   // return the init lock from the mirror
       
   461   return java_lang_Class::init_lock(java_mirror());
       
   462 }
   454 
   463 
   455 void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
   464 void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
   456   EXCEPTION_MARK;
   465   EXCEPTION_MARK;
   457   volatile oop init_lock = this_oop->init_lock();
   466   volatile oop init_lock = this_oop->init_lock();
   458   ObjectLocker ol(init_lock, THREAD);
   467   ObjectLocker ol(init_lock, THREAD);
  1881 #endif //PRODUCT
  1890 #endif //PRODUCT
  1882 
  1891 
  1883 
  1892 
  1884 // Garbage collection
  1893 // Garbage collection
  1885 
  1894 
  1886 void InstanceKlass::oops_do(OopClosure* cl) {
       
  1887   Klass::oops_do(cl);
       
  1888 
       
  1889   cl->do_oop(adr_protection_domain());
       
  1890   cl->do_oop(adr_signers());
       
  1891   cl->do_oop(adr_init_lock());
       
  1892 
       
  1893   // Don't walk the arrays since they are walked from the ClassLoaderData objects.
       
  1894 }
       
  1895 
       
  1896 #ifdef ASSERT
  1895 #ifdef ASSERT
  1897 template <class T> void assert_is_in(T *p) {
  1896 template <class T> void assert_is_in(T *p) {
  1898   T heap_oop = oopDesc::load_heap_oop(p);
  1897   T heap_oop = oopDesc::load_heap_oop(p);
  1899   if (!oopDesc::is_null(heap_oop)) {
  1898   if (!oopDesc::is_null(heap_oop)) {
  1900     oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
  1899     oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
  2239   for (int i = 0; i < methods()->length(); i++) {
  2238   for (int i = 0; i < methods()->length(); i++) {
  2240     Method* m = methods()->at(i);
  2239     Method* m = methods()->at(i);
  2241     m->remove_unshareable_info();
  2240     m->remove_unshareable_info();
  2242   }
  2241   }
  2243 
  2242 
  2244   // Need to reinstate when reading back the class.
       
  2245   set_init_lock(NULL);
       
  2246 
       
  2247   // do array classes also.
  2243   // do array classes also.
  2248   array_klasses_do(remove_unshareable_in_class);
  2244   array_klasses_do(remove_unshareable_in_class);
  2249 }
  2245 }
  2250 
  2246 
  2251 void restore_unshareable_in_class(Klass* k, TRAPS) {
  2247 void restore_unshareable_in_class(Klass* k, TRAPS) {
  2272     // It also redefines the itable too so fix that too.
  2268     // It also redefines the itable too so fix that too.
  2273     ResourceMark rm(THREAD);
  2269     ResourceMark rm(THREAD);
  2274     ik->vtable()->initialize_vtable(false, CHECK);
  2270     ik->vtable()->initialize_vtable(false, CHECK);
  2275     ik->itable()->initialize_itable(false, CHECK);
  2271     ik->itable()->initialize_itable(false, CHECK);
  2276   }
  2272   }
  2277 
       
  2278   // Allocate a simple java object for a lock.
       
  2279   // This needs to be a java object because during class initialization
       
  2280   // it can be held across a java call.
       
  2281   typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);
       
  2282   Handle h(THREAD, (oop)r);
       
  2283   ik->set_init_lock(h());
       
  2284 
  2273 
  2285   // restore constant pool resolved references
  2274   // restore constant pool resolved references
  2286   ik->constants()->restore_unshareable_info(CHECK);
  2275   ik->constants()->restore_unshareable_info(CHECK);
  2287 
  2276 
  2288   ik->array_klasses_do(restore_unshareable_in_class, CHECK);
  2277   ik->array_klasses_do(restore_unshareable_in_class, CHECK);
  2834   if (class_loader_data() != NULL) {
  2823   if (class_loader_data() != NULL) {
  2835     st->print(BULLET"class loader data:  ");
  2824     st->print(BULLET"class loader data:  ");
  2836     class_loader_data()->print_value_on(st);
  2825     class_loader_data()->print_value_on(st);
  2837     st->cr();
  2826     st->cr();
  2838   }
  2827   }
  2839   st->print(BULLET"protection domain: "); ((InstanceKlass*)this)->protection_domain()->print_value_on(st); st->cr();
       
  2840   st->print(BULLET"host class:        "); host_klass()->print_value_on_maybe_null(st); st->cr();
  2828   st->print(BULLET"host class:        "); host_klass()->print_value_on_maybe_null(st); st->cr();
  2841   st->print(BULLET"signers:           "); signers()->print_value_on(st);               st->cr();
       
  2842   st->print(BULLET"init_lock:         "); ((oop)_init_lock)->print_value_on(st);       st->cr();
       
  2843   if (source_file_name() != NULL) {
  2829   if (source_file_name() != NULL) {
  2844     st->print(BULLET"source file:       ");
  2830     st->print(BULLET"source file:       ");
  2845     source_file_name()->print_value_on(st);
  2831     source_file_name()->print_value_on(st);
  2846     st->cr();
  2832     st->cr();
  2847   }
  2833   }
  3038   int n = 0;
  3024   int n = 0;
  3039   n += (sz->_methods_array_bytes         = sz->count_array(methods()));
  3025   n += (sz->_methods_array_bytes         = sz->count_array(methods()));
  3040   n += (sz->_method_ordering_bytes       = sz->count_array(method_ordering()));
  3026   n += (sz->_method_ordering_bytes       = sz->count_array(method_ordering()));
  3041   n += (sz->_local_interfaces_bytes      = sz->count_array(local_interfaces()));
  3027   n += (sz->_local_interfaces_bytes      = sz->count_array(local_interfaces()));
  3042   n += (sz->_transitive_interfaces_bytes = sz->count_array(transitive_interfaces()));
  3028   n += (sz->_transitive_interfaces_bytes = sz->count_array(transitive_interfaces()));
  3043   n += (sz->_signers_bytes               = sz->count_array(signers()));
       
  3044   n += (sz->_fields_bytes                = sz->count_array(fields()));
  3029   n += (sz->_fields_bytes                = sz->count_array(fields()));
  3045   n += (sz->_inner_classes_bytes         = sz->count_array(inner_classes()));
  3030   n += (sz->_inner_classes_bytes         = sz->count_array(inner_classes()));
  3046   sz->_ro_bytes += n;
  3031   sz->_ro_bytes += n;
  3047 
  3032 
  3048   const ConstantPool* cp = constants();
  3033   const ConstantPool* cp = constants();
  3204   }
  3189   }
  3205   if (constants() != NULL) {
  3190   if (constants() != NULL) {
  3206     guarantee(constants()->is_metadata(), "should be in metaspace");
  3191     guarantee(constants()->is_metadata(), "should be in metaspace");
  3207     guarantee(constants()->is_constantPool(), "should be constant pool");
  3192     guarantee(constants()->is_constantPool(), "should be constant pool");
  3208   }
  3193   }
  3209   if (protection_domain() != NULL) {
       
  3210     guarantee(protection_domain()->is_oop(), "should be oop");
       
  3211   }
       
  3212   const Klass* host = host_klass();
  3194   const Klass* host = host_klass();
  3213   if (host != NULL) {
  3195   if (host != NULL) {
  3214     guarantee(host->is_metadata(), "should be in metaspace");
  3196     guarantee(host->is_metadata(), "should be in metaspace");
  3215     guarantee(host->is_klass(), "should be klass");
  3197     guarantee(host->is_klass(), "should be klass");
  3216   }
       
  3217   if (signers() != NULL) {
       
  3218     guarantee(signers()->is_objArray(), "should be obj array");
       
  3219   }
  3198   }
  3220 }
  3199 }
  3221 
  3200 
  3222 void InstanceKlass::oop_verify_on(oop obj, outputStream* st) {
  3201 void InstanceKlass::oop_verify_on(oop obj, outputStream* st) {
  3223   Klass::oop_verify_on(obj, st);
  3202   Klass::oop_verify_on(obj, st);