1 // natField.cc - Implementation of java.lang.reflect.Field native methods.
3 /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
16 #include <java/lang/reflect/Field.h>
17 #include <java/lang/reflect/Modifier.h>
18 #include <java/lang/IllegalArgumentException.h>
19 #include <java/lang/NullPointerException.h>
20 #include <java/lang/Byte.h>
21 #include <java/lang/Short.h>
22 #include <java/lang/Integer.h>
23 #include <java/lang/Long.h>
24 #include <java/lang/Float.h>
25 #include <java/lang/Double.h>
26 #include <java/lang/Boolean.h>
27 #include <java/lang/Character.h>
30 java::lang::reflect::Field::getModifiers ()
32 return _Jv_FromReflectedField (this)->getModifiers ();
36 java::lang::reflect::Field::getName ()
39 name = _Jv_NewStringUtf8Const (_Jv_FromReflectedField (this)->name);
44 java::lang::reflect::Field::getType ()
46 jfieldID fld = _Jv_FromReflectedField (this);
47 JvSynchronize sync (declaringClass);
48 _Jv_ResolveField (fld, declaringClass->getClassLoader ());
53 _Jv_CheckFieldAccessibility (jfieldID /*fld*/, jclass /*caller*/)
60 _Jv_ushort flags = fld->getModifiers();
66 getAddr (java::lang::reflect::Field* field, jclass caller, jobject obj)
68 jfieldID fld = _Jv_FromReflectedField (field);
69 _Jv_ushort flags = fld->getModifiers();
70 if (! (flags & java::lang::reflect::Modifier::PUBLIC)
71 && ! field->isAccessible ())
72 _Jv_CheckFieldAccessibility (fld, caller);
73 if (flags & java::lang::reflect::Modifier::STATIC)
75 jclass fldClass = field->getDeclaringClass ();
76 JvInitClass(fldClass);
82 throw new java::lang::NullPointerException;
83 if (! _Jv_IsInstanceOf (obj, field->getDeclaringClass()))
84 throw new java::lang::IllegalArgumentException;
85 return (void*) ((char*) obj + fld->getOffset ());
90 getBoolean (jclass cls, void* addr)
92 if (cls == JvPrimClass (boolean))
93 return * (jboolean *) addr;
94 throw new java::lang::IllegalArgumentException;
98 getChar (jclass cls, void* addr)
100 if (cls == JvPrimClass (char))
101 return * (jchar *) addr;
102 throw new java::lang::IllegalArgumentException;
106 getByte (jclass cls, void* addr)
108 if (cls == JvPrimClass (byte))
109 return * (jbyte *) addr;
110 throw new java::lang::IllegalArgumentException;
114 getShort (jclass cls, void* addr)
116 if (cls == JvPrimClass (short))
117 return * (jshort *) addr;
118 if (cls == JvPrimClass (byte))
119 return * (jbyte *) addr;
120 throw new java::lang::IllegalArgumentException;
124 getInt (jclass cls, void* addr)
126 if (cls == JvPrimClass (int))
127 return * (jint *) addr;
128 if (cls == JvPrimClass (short))
129 return * (jshort *) addr;
130 if (cls == JvPrimClass (char))
131 return * (jchar *) addr;
132 if (cls == JvPrimClass (byte))
133 return * (jbyte *) addr;
134 throw new java::lang::IllegalArgumentException;
138 getLong (jclass cls, void* addr)
140 if (cls == JvPrimClass (long))
141 return * (jlong *) addr;
142 return ::getInt(cls, addr);
146 getFloat (jclass cls, void* addr)
148 if (cls == JvPrimClass (float))
149 return * (jfloat *) addr;
150 if (cls == JvPrimClass (long))
151 return * (jlong *) addr;
152 return ::getInt(cls, addr);
156 getDouble (jclass cls, void* addr)
158 if (cls == JvPrimClass (double))
159 return * (jdouble *) addr;
160 if (cls == JvPrimClass (float))
161 return * (jfloat *) addr;
162 if (cls == JvPrimClass (long))
163 return * (jlong *) addr;
164 return ::getInt(cls, addr);
168 java::lang::reflect::Field::getBoolean (jclass caller, jobject obj)
170 jfieldID fld = _Jv_FromReflectedField (this);
171 return ::getBoolean (fld->type, getAddr (this, caller, obj));
175 java::lang::reflect::Field::getChar (jclass caller, jobject obj)
177 jfieldID fld = _Jv_FromReflectedField (this);
178 return ::getChar (fld->type, getAddr (this, caller, obj));
182 java::lang::reflect::Field::getByte (jclass caller, jobject obj)
184 jfieldID fld = _Jv_FromReflectedField (this);
185 return ::getByte (fld->type, getAddr (this, caller, obj));
189 java::lang::reflect::Field::getShort (jclass caller, jobject obj)
191 jfieldID fld = _Jv_FromReflectedField (this);
192 return ::getShort (fld->type, getAddr (this, caller, obj));
196 java::lang::reflect::Field::getInt (jclass caller, jobject obj)
198 jfieldID fld = _Jv_FromReflectedField (this);
199 return ::getInt (fld->type, getAddr (this, caller, obj));
203 java::lang::reflect::Field::getLong (jclass caller, jobject obj)
205 jfieldID fld = _Jv_FromReflectedField (this);
206 return ::getLong (fld->type, getAddr (this, caller, obj));
210 java::lang::reflect::Field::getFloat (jclass caller, jobject obj)
212 jfieldID fld = _Jv_FromReflectedField (this);
213 return ::getFloat (fld->type, getAddr (this, caller, obj));
217 java::lang::reflect::Field::getDouble (jclass caller, jobject obj)
219 jfieldID fld = _Jv_FromReflectedField (this);
220 return ::getDouble (fld->type, getAddr (this, caller, obj));
224 java::lang::reflect::Field::get (jclass caller, jobject obj)
226 jfieldID fld = _Jv_FromReflectedField (this);
227 void* addr = getAddr (this, caller, obj);
228 if (! fld->type->isPrimitive ())
229 return * (jobject*) addr;
230 if (fld->type == JvPrimClass (double))
231 return new java::lang::Double (* (jdouble*) addr);
232 if (fld->type == JvPrimClass (float))
233 return new java::lang::Float (* (jfloat*) addr);
234 if (fld->type == JvPrimClass (long))
235 return new java::lang::Long (* (jlong*) addr);
236 if (fld->type == JvPrimClass (int))
237 return new java::lang::Integer (* (jint*) addr);
238 if (fld->type == JvPrimClass (short))
239 return new java::lang::Short (* (jshort*) addr);
240 if (fld->type == JvPrimClass (byte))
241 return new java::lang::Byte (* (jbyte*) addr);
242 if (fld->type == JvPrimClass (char))
243 return new java::lang::Character (* (jchar*) addr);
244 if (fld->type == JvPrimClass (boolean))
246 _Jv_InitClass (&java::lang::Boolean::class$);
247 if (* (jboolean*) addr)
248 return java::lang::Boolean::TRUE;
250 return java::lang::Boolean::FALSE;
252 throw new java::lang::IllegalArgumentException;
256 setBoolean (jclass type, void *addr, jboolean value)
258 if (type == JvPrimClass (boolean))
259 * (jboolean *) addr = value;
261 throw new java::lang::IllegalArgumentException;
265 setChar (jclass type, void *addr, jchar value)
267 if (type == JvPrimClass (char))
268 * (jchar *) addr = value;
269 else if (type == JvPrimClass (int))
270 * (jint *) addr = value;
271 else if (type == JvPrimClass (long))
272 * (jlong *) addr = value;
273 else if (type == JvPrimClass (float))
274 * (jfloat *) addr = value;
275 else if (type == JvPrimClass (double))
276 * (jdouble *) addr = value;
278 throw new java::lang::IllegalArgumentException;
282 setByte (jclass type, void *addr, jbyte value)
284 if (type == JvPrimClass (byte))
285 * (jbyte *) addr = value;
286 else if (type == JvPrimClass (short))
287 * (jshort *) addr = value;
288 else if (type == JvPrimClass (int))
289 * (jint *) addr = value;
290 else if (type == JvPrimClass (long))
291 * (jlong *) addr = value;
292 else if (type == JvPrimClass (float))
293 * (jfloat *) addr = value;
294 else if (type == JvPrimClass (double))
295 * (jdouble *) addr = value;
297 throw new java::lang::IllegalArgumentException;
301 setShort (jclass type, void *addr, jshort value)
303 if (type == JvPrimClass (short))
304 * (jshort *) addr = value;
305 else if (type == JvPrimClass (int))
306 * (jint *) addr = value;
307 else if (type == JvPrimClass (long))
308 * (jlong *) addr = value;
309 else if (type == JvPrimClass (float))
310 * (jfloat *) addr = value;
311 else if (type == JvPrimClass (double))
312 * (jdouble *) addr = value;
314 throw new java::lang::IllegalArgumentException;
318 setInt (jclass type, void *addr, jint value)
320 if (type == JvPrimClass (int))
321 * (jint *) addr = value;
322 else if (type == JvPrimClass (long))
323 * (jlong *) addr = value;
324 else if (type == JvPrimClass (float))
325 * (jfloat *) addr = value;
326 else if (type == JvPrimClass (double))
327 * (jdouble *) addr = value;
329 throw new java::lang::IllegalArgumentException;
333 setLong (jclass type, void *addr, jlong value)
335 if (type == JvPrimClass (long))
336 * (jlong *) addr = value;
337 else if (type == JvPrimClass (float))
338 * (jfloat *) addr = value;
339 else if (type == JvPrimClass (double))
340 * (jdouble *) addr = value;
342 throw new java::lang::IllegalArgumentException;
346 setFloat (jclass type, void *addr, jfloat value)
348 if (type == JvPrimClass (float))
349 * (jfloat *) addr = value;
350 else if (type == JvPrimClass (double))
351 * (jdouble *) addr = value;
353 throw new java::lang::IllegalArgumentException;
357 setDouble (jclass type, void *addr, jdouble value)
359 if (type == JvPrimClass (double))
360 * (jdouble *) addr = value;
362 throw new java::lang::IllegalArgumentException;
366 java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b)
368 jfieldID fld = _Jv_FromReflectedField (this);
369 ::setBoolean (fld->type, getAddr (this, caller, obj), b);
373 java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c)
375 jfieldID fld = _Jv_FromReflectedField (this);
376 ::setChar (fld->type, getAddr (this, caller, obj), c);
380 java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b)
382 jfieldID fld = _Jv_FromReflectedField (this);
383 ::setByte (fld->type, getAddr (this, caller, obj), b);
387 java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s)
389 jfieldID fld = _Jv_FromReflectedField (this);
390 ::setShort (fld->type, getAddr (this, caller, obj), s);
394 java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i)
396 jfieldID fld = _Jv_FromReflectedField (this);
397 ::setInt (fld->type, getAddr (this, caller, obj), i);
401 java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l)
403 jfieldID fld = _Jv_FromReflectedField (this);
404 ::setLong (fld->type, getAddr (this, caller, obj), l);
407 java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f)
409 jfieldID fld = _Jv_FromReflectedField (this);
410 ::setFloat (fld->type, getAddr (this, caller, obj), f);
414 java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d)
416 jfieldID fld = _Jv_FromReflectedField (this);
417 ::setDouble (fld->type, getAddr (this, caller, obj), d);
421 java::lang::reflect::Field::set (jclass caller, jobject object, jobject value, jclass type)
423 if (! _Jv_IsInstanceOf (value, type))
424 throw new java::lang::IllegalArgumentException;
425 void* addr = getAddr (this, caller, object);
426 * (jobject*) addr = value;