diff options
author | Andrew Haley <aph@gcc.gnu.org> | 2004-02-26 15:22:20 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2004-02-26 15:22:20 +0000 |
commit | 50106e8f8d39cd8bead63c0c17608964fef2b27a (patch) | |
tree | a750ef65d0762321fc6644f00d05cc0d8d2e6749 /libjava/java/lang/reflect | |
parent | d0c8fd2aa3e5c2fee7cb233f9b8f9fc9d8251a88 (diff) | |
download | gcc-50106e8f8d39cd8bead63c0c17608964fef2b27a.zip gcc-50106e8f8d39cd8bead63c0c17608964fef2b27a.tar.gz gcc-50106e8f8d39cd8bead63c0c17608964fef2b27a.tar.bz2 |
re PR libgcj/14296 (3.4 regression: Method.Invoke)
2004-02-25 Andrew Haley <aph@redhat.com>
PR java/14296:
* java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Make sure
we have a valid method index.
From-SVN: r78504
Diffstat (limited to 'libjava/java/lang/reflect')
-rw-r--r-- | libjava/java/lang/reflect/natMethod.cc | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index ed122ea..736103b 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -466,7 +466,16 @@ _Jv_CallAnyMethodA (jobject obj, void *ncode; - if (is_virtual_call && ! Modifier::isFinal (meth->accflags)) + // FIXME: If a vtable index is -1 at this point it is invalid, so we + // have to use the ncode. + // + // This can happen because methods in final classes don't have + // vtable entries, but _Jv_isVirtualMethod() doesn't know that. We + // could solve this problem by allocating a vtable index for methods + // in final classes. + if (is_virtual_call + && ! Modifier::isFinal (meth->accflags) + && (_Jv_ushort)-1 != meth->index) { _Jv_VTable *vtable = *(_Jv_VTable **) obj; ncode = vtable->get_method (meth->index); |