aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2007-03-23 11:25:46 +0000
committerGary Benson <gary@gcc.gnu.org>2007-03-23 11:25:46 +0000
commitdec93f9008e6329e8f64083c96c7ee77f60c1927 (patch)
treede7a7aaa1f0a42b41571e5a82154605527a268e0 /libjava
parent3c2e80433d69dc6df77a1e916fe35d75a470528f (diff)
downloadgcc-dec93f9008e6329e8f64083c96c7ee77f60c1927.zip
gcc-dec93f9008e6329e8f64083c96c7ee77f60c1927.tar.gz
gcc-dec93f9008e6329e8f64083c96c7ee77f60c1927.tar.bz2
link.cc (_Jv_Linker::resolve_method_entry): Ensure that the argument types and the return type of the found method match...
2007-03-23 Gary Benson <gbenson@redhat.com> * link.cc (_Jv_Linker::resolve_method_entry): Ensure that the argument types and the return type of the found method match those expected by the calling method. From-SVN: r123156
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/link.cc42
2 files changed, 40 insertions, 8 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 281fb22..8e4f518 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-23 Gary Benson <gbenson@redhat.com>
+
+ * link.cc (_Jv_Linker::resolve_method_entry):
+ Ensure that the argument types and the return type of the
+ found method match those expected by the calling method.
+
2007-03-22 David Daney <ddaney@avtrex.com>
PR libgcj/31228
diff --git a/libjava/link.cc b/libjava/link.cc
index 4ea548e..1d873ac 100644
--- a/libjava/link.cc
+++ b/libjava/link.cc
@@ -343,14 +343,6 @@ _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class,
end_of_method_search:
-
- // FIXME: if (cls->loader != klass->loader), then we
- // must actually check that the types of arguments
- // correspond. That is, for each argument type, and
- // the return type, doing _Jv_FindClassFromSignature
- // with either loader should produce the same result,
- // i.e., exactly the same jclass object. JVMS 5.4.3.3
-
if (the_method == 0)
{
java::lang::StringBuffer *sb = new java::lang::StringBuffer();
@@ -364,6 +356,40 @@ _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class,
throw new java::lang::NoSuchMethodError (sb->toString());
}
+ // if (found_class->loader != klass->loader), then we
+ // must actually check that the types of arguments
+ // correspond. That is, for each argument type, and
+ // the return type, doing _Jv_FindClassFromSignature
+ // with either loader should produce the same result,
+ // i.e., exactly the same jclass object. JVMS 5.4.3.3
+ if (found_class->loader != klass->loader)
+ {
+ JArray<jclass> *found_args, *klass_args;
+ jclass found_return, klass_return;
+
+ _Jv_GetTypesFromSignature (the_method,
+ found_class,
+ &found_args,
+ &found_return);
+ _Jv_GetTypesFromSignature (the_method,
+ klass,
+ &klass_args,
+ &klass_return);
+
+ jclass *found_arg = elements (found_args);
+ jclass *klass_arg = elements (klass_args);
+
+ for (int i = 0; i < found_args->length; i++)
+ {
+ if (*(found_arg++) != *(klass_arg++))
+ throw new java::lang::LinkageError (JvNewStringLatin1
+ ("argument type mismatch with different loaders"));
+ }
+ if (found_return != klass_return)
+ throw new java::lang::LinkageError (JvNewStringLatin1
+ ("return type mismatch with different loaders"));
+ }
+
return the_method;
}