< 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 >