< prev index next >

test/hotspot/jtreg/runtime/InvocationTests/invokevirtual/Checker.java

Print this page




  71     }
  72 
  73     public Method getOverriddenMethod(Class staticTarget, Class dynamicTarget) {
  74         // Assertion #1. C is a subclass of A
  75         if (!staticTarget.isAssignableFrom(dynamicTarget)) {
  76             return null;
  77         }
  78 
  79         Method staticTargetMethod = getDeclaredMethod(staticTarget);
  80         Method dynamicTargetMethod = getDeclaredMethod(dynamicTarget);
  81 
  82         if (staticTarget.equals(dynamicTarget)) {
  83             return staticTargetMethod;
  84         }
  85 
  86         // TODO: ? need to find out the right behavior
  87         if (staticTargetMethod == null) {
  88             return null;
  89         }
  90 
  91         // Dynamic target doesn't have desired method, so check it's superclass
  92         if (dynamicTargetMethod == null) {
  93             return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass());
  94         } else {
  95             // Private method can't override anything
  96             if (Modifier.isPrivate(dynamicTargetMethod.getModifiers())) {
  97                 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass());
  98             }
  99         }
 100 
 101         // TODO: abstract methods
 102 
 103         //Assertion #3.a: A.m2 is PUB || PROT || (PP && PKG(A) == PKG(C))
 104         int staticTargetModifiers = staticTargetMethod.getModifiers();
 105         {
 106             boolean isPublic = Modifier.isPublic(staticTargetModifiers);
 107             boolean isProtected = Modifier.isProtected(staticTargetModifiers);
 108             boolean isPrivate = Modifier.isPrivate(staticTargetModifiers) ;
 109             String staticTargetPkg = getClassPackageName(staticTarget);
 110             String dynamicTargetPkg = getClassPackageName(dynamicTarget);
 111 
 112             if ( isPublic || isProtected
 113                  || ( !isPublic && !isProtected && !isPrivate
 114                       && staticTargetPkg.equals(dynamicTargetPkg)
 115                     ))
 116             {
 117                 return dynamicTargetMethod;
 118             }
 119         }
 120         // OR
 121         //Assertion #3.b: exists m3: C.m1 != B.m3, A.m2 != B.m3, B.m3 overrides A.m2, C.m1 overrides B.m3
 122         Class ancestor = dynamicTarget.getSuperclass();
 123         while (ancestor != staticTarget) {
 124             Method OverriddenM2 = getOverriddenMethod(staticTarget, ancestor);
 125             Method m3 = getDeclaredMethod(ancestor);
 126             Method m1 = getOverriddenMethod(ancestor, dynamicTarget);
 127 
 128             if (m1 != null && m3 != null) {
 129                 if (m1.equals(dynamicTargetMethod) && m3.equals(OverriddenM2)) {
 130                     return dynamicTargetMethod;
 131                 }
 132             } else {
 133                 if (m1 == null && dynamicTargetMethod == null
 134                     && m3 == null && OverriddenM2 == null)
 135                 {
 136                     return null;


  71     }
  72 
  73     public Method getOverriddenMethod(Class staticTarget, Class dynamicTarget) {
  74         // Assertion #1. C is a subclass of A
  75         if (!staticTarget.isAssignableFrom(dynamicTarget)) {
  76             return null;
  77         }
  78 
  79         Method staticTargetMethod = getDeclaredMethod(staticTarget);
  80         Method dynamicTargetMethod = getDeclaredMethod(dynamicTarget);
  81 
  82         if (staticTarget.equals(dynamicTarget)) {
  83             return staticTargetMethod;
  84         }
  85 
  86         // TODO: ? need to find out the right behavior
  87         if (staticTargetMethod == null) {
  88             return null;
  89         }
  90 
  91         // Dynamic target doesn't have desired method, so check its superclass
  92         if (dynamicTargetMethod == null) {
  93             return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass());
  94         } else {
  95             // Private method can't override anything
  96             if (Modifier.isPrivate(dynamicTargetMethod.getModifiers())) {
  97                 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass());
  98             }
  99         }
 100 
 101         // TODO: abstract methods
 102 
 103         //Assertion #3.a: A.m2 is PUB || PROT || (PP && PKG(A) == PKG(C))
 104         int staticTargetModifiers = staticTargetMethod.getModifiers();
 105         {
 106             boolean isPublic = Modifier.isPublic(staticTargetModifiers);
 107             boolean isProtected = Modifier.isProtected(staticTargetModifiers);
 108             boolean isPrivate = Modifier.isPrivate(staticTargetModifiers) ;
 109             String staticTargetPkg = getClassPackageName(staticTarget);
 110             String dynamicTargetPkg = getClassPackageName(dynamicTarget);
 111 
 112             if (isPublic || isProtected
 113                 || (!isPublic && !isProtected && !isPrivate
 114                     && staticTargetPkg.equals(dynamicTargetPkg))) {


 115                 return dynamicTargetMethod;
 116             }
 117         }
 118         // OR
 119         //Assertion #3.b: exists m3: C.m1 != B.m3, A.m2 != B.m3, B.m3 overrides A.m2, C.m1 overrides B.m3
 120         Class ancestor = dynamicTarget.getSuperclass();
 121         while (ancestor != staticTarget) {
 122             Method OverriddenM2 = getOverriddenMethod(staticTarget, ancestor);
 123             Method m3 = getDeclaredMethod(ancestor);
 124             Method m1 = getOverriddenMethod(ancestor, dynamicTarget);
 125 
 126             if (m1 != null && m3 != null) {
 127                 if (m1.equals(dynamicTargetMethod) && m3.equals(OverriddenM2)) {
 128                     return dynamicTargetMethod;
 129                 }
 130             } else {
 131                 if (m1 == null && dynamicTargetMethod == null
 132                     && m3 == null && OverriddenM2 == null)
 133                 {
 134                     return null;
< prev index next >