8034962: Dynalink to handle superclasses more carefully
authorsundar
Fri, 21 Feb 2014 10:31:40 +0530
changeset 23950 f25485eda4a8
parent 23949 22b52f78c693
child 23951 8e30fd90c1db
8034962: Dynalink to handle superclasses more carefully Reviewed-by: ahgross, attila, jlaskey
nashorn/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
nashorn/src/jdk/internal/dynalink/beans/FacetIntrospector.java
--- a/nashorn/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java	Fri Feb 21 10:01:59 2014 +0530
+++ b/nashorn/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java	Fri Feb 21 10:31:40 2014 +0530
@@ -211,7 +211,8 @@
         if(!CheckRestrictedPackage.isRestrictedClass(clazz)) {
             searchSuperTypes = false;
             for(Method method: clazz.getMethods()) {
-                if(instance != Modifier.isStatic(method.getModifiers())) {
+                final boolean isStatic = Modifier.isStatic(method.getModifiers());
+                if(instance != isStatic) {
                     final MethodSignature sig = new MethodSignature(method);
                     if(!methods.containsKey(sig)) {
                         final Class<?> declaringClass = method.getDeclaringClass();
@@ -228,7 +229,10 @@
                             //generate the said synthetic delegators.
                             searchSuperTypes = true;
                         } else {
-                            methods.put(sig, method);
+                            // don't allow inherited static
+                            if (!isStatic || clazz == declaringClass) {
+                                methods.put(sig, method);
+                            }
                         }
                     }
                 }
@@ -245,7 +249,8 @@
             searchSuperTypes = true;
         }
 
-        if(searchSuperTypes) {
+        // don't need to search super types for static methods
+        if(instance && searchSuperTypes) {
             // If we reach here, the class is either not public, or it is in a restricted package. Alternatively, it is
             // public, but some of its methods claim that their declaring class is non-public. We'll try superclasses
             // and implemented interfaces then looking for public ones.
--- a/nashorn/src/jdk/internal/dynalink/beans/FacetIntrospector.java	Fri Feb 21 10:01:59 2014 +0530
+++ b/nashorn/src/jdk/internal/dynalink/beans/FacetIntrospector.java	Fri Feb 21 10:31:40 2014 +0530
@@ -136,7 +136,13 @@
         final Field[] fields = clazz.getFields();
         final Collection<Field> cfields = new ArrayList<>(fields.length);
         for(Field field: fields) {
-            if(instance != Modifier.isStatic(field.getModifiers()) && isAccessible(field)) {
+            final boolean isStatic = Modifier.isStatic(field.getModifiers());
+            if(isStatic && clazz != field.getDeclaringClass()) {
+                // ignore inherited static fields
+                continue;
+            }
+
+            if(instance != isStatic && isAccessible(field)) {
                 cfields.add(field);
             }
         }