< prev index next >

src/share/vm/oops/constantPool.cpp

Print this page

*** 147,159 **** void ConstantPool::allocate_resolved_klasses(ClassLoaderData* loader_data, int num_klasses, TRAPS) { // A ConstantPool can't possibly have 0xffff valid class entries, // because entry #0 must be CONSTANT_Invalid, and each class entry must refer to a UTF8 // entry for the class's name. So at most we will have 0xfffe class entries. ! // This allows us to use 0xffff (ConstantPool::_invalid_resolved_klass_index) to indicate // UnresolvedKlass entries that are temporarily created during class redefinition. ! assert(num_klasses < _invalid_resolved_klass_index, "sanity"); assert(resolved_klasses() == NULL, "sanity"); Array<Klass*>* rk = MetadataFactory::new_writeable_array<Klass*>(loader_data, num_klasses, CHECK); set_resolved_klasses(rk); } --- 147,159 ---- void ConstantPool::allocate_resolved_klasses(ClassLoaderData* loader_data, int num_klasses, TRAPS) { // A ConstantPool can't possibly have 0xffff valid class entries, // because entry #0 must be CONSTANT_Invalid, and each class entry must refer to a UTF8 // entry for the class's name. So at most we will have 0xfffe class entries. ! // This allows us to use 0xffff (ConstantPool::_temp_resolved_klass_index) to indicate // UnresolvedKlass entries that are temporarily created during class redefinition. ! assert(num_klasses < CPKlassSlot::_temp_resolved_klass_index, "sanity"); assert(resolved_klasses() == NULL, "sanity"); Array<Klass*>* rk = MetadataFactory::new_writeable_array<Klass*>(loader_data, num_klasses, CHECK); set_resolved_klasses(rk); }
*** 179,209 **** } } allocate_resolved_klasses(loader_data, num_klasses, THREAD); } ! void ConstantPool::klass_at_put(int which, int name_index, int resolved_klass_index, Klass* k, Symbol* name) { ! assert(is_within_bounds(which), "index out of bounds"); assert(is_within_bounds(name_index), "index out of bounds"); assert((resolved_klass_index & 0xffff0000) == 0, "must be"); ! *int_at_addr(which) = build_int_from_shorts((jushort)resolved_klass_index, (jushort)name_index); symbol_at_put(name_index, name); name->increment_refcount(); Klass** adr = resolved_klasses()->adr_at(resolved_klass_index); OrderAccess::release_store_ptr((Klass* volatile *)adr, k); // The interpreter assumes when the tag is stored, the klass is resolved // and the Klass* non-NULL, so we need hardware store ordering here. if (k != NULL) { ! release_tag_at_put(which, JVM_CONSTANT_Class); } else { ! release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass); } } // CDS support. Create a new resolved_references array. void ConstantPool::restore_unshareable_info(TRAPS) { assert(is_constantPool(), "ensure C++ vtable is restored"); assert(on_stack(), "should always be set for shared constant pools"); assert(is_shared(), "should always be set for shared constant pools"); --- 179,222 ---- } } allocate_resolved_klasses(loader_data, num_klasses, THREAD); } ! // Anonymous class support: ! void ConstantPool::klass_at_put(int class_index, int name_index, int resolved_klass_index, Klass* k, Symbol* name) { ! assert(is_within_bounds(class_index), "index out of bounds"); assert(is_within_bounds(name_index), "index out of bounds"); assert((resolved_klass_index & 0xffff0000) == 0, "must be"); ! *int_at_addr(class_index) = build_int_from_shorts((jushort)resolved_klass_index, (jushort)name_index); symbol_at_put(name_index, name); name->increment_refcount(); Klass** adr = resolved_klasses()->adr_at(resolved_klass_index); OrderAccess::release_store_ptr((Klass* volatile *)adr, k); // The interpreter assumes when the tag is stored, the klass is resolved // and the Klass* non-NULL, so we need hardware store ordering here. if (k != NULL) { ! release_tag_at_put(class_index, JVM_CONSTANT_Class); } else { ! release_tag_at_put(class_index, JVM_CONSTANT_UnresolvedClass); } } + // Anonymous class support: + void ConstantPool::klass_at_put(int class_index, Klass* k) { + CPKlassSlot kslot = klass_slot_at(class_index); + int resolved_klass_index = kslot.resolved_klass_index(); + int name_index = kslot.name_index(); + Symbol* name = symbol_at(name_index); + guarantee(name == k->name(), "Invalid class name for anonymous"); + + Klass** adr = resolved_klasses()->adr_at(resolved_klass_index); + OrderAccess::release_store_ptr((Klass* volatile *)adr, k); + } + // CDS support. Create a new resolved_references array. void ConstantPool::restore_unshareable_info(TRAPS) { assert(is_constantPool(), "ensure C++ vtable is restored"); assert(on_stack(), "should always be set for shared constant pools"); assert(is_shared(), "should always be set for shared constant pools");
< prev index next >