This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: PATCH: fix libgcj/7060
- From: Andrew Pinski <pinskia at physics dot uc dot edu>
- To: Jeff Sturm <jsturm at one-point dot com>
- Cc: java-patches at gcc dot gnu dot org
- Date: Tue, 18 Jun 2002 17:26:51 -0400
- Subject: Re: PATCH: fix libgcj/7060
I would make sure the order of _getMethod in Class.h and
Class.java are in the same place.
Thanks,
Andrew Pinski
On Tuesday, June 18, 2002, at 05:22 , Jeff Sturm wrote:
Here's a possible fix for libgcj/7060. It passed my tests. Full
regression test pending.
I decided it would be best to invoke getMethod recursively, since
interfaces may inherit from a tree of other interfaces. To
avoid catching
NoSuchMethodExceptions I split getMethod into two, introducing a new
private method.
Is this acceptable? I'd like it if someone more familiar with the
class implementation could look it over.
2002-06-18 Jeff Sturm <jsturm@one-point.com>
Fixes libgcj/7060.
* java/lang/Class.h (_getMethod): Add.
* java/lang/Class.java (_getMethod): Add.
* java/lang/natClass.cc (getMethod): Refactor into getMethod and
_getMethod. Search interface list for methods.
diff -rup gcc-3.1-orig/libjava/java/lang/Class.h
gcc-3.1/libjava/java/lang/Class.h
--- gcc-3.1-orig/libjava/java/lang/Class.h Fri Dec 21 14:47:50 2001
+++ gcc-3.1/libjava/java/lang/Class.h Tue Jun 18 11:46:28 2002
@@ -153,6 +153,7 @@ private:
jint _getFields (JArray<java::lang::reflect::Field *>
*result, jint offset);
JArray<java::lang::reflect::Constructor *> *_getConstructors
(jboolean);
java::lang::reflect::Field *getField (jstring, jint);
+ java::lang::reflect::Method *_getMethod (jstring, jstring);
jint _getMethods (JArray<java::lang::reflect::Method *> *result,
jint offset);
java::lang::reflect::Field *getPrivateField (jstring);
diff -rup gcc-3.1-orig/libjava/java/lang/Class.java
gcc-3.1/libjava/java/lang/Class.java
--- gcc-3.1-orig/libjava/java/lang/Class.java Wed Apr 25 11:45:12 2001
+++ gcc-3.1/libjava/java/lang/Class.java Tue Jun 18 11:47:29 2002
@@ -121,6 +121,7 @@ public final class Class implements Seri
private static final native String getSignature (Class[]
parameterTypes,
boolean is_construtor);
+ private native Method _getMethod (String methodName, String
partialSig);
public native Method getMethod (String methodName, Class[]
parameterTypes)
throws NoSuchMethodException, SecurityException;
private native int _getMethods (Method[] result, int offset);
diff -rup gcc-3.1-orig/libjava/java/lang/natClass.cc
gcc-3.1/libjava/java/lang/natClass.cc
--- gcc-3.1-orig/libjava/java/lang/natClass.cc Fri Dec 21 14:47:50 2001
+++ gcc-3.1/libjava/java/lang/natClass.cc Tue Jun 18 17:04:07 2002
@@ -492,12 +492,13 @@ 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, jstring partial_sig)
{
- jstring partial_sig = getSignature (param_types, false);
- jint p_len = partial_sig->length();
_Jv_Utf8Const *utf_name = _Jv_makeUtf8Const (name);
- for (Class *klass = this; klass; klass = klass->getSuperclass())
+ jint p_len = partial_sig->length();
+
+ // Search this and each super class in turn for the named method.
+ for (jclass klass = this; klass; klass = klass->getSuperclass())
{
int i = klass->isPrimitive () ? 0 : klass->method_count;
while (--i >= 0)
@@ -515,13 +516,39 @@ java::lang::Class::getMethod (jstring na
Method *rmethod = new Method ();
rmethod->offset = ((char *) (&klass->methods[i])
- (char *) klass->methods);
rmethod->declaringClass = klass;
return rmethod;
}
}
}
- throw new java::lang::NoSuchMethodException;
+
+ // For interfaces, also search super interfaces.
+ if (isInterface ())
+ for (int n = 0; n < interface_count; n++)
+ {
+ jclass interface = interfaces[n];
+ java::lang::reflect::Method *rmethod;
+
+ rmethod = interface->_getMethod (name, partial_sig);
+
+ if (rmethod)
+ return rmethod;
+ }
+
+ return (java::lang::reflect::Method *) 0;
+}
+
+java::lang::reflect::Method *
+java::lang::Class::getMethod (jstring name, JArray<jclass>
*param_types)
+{
+ jstring partial_sig = getSignature (param_types, false);
+ java::lang::reflect::Method *rmethod = _getMethod (name,
partial_sig);
+
+ if (! rmethod)
+ throw new java::lang::NoSuchMethodException;
+
+ return rmethod;
}
// This is a very slow implementation, since it re-scans all the