This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
patch to fix setting of fields
- From: Per Bothner <per at bothner dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Wed, 23 Jan 2002 10:33:36 -0800
- Subject: patch to fix setting of fields
This patch does two things:
(1) Makes sure the field isn't FINAL before setting it.
(2) In set, does other checks *before* checking that new
value conforms to field type. This better matches the
specification, so we'll get the correct exception.
Does this look ok to check in?
--
--Per Bothner
per@bothner.com http://www.bothner.com/per/
2002-01-23 Per Bothner <per@bothner.com>
* natField.cc (setAddr): New function. Does getAddr + check 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.
Index: natField.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/natField.cc,v
retrieving revision 1.9
diff -u -p -r1.9 natField.cc
--- natField.cc 2001/09/04 03:03:33 1.9
+++ natField.cc 2002/01/23 18:21:50
@@ -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
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;
}