Mercurial > hg > release > icedtea7-forest-2.1 > jdk
changeset 4947:b2325315c6ec
7077803: java.lang.InternalError in java.lang.invoke.MethodHandleNatives.init
Summary: Use correct access token for unreflecting MHs where setAccessible(true)
Reviewed-by: never, twisti
author | andrew |
---|---|
date | Tue, 18 Jun 2013 08:18:57 -0500 |
parents | e28599cbc0d4 |
children | 4a67dd684bc2 |
files | src/share/classes/java/lang/invoke/MethodHandles.java |
diffstat | 1 files changed, 11 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/MethodHandles.java Tue Jun 18 08:15:49 2013 -0500 +++ b/src/share/classes/java/lang/invoke/MethodHandles.java Tue Jun 18 08:18:57 2013 -0500 @@ -968,7 +968,9 @@ public MethodHandle unreflect(Method m) throws IllegalAccessException { MemberName method = new MemberName(m); assert(method.isMethod()); - if (!m.isAccessible()) checkMethod(method.getDeclaringClass(), method, method.isStatic()); + if (m.isAccessible()) + return MethodHandleImpl.findMethod(method, true, /*no lookupClass*/ null); + checkMethod(method.getDeclaringClass(), method, method.isStatic()); MethodHandle mh = MethodHandleImpl.findMethod(method, true, lookupClassOrNull()); mh = maybeBindCaller(method, mh, findBoundCallerClass(method)); return restrictProtectedReceiver(method, mh); @@ -1030,8 +1032,13 @@ public MethodHandle unreflectConstructor(Constructor c) throws IllegalAccessException { MemberName ctor = new MemberName(c); assert(ctor.isConstructor()); - if (!c.isAccessible()) checkAccess(c.getDeclaringClass(), ctor, false /* is_setter */); - MethodHandle rawCtor = MethodHandleImpl.findMethod(ctor, false, lookupClassOrNull()); + MethodHandle rawCtor; + if (c.isAccessible()) { + rawCtor = MethodHandleImpl.findMethod(ctor, false, /*no lookupClass*/ null); + } else { + checkAccess(c.getDeclaringClass(), ctor, false /* is_setter */); + rawCtor = MethodHandleImpl.findMethod(ctor, false, lookupClassOrNull()); + } assert(!MethodHandleNatives.isCallerSensitive(ctor)); // maybeBindCaller not relevant here MethodHandle allocator = MethodHandleImpl.makeAllocator(rawCtor); return fixVarargs(allocator, rawCtor); @@ -1315,7 +1322,7 @@ ? "expected a static field" : "expected a non-static field", this); if (trusted) - return MethodHandleImpl.accessField(field, isSetter, lookupClassOrNull()); + return MethodHandleImpl.accessField(field, isSetter, /*no lookupClass*/ null); checkAccess(refc, field, isSetter); MethodHandle mh = MethodHandleImpl.accessField(field, isSetter, lookupClassOrNull()); return restrictProtectedReceiver(field, mh);