Request for reviews (S): 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
christian.thalinger at oracle.com
Thu Sep 22 03:23:49 PDT 2011
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
The problem is that ciEnv::get_fake_invokedynamic_method_impl calls
get_unloaded_method with java.lang.invoke.MethodHandle as the holder
for unresolved call sites.
Since the loader of j.l.i.MethodHandle is the boot class loader the
resolving of e.g. signature classes is done with the boot class loader
resulting in problems like:
(dbx) p this->print()
<ciInstanceKlass name=NEW2 loader=0xe5e88000 loaded=true initialized=true finalized=false subklass=false size=16 flags=public,super super=java/lang/Object ident=714 PERM address=0x8480c40>this->print() = (void)
(dbx) p that->print()
<ciInstanceKlass name=NEW2 loader=0x0 loaded=false ident=720 address=0x8481178>that->print() = (void)
Later in the game a ciInstanceKlass lookup for NEW2 returns a
ciInstanceKlass created during the signature resolving in
get_unloaded_method with the boot class loader as loader resulting in
the above situation.
The fix is to always pass an accessor to get_unloaded_method and
subsequently the ciMethod constructor.
More information about the hotspot-compiler-dev