Commit 033509da by Per Bothner Committed by Per Bothner

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
parent c588e52b
2002-01-23 Per Bothner <per@bothner.com>
* 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.
2002-01-22 Tom Tromey <tromey@redhat.com> 2002-01-22 Tom Tromey <tromey@redhat.com>
* java/awt/TextField.java: Replaced with Classpath version. * java/awt/TextField.java: Replaced with Classpath version.
......
...@@ -16,6 +16,7 @@ details. */ ...@@ -16,6 +16,7 @@ details. */
#include <java/lang/reflect/Field.h> #include <java/lang/reflect/Field.h>
#include <java/lang/reflect/Modifier.h> #include <java/lang/reflect/Modifier.h>
#include <java/lang/IllegalArgumentException.h> #include <java/lang/IllegalArgumentException.h>
#include <java/lang/IllegalAccessException.h>
#include <java/lang/NullPointerException.h> #include <java/lang/NullPointerException.h>
#include <java/lang/Byte.h> #include <java/lang/Byte.h>
#include <java/lang/Short.h> #include <java/lang/Short.h>
...@@ -252,6 +253,15 @@ java::lang::reflect::Field::get (jclass caller, jobject obj) ...@@ -252,6 +253,15 @@ java::lang::reflect::Field::get (jclass caller, jobject obj)
throw new java::lang::IllegalArgumentException; 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 static void
setBoolean (jclass type, void *addr, jboolean value) setBoolean (jclass type, void *addr, jboolean value)
{ {
...@@ -366,63 +376,63 @@ void ...@@ -366,63 +376,63 @@ void
java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b) java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setBoolean (fld->type, getAddr (this, caller, obj), b); ::setBoolean (fld->type, setAddr (this, caller, obj), b);
} }
void void
java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c) java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setChar (fld->type, getAddr (this, caller, obj), c); ::setChar (fld->type, setAddr (this, caller, obj), c);
} }
void void
java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b) java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setByte (fld->type, getAddr (this, caller, obj), b); ::setByte (fld->type, setAddr (this, caller, obj), b);
} }
void void
java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s) java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setShort (fld->type, getAddr (this, caller, obj), s); ::setShort (fld->type, setAddr (this, caller, obj), s);
} }
void void
java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i) java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setInt (fld->type, getAddr (this, caller, obj), i); ::setInt (fld->type, setAddr (this, caller, obj), i);
} }
void void
java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l) java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setLong (fld->type, getAddr (this, caller, obj), l); ::setLong (fld->type, setAddr (this, caller, obj), l);
} }
void void
java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f) java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setFloat (fld->type, getAddr (this, caller, obj), f); ::setFloat (fld->type, setAddr (this, caller, obj), f);
} }
void void
java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d) java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d)
{ {
jfieldID fld = _Jv_FromReflectedField (this); jfieldID fld = _Jv_FromReflectedField (this);
::setDouble (fld->type, getAddr (this, caller, obj), d); ::setDouble (fld->type, setAddr (this, caller, obj), d);
} }
void void
java::lang::reflect::Field::set (jclass caller, jobject object, jobject value, java::lang::reflect::Field::set (jclass caller, jobject object, jobject value,
jclass type) jclass type)
{ {
void* addr = setAddr (this, caller, object);
if (value != NULL && ! _Jv_IsInstanceOf (value, type)) if (value != NULL && ! _Jv_IsInstanceOf (value, type))
throw new java::lang::IllegalArgumentException; throw new java::lang::IllegalArgumentException;
void* addr = getAddr (this, caller, object);
* (jobject*) addr = value; * (jobject*) addr = value;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment