diff options
author | Bryce McKinlay <bryce@mckinlay.net.nz> | 2003-10-25 06:49:20 +0000 |
---|---|---|
committer | Bryce McKinlay <bryce@gcc.gnu.org> | 2003-10-25 07:49:20 +0100 |
commit | a10fd356018dec958ed6f1fbfd800d9003c5737c (patch) | |
tree | 19ae3b15fb086062210a6d746f8d2c5cd7f71853 /libjava/java/lang/reflect/natMethod.cc | |
parent | b2398b494702b0e87a0951f7352cc2c38b8b8447 (diff) | |
download | gcc-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.cc | 44 |
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); |