natMethod.cc (_Jv_CallAnyMethodA): Don't use vtable dispatch for final methods.
authorBryce McKinlay <bryce@mckinlay.net.nz>
Thu, 30 Oct 2003 21:09:45 +0000 (21:09 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Thu, 30 Oct 2003 21:09:45 +0000 (21:09 +0000)
        * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Don't use
vtable dispatch for final methods.

From-SVN: r73101

libjava/ChangeLog
libjava/java/lang/reflect/natMethod.cc

index b2a0141ec88c705b6e72a2e812834b643a418468..10b7ab6085d1a85b5d1df60ae470bfec59b54407 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-30  Bryce McKinlay  <bryce@mckinlay.net.nz>
+
+       * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Don't use vtable
+       dispatch for final methods.
+
 2003-10-30  Thomas Fitzsimmons  <fitzsim@redhat.com>
 
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c (create): Turn on
index 525a4a0e9c90e892850b9da6030d4b34b30bd742..ed122ea2441215517d9fedbdc99ea72c53b2522d 100644 (file)
@@ -343,6 +343,8 @@ _Jv_CallAnyMethodA (jobject obj,
                    jvalue *result,
                    jboolean is_jni_call)
 {
+  using namespace java::lang::reflect;
+  
 #ifdef USE_LIBFFI
   JvAssert (! is_constructor || ! obj);
   JvAssert (! is_constructor || return_type);
@@ -351,7 +353,7 @@ _Jv_CallAnyMethodA (jobject obj,
   // constructor does need a `this' argument, but it is one we create.
   jboolean needs_this = false;
   if (is_constructor
-      || ! java::lang::reflect::Modifier::isStatic(meth->accflags))
+      || ! Modifier::isStatic(meth->accflags))
     needs_this = true;
 
   int param_count = parameter_types->length;
@@ -464,7 +466,7 @@ _Jv_CallAnyMethodA (jobject obj,
 
   void *ncode;
 
-  if (is_virtual_call)
+  if (is_virtual_call && ! Modifier::isFinal (meth->accflags))
     {
       _Jv_VTable *vtable = *(_Jv_VTable **) obj;
       ncode = vtable->get_method (meth->index);