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 {