aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2002-01-23 11:42:18 -0800
committerPer Bothner <bothner@gcc.gnu.org>2002-01-23 11:42:18 -0800
commit033509daea7672c110fbe3ad80b445623deb0848 (patch)
tree6ba6fba52107bfd6271e31bfcd9a63f10ba28498 /libjava/java
parentc588e52b27d5051a1d93f9329a7160bae496f306 (diff)
downloadgcc-033509daea7672c110fbe3ad80b445623deb0848.zip
gcc-033509daea7672c110fbe3ad80b445623deb0848.tar.gz
gcc-033509daea7672c110fbe3ad80b445623deb0848.tar.bz2
natField.cc (setAddr): New function.
* java/lang/reflect/natField.cc (setAddr): New function. Calls getAddr and then checks that the field isn't final. (setBoolean. setChar, setByte, setShort, setInt, setLong, setFloat, setDouble, set): Use setAddr instead of getAddr, to check for FINAL. (set): Call setAddr before check that new value has right type, to better match specified semantics. From-SVN: r49153
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/reflect/natField.cc28
1 files changed, 19 insertions, 9 deletions
diff --git a/libjava/java/lang/reflect/natField.cc b/libjava/java/lang/reflect/natField.cc
index 3ca9293..b0ae48d 100644
--- a/libjava/java/lang/reflect/natField.cc
+++ b/libjava/java/lang/reflect/natField.cc
@@ -16,6 +16,7 @@ details. */
#include <java/lang/reflect/Field.h>
#include <java/lang/reflect/Modifier.h>
#include <java/lang/IllegalArgumentException.h>
+#include <java/lang/IllegalAccessException.h>
#include <java/lang/NullPointerException.h>
#include <java/lang/Byte.h>
#include <java/lang/Short.h>
@@ -252,6 +253,15 @@ java::lang::reflect::Field::get (jclass caller, jobject obj)
throw new java::lang::IllegalArgumentException;
}
+static void*
+setAddr (java::lang::reflect::Field* field, jclass caller, jobject obj)
+{
+ void *addr = getAddr(field, caller, obj);
+ if (field->getModifiers() & java::lang::reflect::Modifier::FINAL)
+ throw new java::lang::IllegalAccessException();
+ return addr;
+}
+
static void
setBoolean (jclass type, void *addr, jboolean value)
{
@@ -366,63 +376,63 @@ void
java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setBoolean (fld->type, getAddr (this, caller, obj), b);
+ ::setBoolean (fld->type, setAddr (this, caller, obj), b);
}
void
java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setChar (fld->type, getAddr (this, caller, obj), c);
+ ::setChar (fld->type, setAddr (this, caller, obj), c);
}
void
java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setByte (fld->type, getAddr (this, caller, obj), b);
+ ::setByte (fld->type, setAddr (this, caller, obj), b);
}
void
java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setShort (fld->type, getAddr (this, caller, obj), s);
+ ::setShort (fld->type, setAddr (this, caller, obj), s);
}
void
java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setInt (fld->type, getAddr (this, caller, obj), i);
+ ::setInt (fld->type, setAddr (this, caller, obj), i);
}
void
java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setLong (fld->type, getAddr (this, caller, obj), l);
+ ::setLong (fld->type, setAddr (this, caller, obj), l);
}
void
java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setFloat (fld->type, getAddr (this, caller, obj), f);
+ ::setFloat (fld->type, setAddr (this, caller, obj), f);
}
void
java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d)
{
jfieldID fld = _Jv_FromReflectedField (this);
- ::setDouble (fld->type, getAddr (this, caller, obj), d);
+ ::setDouble (fld->type, setAddr (this, caller, obj), d);
}
void
java::lang::reflect::Field::set (jclass caller, jobject object, jobject value,
jclass type)
{
+ void* addr = setAddr (this, caller, object);
if (value != NULL && ! _Jv_IsInstanceOf (value, type))
throw new java::lang::IllegalArgumentException;
- void* addr = getAddr (this, caller, object);
* (jobject*) addr = value;
}