mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
6653858: dynamic languages need to be able to load anonymous classes
Low-level privileged sun.misc.Unsafe.defineAnonymousClass Reviewed-by: kvn
This commit is contained in:
parent
015a08b3e8
commit
849e0ffb04
19 changed files with 607 additions and 37 deletions
|
@ -81,6 +81,7 @@ void instanceKlassKlass::oop_follow_contents(oop obj) {
|
|||
MarkSweep::mark_and_push(ik->adr_source_debug_extension());
|
||||
MarkSweep::mark_and_push(ik->adr_inner_classes());
|
||||
MarkSweep::mark_and_push(ik->adr_protection_domain());
|
||||
MarkSweep::mark_and_push(ik->adr_host_klass());
|
||||
MarkSweep::mark_and_push(ik->adr_signers());
|
||||
MarkSweep::mark_and_push(ik->adr_generic_signature());
|
||||
MarkSweep::mark_and_push(ik->adr_class_annotations());
|
||||
|
@ -120,6 +121,7 @@ void instanceKlassKlass::oop_follow_contents(ParCompactionManager* cm,
|
|||
PSParallelCompact::mark_and_push(cm, ik->adr_source_debug_extension());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_protection_domain());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_host_klass());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_signers());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_generic_signature());
|
||||
PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations());
|
||||
|
@ -159,6 +161,7 @@ int instanceKlassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
|
|||
blk->do_oop(ik->adr_constants());
|
||||
blk->do_oop(ik->adr_class_loader());
|
||||
blk->do_oop(ik->adr_protection_domain());
|
||||
blk->do_oop(ik->adr_host_klass());
|
||||
blk->do_oop(ik->adr_signers());
|
||||
blk->do_oop(ik->adr_source_file_name());
|
||||
blk->do_oop(ik->adr_source_debug_extension());
|
||||
|
@ -211,6 +214,8 @@ int instanceKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk,
|
|||
if (mr.contains(adr)) blk->do_oop(adr);
|
||||
adr = ik->adr_protection_domain();
|
||||
if (mr.contains(adr)) blk->do_oop(adr);
|
||||
adr = ik->adr_host_klass();
|
||||
if (mr.contains(adr)) blk->do_oop(adr);
|
||||
adr = ik->adr_signers();
|
||||
if (mr.contains(adr)) blk->do_oop(adr);
|
||||
adr = ik->adr_source_file_name();
|
||||
|
@ -260,6 +265,7 @@ int instanceKlassKlass::oop_adjust_pointers(oop obj) {
|
|||
MarkSweep::adjust_pointer(ik->adr_constants());
|
||||
MarkSweep::adjust_pointer(ik->adr_class_loader());
|
||||
MarkSweep::adjust_pointer(ik->adr_protection_domain());
|
||||
MarkSweep::adjust_pointer(ik->adr_host_klass());
|
||||
MarkSweep::adjust_pointer(ik->adr_signers());
|
||||
MarkSweep::adjust_pointer(ik->adr_source_file_name());
|
||||
MarkSweep::adjust_pointer(ik->adr_source_debug_extension());
|
||||
|
@ -295,6 +301,11 @@ void instanceKlassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
|
|||
pm->claim_or_forward_breadth(pd_addr);
|
||||
}
|
||||
|
||||
oop* hk_addr = ik->adr_host_klass();
|
||||
if (PSScavenge::should_scavenge(hk_addr)) {
|
||||
pm->claim_or_forward_breadth(hk_addr);
|
||||
}
|
||||
|
||||
oop* sg_addr = ik->adr_signers();
|
||||
if (PSScavenge::should_scavenge(sg_addr)) {
|
||||
pm->claim_or_forward_breadth(sg_addr);
|
||||
|
@ -318,6 +329,11 @@ void instanceKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
|
|||
pm->claim_or_forward_depth(pd_addr);
|
||||
}
|
||||
|
||||
oop* hk_addr = ik->adr_host_klass();
|
||||
if (PSScavenge::should_scavenge(hk_addr)) {
|
||||
pm->claim_or_forward_depth(hk_addr);
|
||||
}
|
||||
|
||||
oop* sg_addr = ik->adr_signers();
|
||||
if (PSScavenge::should_scavenge(sg_addr)) {
|
||||
pm->claim_or_forward_depth(sg_addr);
|
||||
|
@ -421,6 +437,7 @@ klassOop instanceKlassKlass::allocate_instance_klass(int vtable_len, int itable_
|
|||
ik->set_constants(NULL);
|
||||
ik->set_class_loader(NULL);
|
||||
ik->set_protection_domain(NULL);
|
||||
ik->set_host_klass(NULL);
|
||||
ik->set_signers(NULL);
|
||||
ik->set_source_file_name(NULL);
|
||||
ik->set_source_debug_extension(NULL);
|
||||
|
@ -526,6 +543,7 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) {
|
|||
st->print(" - constants: "); ik->constants()->print_value_on(st); st->cr();
|
||||
st->print(" - class loader: "); ik->class_loader()->print_value_on(st); st->cr();
|
||||
st->print(" - protection domain: "); ik->protection_domain()->print_value_on(st); st->cr();
|
||||
st->print(" - host class: "); ik->host_klass()->print_value_on(st); st->cr();
|
||||
st->print(" - signers: "); ik->signers()->print_value_on(st); st->cr();
|
||||
if (ik->source_file_name() != NULL) {
|
||||
st->print(" - source file: ");
|
||||
|
@ -626,7 +644,7 @@ void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) {
|
|||
ik->_verify_count = Universe::verify_count();
|
||||
#endif
|
||||
// Verify that klass is present in SystemDictionary
|
||||
if (ik->is_loaded()) {
|
||||
if (ik->is_loaded() && !ik->is_anonymous()) {
|
||||
symbolHandle h_name (thread, ik->name());
|
||||
Handle h_loader (thread, ik->class_loader());
|
||||
Handle h_obj(thread, obj);
|
||||
|
@ -764,6 +782,9 @@ void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) {
|
|||
if (ik->protection_domain() != NULL) {
|
||||
guarantee(ik->protection_domain()->is_oop(), "should be oop");
|
||||
}
|
||||
if (ik->host_klass() != NULL) {
|
||||
guarantee(ik->host_klass()->is_oop(), "should be oop");
|
||||
}
|
||||
if (ik->signers() != NULL) {
|
||||
guarantee(ik->signers()->is_objArray(), "should be obj array");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue