aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/reflect/natMethod.cc
diff options
context:
space:
mode:
authorBryce McKinlay <bryce@mckinlay.net.nz>2003-10-25 06:49:20 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2003-10-25 07:49:20 +0100
commita10fd356018dec958ed6f1fbfd800d9003c5737c (patch)
tree19ae3b15fb086062210a6d746f8d2c5cd7f71853 /libjava/java/lang/reflect/natMethod.cc
parentb2398b494702b0e87a0951f7352cc2c38b8b8447 (diff)
downloadgcc-a10fd356018dec958ed6f1fbfd800d9003c5737c.zip
gcc-a10fd356018dec958ed6f1fbfd800d9003c5737c.tar.gz
gcc-a10fd356018dec958ed6f1fbfd800d9003c5737c.tar.bz2
re PR libgcj/11780 (Method.invoke() is slow)
PR libgcj/11780: * java/lang/reflect/natMethod.cc (invoke): Look up caller and perform accessibility check only if target is non-public and accessible flag is not set. * java/lang/reflect/natField.cc (getAddr): Likewise. From-SVN: r72918
Diffstat (limited to 'libjava/java/lang/reflect/natMethod.cc')
-rw-r--r--libjava/java/lang/reflect/natMethod.cc44
1 files changed, 26 insertions, 18 deletions
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc
index 6330c4b..b3413ce 100644
--- a/libjava/java/lang/reflect/natMethod.cc
+++ b/libjava/java/lang/reflect/natMethod.cc
@@ -28,6 +28,7 @@ details. */
#include <java/lang/Long.h>
#include <java/lang/Float.h>
#include <java/lang/Double.h>
+#include <java/lang/IllegalAccessException.h>
#include <java/lang/IllegalArgumentException.h>
#include <java/lang/NullPointerException.h>
#include <java/lang/ArrayIndexOutOfBoundsException.h>
@@ -141,26 +142,15 @@ get_ffi_type (jclass klass)
jobject
java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
{
+ using namespace java::lang::reflect;
+
if (parameter_types == NULL)
getType ();
-
- gnu::gcj::runtime::StackTrace *t
- = new gnu::gcj::runtime::StackTrace(4);
- Class *caller = NULL;
- try
- {
- for (int i = 1; !caller; i++)
- {
- caller = t->classAt (i);
- }
- }
- catch (::java::lang::ArrayIndexOutOfBoundsException *e)
- {
- }
-
+
jmethodID meth = _Jv_FromReflectedMethod (this);
+
jclass klass;
- if (! java::lang::reflect::Modifier::isStatic(meth->accflags))
+ if (! Modifier::isStatic(meth->accflags))
{
if (! obj)
throw new java::lang::NullPointerException;
@@ -181,8 +171,26 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
klass = declaringClass;
}
- if (! isAccessible() && ! _Jv_CheckAccess(caller, klass, meth->accflags))
- throw new IllegalArgumentException;
+ // Check accessibility, if required.
+ if (! (Modifier::isPublic (meth->accflags) || this->isAccessible()))
+ {
+ gnu::gcj::runtime::StackTrace *t
+ = new gnu::gcj::runtime::StackTrace(4);
+ Class *caller = NULL;
+ try
+ {
+ for (int i = 1; !caller; i++)
+ {
+ caller = t->classAt (i);
+ }
+ }
+ catch (::java::lang::ArrayIndexOutOfBoundsException *e)
+ {
+ }
+
+ if (! _Jv_CheckAccess(caller, klass, meth->accflags))
+ throw new IllegalAccessException;
+ }
return _Jv_CallAnyMethodA (obj, return_type, meth, false,
parameter_types, args);