Commit 0d49ec11 by Tom Tromey Committed by Tom Tromey

re PR libgcj/7060 (getMethod() doesn't search super interface)

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
parent 9833f679
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>
......
......@@ -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)
......
......@@ -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;
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment