re PR libgcj/7060 (getMethod() doesn't search super interface)
authorTom Tromey <tromey@redhat.com>
Fri, 5 Jul 2002 20:40:11 +0000 (20:40 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Fri, 5 Jul 2002 20:40:11 +0000 (20:40 +0000)
2002-07-04  Tom Tromey  <tromey@redhat.com>
            Jeff Sturm  <jsturm@one-point.com>

Fix for PR libgcj/7060:
* java/lang/Class.h (_getMethod): Renamed from getMethod.
* java/lang/natClass.cc (_getMethod): Renamed from getMethod.
Recurse into superinterfaces.  Don't throw NoSuchMethodException.
* java/lang/Class.java (getMethod): New Java implementation;
complies with spec.
(_getMethod): New native method.

Co-Authored-By: Jeff Sturm <jsturm@one-point.com>
From-SVN: r55266

libjava/ChangeLog
libjava/java/lang/Class.h
libjava/java/lang/Class.java
libjava/java/lang/natClass.cc

index 24696fd1b87b0af76b268905a6a9a2e636dbde97..d5f5fd826f28e60063c2ff1cc881410321e08644 100644 (file)
@@ -1,3 +1,14 @@
+2002-07-04  Tom Tromey  <tromey@redhat.com>
+            Jeff Sturm  <jsturm@one-point.com>
+
+       Fix for PR libgcj/7060:
+       * java/lang/Class.h (_getMethod): Renamed from getMethod.
+       * java/lang/natClass.cc (_getMethod): Renamed from getMethod.
+       Recurse into superinterfaces.  Don't throw NoSuchMethodException.
+       * java/lang/Class.java (getMethod): New Java implementation;
+       complies with spec.
+       (_getMethod): New native method.
+
 2002-07-02  Tom Tromey  <tromey@redhat.com>
             David Hovemeyer  <daveho@cs.umd.edu>
 
index eb33c93a73245d5e240d1a9d8ddd3a80dea3f50a..9eb1a5cac1ac7dea56920640577b1e76f4741b93 100644 (file)
@@ -166,7 +166,7 @@ public:
 
   void getSignature (java::lang::StringBuffer *buffer);
   static jstring getSignature (JArray<jclass> *, jboolean is_constructor);
-  java::lang::reflect::Method *getMethod (jstring, JArray<jclass> *);
+  java::lang::reflect::Method *_getMethod (jstring, JArray<jclass> *);
   JArray<java::lang::reflect::Method *> *getMethods (void);
 
   inline jint getModifiers (void)
index 7bd38dee01f85e69733e18f262914ee7d7fee860..12306da80618366658c5d3b6a29d7c667dae61f3 100644 (file)
@@ -121,8 +121,29 @@ public final class Class implements Serializable
   private static final native String getSignature (Class[] parameterTypes,
                                                   boolean is_construtor);
 
-  public native Method getMethod (String methodName, Class[] parameterTypes)
-    throws NoSuchMethodException, SecurityException;
+  public native Method _getMethod (String methodName, Class[] parameterTypes);
+
+  public Method getMethod (String methodName, Class[] parameterTypes)
+    throws NoSuchMethodException, SecurityException
+  {
+    SecurityManager sm = System.getSecurityManager();
+    if (sm != null)
+      {
+       sm.checkMemberAccess(this, Member.PUBLIC);
+       Package p = getPackage();
+       if (p != null)
+         sm.checkPackageAccess(p.getName());
+      }
+
+    if ("<init>".equals(methodName) || "<clinit>".equals(methodName))
+      throw new NoSuchMethodException(methodName);
+
+    Method m = _getMethod(methodName, parameterTypes);
+    if (m == null)
+      throw new NoSuchMethodException (methodName);
+    return m;
+  }
+
   private native int _getMethods (Method[] result, int offset);
   public native Method[] getMethods () throws SecurityException;
 
index 539909025663c2d2882319a1ce55588feab728a6..43b79adc9b63e74588de4bade2ae20504c572910 100644 (file)
@@ -485,7 +485,7 @@ java::lang::Class::getInterfaces (void)
 }
 
 java::lang::reflect::Method *
-java::lang::Class::getMethod (jstring name, JArray<jclass> *param_types)
+java::lang::Class::_getMethod (jstring name, JArray<jclass> *param_types)
 {
   jstring partial_sig = getSignature (param_types, false);
   jint p_len = partial_sig->length();
@@ -514,7 +514,21 @@ java::lang::Class::getMethod (jstring name, JArray<jclass> *param_types)
            }
        }
     }
-  throw new java::lang::NoSuchMethodException;
+
+  // If we haven't found a match, and this class is an interface, then
+  // check all the superinterfaces.
+  if (isInterface())
+    {
+      for (int i = 0; i < interface_count; ++i)
+       {
+         using namespace java::lang::reflect;
+         Method *rmethod = interfaces[i]->_getMethod (name, param_types);
+         if (rmethod != NULL)
+           return rmethod;
+       }
+    }
+
+  return NULL;
 }
 
 // This is a very slow implementation, since it re-scans all the