OpenJDK / lambda / lambda / jdk
changeset 8245:5544bf8a3d4b
8008687: MethodHandle code: allow static and invokespecial calls to interface methods
Contributed-by: bharadwaj.yadavalli@oracle.com
Reviewed-by: rfield
author | rfield |
---|---|
date | Wed, 17 Apr 2013 18:37:05 -0700 |
parents | 8657066e8307 |
children | 0bba7485ca4f |
files | src/share/classes/java/lang/invoke/MemberName.java src/share/classes/java/lang/invoke/MethodHandleNatives.java |
diffstat | 2 files changed, 8 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/MemberName.java Wed Apr 17 16:36:23 2013 -0400 +++ b/src/share/classes/java/lang/invoke/MemberName.java Wed Apr 17 18:37:05 2013 -0700 @@ -236,6 +236,7 @@ assert(MethodHandleNatives.refKindIsMethod(refKind)); if (clazz.isInterface()) assert(refKind == REF_invokeInterface || + refKind == REF_invokeStatic || refKind == REF_invokeVirtual && isObjectPublicMethod()); } else { assert(false); @@ -286,8 +287,12 @@ assert(vmindex >= 0) : vmindex + ":" + this; assert(vmtarget instanceof Class); } else { - if (MethodHandleNatives.refKindDoesDispatch(refKind)) - assert(vmindex >= 0) : vmindex + ":" + this; + if (MethodHandleNatives.refKindDoesDispatch(refKind)) { + // invokeStatic can reference either method table or interface table + if (refKind != REF_invokeStatic) { + assert(vmindex >= 0) : vmindex + ":" + this; + } + } else assert(vmindex < 0) : vmindex; assert(vmtarget instanceof MemberName) : vmtarget + " in " + this;
--- a/src/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Apr 17 16:36:23 2013 -0400 +++ b/src/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Apr 17 18:37:05 2013 -0700 @@ -215,6 +215,7 @@ static boolean refKindDoesDispatch(byte refKind) { assert(refKindIsValid(refKind)); return (refKind == REF_invokeVirtual || + refKind == REF_invokeStatic || refKind == REF_invokeInterface); } static {