diff options
author | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-25 06:49:20 +0000 |
---|---|---|
committer | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-25 06:49:20 +0000 |
commit | 080cecf7d1a5ee31b350855374c4396437d2e08f (patch) | |
tree | 19ae3b15fb086062210a6d746f8d2c5cd7f71853 /libjava/java/lang/reflect/natField.cc | |
parent | 4fa34f286c3610f6084f92aee493ff5061827744 (diff) | |
download | ppe42-gcc-080cecf7d1a5ee31b350855374c4396437d2e08f.tar.gz ppe42-gcc-080cecf7d1a5ee31b350855374c4396437d2e08f.zip |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72918 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang/reflect/natField.cc')
-rw-r--r-- | libjava/java/lang/reflect/natField.cc | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/libjava/java/lang/reflect/natField.cc b/libjava/java/lang/reflect/natField.cc index b7f12f06e92..469cf74de8e 100644 --- a/libjava/java/lang/reflect/natField.cc +++ b/libjava/java/lang/reflect/natField.cc @@ -58,27 +58,32 @@ getAddr (java::lang::reflect::Field* field, jclass caller, jobject obj) // have the compiler insert the caller as a hidden argument in some // calls. However, we never implemented that, so we have to find // the caller by hand instead. - gnu::gcj::runtime::StackTrace *t - = new gnu::gcj::runtime::StackTrace(7); - try - { - // We want to skip all the frames on the stack from this class. - for (int i = 1; - !caller || caller == &java::lang::reflect::Field::class$; - i++) - caller = t->classAt (i); - } - catch (::java::lang::ArrayIndexOutOfBoundsException *e) - { - } - + + using namespace java::lang::reflect; + jfieldID fld = _Jv_FromReflectedField (field); _Jv_ushort flags = fld->getModifiers(); - if (! field->isAccessible () - && ! _Jv_CheckAccess (caller, field->getDeclaringClass(), flags)) - throw new java::lang::IllegalAccessException; + + // Check accessibility, if required. + if (! (Modifier::isPublic (flags) || field->isAccessible())) + { + gnu::gcj::runtime::StackTrace *t + = new gnu::gcj::runtime::StackTrace(7); + try + { + // We want to skip all the frames on the stack from this class. + for (int i = 1; !caller || caller == &Field::class$; i++) + caller = t->classAt (i); + } + catch (::java::lang::ArrayIndexOutOfBoundsException *e) + { + } + + if (! _Jv_CheckAccess (caller, field->getDeclaringClass(), flags)) + throw new java::lang::IllegalAccessException; + } - if (flags & java::lang::reflect::Modifier::STATIC) + if (flags & Modifier::STATIC) { jclass fldClass = field->getDeclaringClass (); JvInitClass(fldClass); |