Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/reflection.cpp @ 431:a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
Summary: low-level privileged sun.misc.Unsafe.defineAnonymousClass
Reviewed-by: kvn
author | jrose |
---|---|
date | Wed, 12 Nov 2008 22:33:26 -0800 |
parents | d1605aabd0a1 |
children | c89f86385056 |
comparison
equal
deleted
inserted
replaced
430:4d20a3aaf1ab | 431:a45484ea312d |
---|---|
454 } | 454 } |
455 | 455 |
456 return can_relax_access_check_for(current_class, new_class, classloader_only); | 456 return can_relax_access_check_for(current_class, new_class, classloader_only); |
457 } | 457 } |
458 | 458 |
459 static bool under_host_klass(instanceKlass* ik, klassOop host_klass) { | |
460 DEBUG_ONLY(int inf_loop_check = 1000 * 1000 * 1000); | |
461 for (;;) { | |
462 klassOop hc = (klassOop) ik->host_klass(); | |
463 if (hc == NULL) return false; | |
464 if (hc == host_klass) return true; | |
465 ik = instanceKlass::cast(hc); | |
466 | |
467 // There's no way to make a host class loop short of patching memory. | |
468 // Therefore there cannot be a loop here unles there's another bug. | |
469 // Still, let's check for it. | |
470 assert(--inf_loop_check > 0, "no host_klass loop"); | |
471 } | |
472 } | |
473 | |
459 bool Reflection::can_relax_access_check_for( | 474 bool Reflection::can_relax_access_check_for( |
460 klassOop accessor, klassOop accessee, bool classloader_only) { | 475 klassOop accessor, klassOop accessee, bool classloader_only) { |
461 instanceKlass* accessor_ik = instanceKlass::cast(accessor); | 476 instanceKlass* accessor_ik = instanceKlass::cast(accessor); |
462 instanceKlass* accessee_ik = instanceKlass::cast(accessee); | 477 instanceKlass* accessee_ik = instanceKlass::cast(accessee); |
478 | |
479 // If either is on the other's host_klass chain, access is OK, | |
480 // because one is inside the other. | |
481 if (under_host_klass(accessor_ik, accessee) || | |
482 under_host_klass(accessee_ik, accessor)) | |
483 return true; | |
484 | |
463 if (RelaxAccessControlCheck || | 485 if (RelaxAccessControlCheck || |
464 (accessor_ik->major_version() < JAVA_1_5_VERSION && | 486 (accessor_ik->major_version() < JAVA_1_5_VERSION && |
465 accessee_ik->major_version() < JAVA_1_5_VERSION)) { | 487 accessee_ik->major_version() < JAVA_1_5_VERSION)) { |
466 return classloader_only && | 488 return classloader_only && |
467 Verifier::relax_verify_for(accessor_ik->class_loader()) && | 489 Verifier::relax_verify_for(accessor_ik->class_loader()) && |