summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgary <gary@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-23 11:25:46 +0000
committergary <gary@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-23 11:25:46 +0000
commitd981691c17d94e7ea783a9eac2a69693d7bbc2b2 (patch)
treede7a7aaa1f0a42b41571e5a82154605527a268e0
parenta0384301397fbd6a9ac049d9107ea3d1d9cbcc08 (diff)
downloadgcc-d981691c17d94e7ea783a9eac2a69693d7bbc2b2.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123156 138bc75d-0d04-0410-961f-82ee72b054a4
-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 281fb22fd38..8e4f518f3e0 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 4ea548ec905..1d873acf288 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;
}