diff options
author | Gary Benson <gbenson@redhat.com> | 2007-03-23 11:25:46 +0000 |
---|---|---|
committer | Gary Benson <gary@gcc.gnu.org> | 2007-03-23 11:25:46 +0000 |
commit | dec93f9008e6329e8f64083c96c7ee77f60c1927 (patch) | |
tree | de7a7aaa1f0a42b41571e5a82154605527a268e0 /libjava/link.cc | |
parent | 3c2e80433d69dc6df77a1e916fe35d75a470528f (diff) | |
download | gcc-dec93f9008e6329e8f64083c96c7ee77f60c1927.tar.gz |
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/link.cc')
-rw-r--r-- | libjava/link.cc | 42 |
1 files changed, 34 insertions, 8 deletions
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; } |