< prev index next >

src/share/vm/oops/constantPool.cpp

Print this page


 132       for (int i = 0; i < constant_pool_map_length; i++) {
 133         int x = reference_map.at(i);
 134         assert(x == (int)(jushort) x, "klass index is too big");
 135         om->at_put(i, (jushort)x);
 136       }
 137       set_reference_map(om);
 138     }
 139 
 140     // Create Java array for holding resolved strings, methodHandles,
 141     // methodTypes, invokedynamic and invokehandle appendix objects, etc.
 142     objArrayOop stom = oopFactory::new_objArray(SystemDictionary::Object_klass(), map_length, CHECK);
 143     Handle refs_handle (THREAD, (oop)stom);  // must handleize.
 144     set_resolved_references(loader_data->add_handle(refs_handle));
 145   }
 146 }
 147 
 148 void ConstantPool::allocate_resolved_klasses(ClassLoaderData* loader_data, int num_klasses, TRAPS) {
 149   // A ConstantPool can't possibly have 0xffff valid class entries,
 150   // because entry #0 must be CONSTANT_Invalid, and each class entry must refer to a UTF8
 151   // entry for the class's name. So at most we will have 0xfffe class entries.
 152   // This allows us to use 0xffff (ConstantPool::_invalid_resolved_klass_index) to indicate
 153   // UnresolvedKlass entries that are temporarily created during class redefinition.
 154   assert(num_klasses < _invalid_resolved_klass_index, "sanity");
 155   assert(resolved_klasses() == NULL, "sanity");
 156   Array<Klass*>* rk = MetadataFactory::new_writeable_array<Klass*>(loader_data, num_klasses, CHECK);
 157   set_resolved_klasses(rk);
 158 }
 159 
 160 void ConstantPool::initialize_unresolved_klasses(ClassLoaderData* loader_data, TRAPS) {
 161   int len = length();
 162   int num_klasses = 0;
 163   for (int i = 1; i <len; i++) {
 164     switch (tag_at(i).value()) {
 165     case JVM_CONSTANT_ClassIndex:
 166       {
 167         const int class_index = klass_index_at(i);
 168         unresolved_klass_at_put(i, class_index, num_klasses++);
 169       }
 170       break;
 171 #ifndef PRODUCT
 172     case JVM_CONSTANT_Class:
 173     case JVM_CONSTANT_UnresolvedClass:
 174     case JVM_CONSTANT_UnresolvedClassInError:
 175       // All of these should have been reverted back to ClassIndex before calling
 176       // this function.
 177       ShouldNotReachHere();
 178 #endif
 179     }
 180   }
 181   allocate_resolved_klasses(loader_data, num_klasses, THREAD);
 182 }
 183 
 184 void ConstantPool::klass_at_put(int which, int name_index, int resolved_klass_index, Klass* k, Symbol* name) {
 185   assert(is_within_bounds(which), "index out of bounds");

 186   assert(is_within_bounds(name_index), "index out of bounds");
 187   assert((resolved_klass_index & 0xffff0000) == 0, "must be");
 188   *int_at_addr(which) =
 189     build_int_from_shorts((jushort)resolved_klass_index, (jushort)name_index);
 190 
 191   symbol_at_put(name_index, name);
 192   name->increment_refcount();
 193   Klass** adr = resolved_klasses()->adr_at(resolved_klass_index);
 194   OrderAccess::release_store_ptr((Klass* volatile *)adr, k);
 195 
 196   // The interpreter assumes when the tag is stored, the klass is resolved
 197   // and the Klass* non-NULL, so we need hardware store ordering here.
 198   if (k != NULL) {
 199     release_tag_at_put(which, JVM_CONSTANT_Class);
 200   } else {
 201     release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
 202   }












 203 }
 204 
 205 // CDS support. Create a new resolved_references array.
 206 void ConstantPool::restore_unshareable_info(TRAPS) {
 207   assert(is_constantPool(), "ensure C++ vtable is restored");
 208   assert(on_stack(), "should always be set for shared constant pools");
 209   assert(is_shared(), "should always be set for shared constant pools");
 210 
 211   // Only create the new resolved references array if it hasn't been attempted before
 212   if (resolved_references() != NULL) return;
 213 
 214   // restore the C++ vtable from the shared archive
 215   restore_vtable();
 216 
 217   if (SystemDictionary::Object_klass_loaded()) {
 218     // Recreate the object array and add to ClassLoaderData.
 219     int map_length = resolved_reference_length();
 220     if (map_length > 0) {
 221       objArrayOop stom = oopFactory::new_objArray(SystemDictionary::Object_klass(), map_length, CHECK);
 222       Handle refs_handle (THREAD, (oop)stom);  // must handleize.




 132       for (int i = 0; i < constant_pool_map_length; i++) {
 133         int x = reference_map.at(i);
 134         assert(x == (int)(jushort) x, "klass index is too big");
 135         om->at_put(i, (jushort)x);
 136       }
 137       set_reference_map(om);
 138     }
 139 
 140     // Create Java array for holding resolved strings, methodHandles,
 141     // methodTypes, invokedynamic and invokehandle appendix objects, etc.
 142     objArrayOop stom = oopFactory::new_objArray(SystemDictionary::Object_klass(), map_length, CHECK);
 143     Handle refs_handle (THREAD, (oop)stom);  // must handleize.
 144     set_resolved_references(loader_data->add_handle(refs_handle));
 145   }
 146 }
 147 
 148 void ConstantPool::allocate_resolved_klasses(ClassLoaderData* loader_data, int num_klasses, TRAPS) {
 149   // A ConstantPool can't possibly have 0xffff valid class entries,
 150   // because entry #0 must be CONSTANT_Invalid, and each class entry must refer to a UTF8
 151   // entry for the class's name. So at most we will have 0xfffe class entries.
 152   // This allows us to use 0xffff (ConstantPool::_temp_resolved_klass_index) to indicate
 153   // UnresolvedKlass entries that are temporarily created during class redefinition.
 154   assert(num_klasses < CPKlassSlot::_temp_resolved_klass_index, "sanity");
 155   assert(resolved_klasses() == NULL, "sanity");
 156   Array<Klass*>* rk = MetadataFactory::new_writeable_array<Klass*>(loader_data, num_klasses, CHECK);
 157   set_resolved_klasses(rk);
 158 }
 159 
 160 void ConstantPool::initialize_unresolved_klasses(ClassLoaderData* loader_data, TRAPS) {
 161   int len = length();
 162   int num_klasses = 0;
 163   for (int i = 1; i <len; i++) {
 164     switch (tag_at(i).value()) {
 165     case JVM_CONSTANT_ClassIndex:
 166       {
 167         const int class_index = klass_index_at(i);
 168         unresolved_klass_at_put(i, class_index, num_klasses++);
 169       }
 170       break;
 171 #ifndef PRODUCT
 172     case JVM_CONSTANT_Class:
 173     case JVM_CONSTANT_UnresolvedClass:
 174     case JVM_CONSTANT_UnresolvedClassInError:
 175       // All of these should have been reverted back to ClassIndex before calling
 176       // this function.
 177       ShouldNotReachHere();
 178 #endif
 179     }
 180   }
 181   allocate_resolved_klasses(loader_data, num_klasses, THREAD);
 182 }
 183 
 184 // Anonymous class support:
 185 void ConstantPool::klass_at_put(int class_index, int name_index, int resolved_klass_index, Klass* k, Symbol* name) {
 186   assert(is_within_bounds(class_index), "index out of bounds");
 187   assert(is_within_bounds(name_index), "index out of bounds");
 188   assert((resolved_klass_index & 0xffff0000) == 0, "must be");
 189   *int_at_addr(class_index) =
 190     build_int_from_shorts((jushort)resolved_klass_index, (jushort)name_index);
 191 
 192   symbol_at_put(name_index, name);
 193   name->increment_refcount();
 194   Klass** adr = resolved_klasses()->adr_at(resolved_klass_index);
 195   OrderAccess::release_store_ptr((Klass* volatile *)adr, k);
 196 
 197   // The interpreter assumes when the tag is stored, the klass is resolved
 198   // and the Klass* non-NULL, so we need hardware store ordering here.
 199   if (k != NULL) {
 200     release_tag_at_put(class_index, JVM_CONSTANT_Class);
 201   } else {
 202     release_tag_at_put(class_index, JVM_CONSTANT_UnresolvedClass);
 203   }
 204 }
 205 
 206 // Anonymous class support:
 207 void ConstantPool::klass_at_put(int class_index, Klass* k) {
 208   CPKlassSlot kslot = klass_slot_at(class_index);
 209   int resolved_klass_index = kslot.resolved_klass_index();
 210   int name_index = kslot.name_index();
 211   Symbol* name = symbol_at(name_index);
 212   guarantee(name == k->name(), "Invalid class name for anonymous");
 213 
 214   Klass** adr = resolved_klasses()->adr_at(resolved_klass_index);
 215   OrderAccess::release_store_ptr((Klass* volatile *)adr, k);
 216 }
 217 
 218 // CDS support. Create a new resolved_references array.
 219 void ConstantPool::restore_unshareable_info(TRAPS) {
 220   assert(is_constantPool(), "ensure C++ vtable is restored");
 221   assert(on_stack(), "should always be set for shared constant pools");
 222   assert(is_shared(), "should always be set for shared constant pools");
 223 
 224   // Only create the new resolved references array if it hasn't been attempted before
 225   if (resolved_references() != NULL) return;
 226 
 227   // restore the C++ vtable from the shared archive
 228   restore_vtable();
 229 
 230   if (SystemDictionary::Object_klass_loaded()) {
 231     // Recreate the object array and add to ClassLoaderData.
 232     int map_length = resolved_reference_length();
 233     if (map_length > 0) {
 234       objArrayOop stom = oopFactory::new_objArray(SystemDictionary::Object_klass(), map_length, CHECK);
 235       Handle refs_handle (THREAD, (oop)stom);  // must handleize.


< prev index next >