diff options
author | gary <gary@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-23 11:25:46 +0000 |
---|---|---|
committer | gary <gary@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-23 11:25:46 +0000 |
commit | d981691c17d94e7ea783a9eac2a69693d7bbc2b2 (patch) | |
tree | de7a7aaa1f0a42b41571e5a82154605527a268e0 | |
parent | a0384301397fbd6a9ac049d9107ea3d1d9cbcc08 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/link.cc | 42 |
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; } |