1 // natField.cc - Implementation of java.lang.reflect.Field native methods.
3 /* Copyright (C) 1999, 2000, 2001, 2003 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
17 #include <java/lang/reflect/Array.h>
18 #include <java/lang/ArrayIndexOutOfBoundsException.h>
19 #include <java/lang/IllegalArgumentException.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::Array::newInstance (jclass componentType
, jint length
)
32 if (componentType
->isPrimitive())
34 // We could check for this in _Jv_NewPrimArray, but that seems
35 // like needless overhead when the only real route to this
37 if (componentType
== JvPrimClass (void))
38 throw new java::lang::IllegalArgumentException ();
39 return _Jv_NewPrimArray (componentType
, length
);
42 // FIXME: class loader?
43 return JvNewObjectArray (length
, componentType
, NULL
);
47 java::lang::reflect::Array::newInstance (jclass componentType
,
50 jint ndims
= dimensions
->length
;
52 throw new java::lang::IllegalArgumentException ();
53 jint
* dims
= elements (dimensions
);
55 return newInstance (componentType
, dims
[0]);
57 gnu::gcj::runtime::StackTrace
*t
58 = new gnu::gcj::runtime::StackTrace(4);
60 ClassLoader
*caller_loader
= NULL
;
63 for (int i
= 1; !caller
; i
++)
65 caller
= t
->classAt (i
);
67 caller_loader
= caller
->getClassLoaderInternal();
69 catch (::java::lang::ArrayIndexOutOfBoundsException
*e
)
73 jclass arrayType
= componentType
;
74 for (int i
= 0; i
< ndims
; i
++)
75 arrayType
= _Jv_GetArrayClass (arrayType
, caller_loader
);
77 return _Jv_NewMultiArray (arrayType
, ndims
, dims
);
81 java::lang::reflect::Array::getLength (jobject array
)
83 jclass arrayType
= array
->getClass();
84 if (! arrayType
->isArray ())
85 throw new java::lang::IllegalArgumentException
;
86 return ((__JArray
*) array
)->length
;
90 java::lang::reflect::Array::getElementType (jobject array
, jint index
)
92 jclass arrayType
= array
->getClass();
93 if (! arrayType
->isArray ())
94 throw new java::lang::IllegalArgumentException
;
95 jint length
= ((__JArray
*) array
)->length
;
96 if ((_Jv_uint
) index
>= (_Jv_uint
) length
)
97 _Jv_ThrowBadArrayIndex(index
);
98 return arrayType
->getComponentType ();
102 java::lang::reflect::Array::getBoolean (jobject array
, jint index
)
104 jclass elementType
= getElementType (array
, index
);
105 if (elementType
== JvPrimClass (boolean
))
106 return elements ((jbooleanArray
) array
) [index
];
107 throw new java::lang::IllegalArgumentException
;
111 java::lang::reflect::Array::getChar (jobject array
, jint index
)
113 jclass elementType
= getElementType (array
, index
);
114 if (elementType
== JvPrimClass (char))
115 return elements ((jcharArray
) array
) [index
];
116 throw new java::lang::IllegalArgumentException
;
120 java::lang::reflect::Array::getByte (jobject array
, jint index
)
122 jclass elementType
= getElementType (array
, index
);
123 if (elementType
== JvPrimClass (byte
))
124 return elements ((jbyteArray
) array
) [index
];
125 throw new java::lang::IllegalArgumentException
;
129 java::lang::reflect::Array::getShort (jobject array
, jint index
)
131 jclass elementType
= getElementType (array
, index
);
132 if (elementType
== JvPrimClass (short))
133 return elements ((jshortArray
) array
) [index
];
134 if (elementType
== JvPrimClass (byte
))
135 return elements ((jbyteArray
) array
) [index
];
136 throw new java::lang::IllegalArgumentException
;
140 java::lang::reflect::Array::getInt (jobject array
, jint index
)
142 jclass elementType
= getElementType (array
, index
);
143 if (elementType
== JvPrimClass (int))
144 return elements ((jintArray
) array
) [index
];
145 if (elementType
== JvPrimClass (short))
146 return elements ((jshortArray
) array
) [index
];
147 if (elementType
== JvPrimClass (byte
))
148 return elements ((jbyteArray
) array
) [index
];
149 if (elementType
== JvPrimClass (char))
150 return elements ((jcharArray
) array
) [index
];
151 throw new java::lang::IllegalArgumentException
;
155 java::lang::reflect::Array::getLong (jobject array
, jint index
)
157 jclass elementType
= getElementType (array
, index
);
158 if (elementType
== JvPrimClass (long))
159 return elements ((jlongArray
) array
) [index
];
160 if (elementType
== JvPrimClass (int))
161 return elements ((jintArray
) array
) [index
];
162 if (elementType
== JvPrimClass (short))
163 return elements ((jshortArray
) array
) [index
];
164 if (elementType
== JvPrimClass (byte
))
165 return elements ((jbyteArray
) array
) [index
];
166 if (elementType
== JvPrimClass (char))
167 return elements ((jcharArray
) array
) [index
];
168 throw new java::lang::IllegalArgumentException
;
172 java::lang::reflect::Array::getFloat (jobject array
, jint index
)
174 jclass elementType
= getElementType (array
, index
);
175 if (elementType
== JvPrimClass (float))
176 return elements ((jfloatArray
) array
) [index
];
177 if (elementType
== JvPrimClass (long))
178 return elements ((jlongArray
) array
) [index
];
179 if (elementType
== JvPrimClass (int))
180 return elements ((jintArray
) array
) [index
];
181 if (elementType
== JvPrimClass (short))
182 return elements ((jshortArray
) array
) [index
];
183 if (elementType
== JvPrimClass (byte
))
184 return elements ((jbyteArray
) array
) [index
];
185 if (elementType
== JvPrimClass (char))
186 return elements ((jcharArray
) array
) [index
];
187 throw new java::lang::IllegalArgumentException
;
191 java::lang::reflect::Array::getDouble (jobject array
, jint index
)
193 jclass elementType
= getElementType (array
, index
);
194 if (elementType
== JvPrimClass (double))
195 return elements ((jdoubleArray
) array
) [index
];
196 if (elementType
== JvPrimClass (float))
197 return elements ((jfloatArray
) array
) [index
];
198 if (elementType
== JvPrimClass (long))
199 return elements ((jlongArray
) array
) [index
];
200 if (elementType
== JvPrimClass (int))
201 return elements ((jintArray
) array
) [index
];
202 if (elementType
== JvPrimClass (short))
203 return elements ((jshortArray
) array
) [index
];
204 if (elementType
== JvPrimClass (byte
))
205 return elements ((jbyteArray
) array
) [index
];
206 if (elementType
== JvPrimClass (char))
207 return elements ((jcharArray
) array
) [index
];
208 throw new java::lang::IllegalArgumentException
;
212 java::lang::reflect::Array::get (jobject array
, jint index
)
214 jclass elementType
= getElementType (array
, index
);
215 if (! elementType
->isPrimitive ())
216 return elements ((jobjectArray
) array
) [index
];
217 if (elementType
== JvPrimClass (double))
218 return new java::lang::Double (elements ((jdoubleArray
) array
) [index
]);
219 if (elementType
== JvPrimClass (float))
220 return new java::lang::Float (elements ((jfloatArray
) array
) [index
]);
221 if (elementType
== JvPrimClass (long))
222 return new java::lang::Long (elements ((jlongArray
) array
) [index
]);
223 if (elementType
== JvPrimClass (int))
224 return new java::lang::Integer (elements ((jintArray
) array
) [index
]);
225 if (elementType
== JvPrimClass (short))
226 return new java::lang::Short (elements ((jshortArray
) array
) [index
]);
227 if (elementType
== JvPrimClass (byte
))
228 return new java::lang::Byte (elements ((jbyteArray
) array
) [index
]);
229 if (elementType
== JvPrimClass (char))
230 return new java::lang::Character (elements ((jcharArray
) array
) [index
]);
231 if (elementType
== JvPrimClass (boolean
))
233 _Jv_InitClass (&java::lang::Boolean::class$
);
234 if (elements ((jbooleanArray
) array
) [index
])
235 return java::lang::Boolean::TRUE
;
237 return java::lang::Boolean::FALSE
;
239 throw new java::lang::IllegalArgumentException
;
243 java::lang::reflect::Array::setChar (jobject array
, jint index
, jchar value
)
245 jclass elementType
= getElementType (array
, index
);
246 if (elementType
== JvPrimClass (char))
247 elements ((jcharArray
) array
) [index
] = value
;
248 else if (elementType
== JvPrimClass (int))
249 elements ((jintArray
) array
) [index
] = value
;
250 else if (elementType
== JvPrimClass (long))
251 elements ((jlongArray
) array
) [index
] = value
;
252 else if (elementType
== JvPrimClass (float))
253 elements ((jfloatArray
) array
) [index
] = value
;
254 else if (elementType
== JvPrimClass (double))
255 elements ((jdoubleArray
) array
) [index
] = value
;
257 throw new java::lang::IllegalArgumentException
;
261 java::lang::reflect::Array::setByte (jobject array
, jint index
, jbyte value
)
263 jclass elementType
= getElementType (array
, index
);
264 if (elementType
== JvPrimClass (byte
))
265 elements ((jbyteArray
) array
) [index
] = value
;
266 else if (elementType
== JvPrimClass (short))
267 elements ((jshortArray
) array
) [index
] = value
;
268 else if (elementType
== JvPrimClass (int))
269 elements ((jintArray
) array
) [index
] = value
;
270 else if (elementType
== JvPrimClass (long))
271 elements ((jlongArray
) array
) [index
] = value
;
272 else if (elementType
== JvPrimClass (float))
273 elements ((jfloatArray
) array
) [index
] = value
;
274 else if (elementType
== JvPrimClass (double))
275 elements ((jdoubleArray
) array
) [index
] = value
;
277 throw new java::lang::IllegalArgumentException
;
281 java::lang::reflect::Array::setShort (jobject array
, jint index
, jshort value
)
283 jclass elementType
= getElementType (array
, index
);
284 if (elementType
== JvPrimClass (short))
285 elements ((jshortArray
) array
) [index
] = value
;
286 else if (elementType
== JvPrimClass (int))
287 elements ((jintArray
) array
) [index
] = value
;
288 else if (elementType
== JvPrimClass (long))
289 elements ((jlongArray
) array
) [index
] = value
;
290 else if (elementType
== JvPrimClass (float))
291 elements ((jfloatArray
) array
) [index
] = value
;
292 else if (elementType
== JvPrimClass (double))
293 elements ((jdoubleArray
) array
) [index
] = value
;
295 throw new java::lang::IllegalArgumentException
;
299 java::lang::reflect::Array::setInt (jobject array
, jint index
, jint value
)
301 jclass elementType
= getElementType (array
, index
);
302 if (elementType
== JvPrimClass (int))
303 elements ((jintArray
) array
) [index
] = value
;
304 else if (elementType
== JvPrimClass (long))
305 elements ((jlongArray
) array
) [index
] = value
;
306 else if (elementType
== JvPrimClass (float))
307 elements ((jfloatArray
) array
) [index
] = value
;
308 else if (elementType
== JvPrimClass (double))
309 elements ((jdoubleArray
) array
) [index
] = value
;
311 throw new java::lang::IllegalArgumentException
;
315 java::lang::reflect::Array::setLong (jobject array
, jint index
, jlong value
)
317 jclass elementType
= getElementType (array
, index
);
318 if (elementType
== JvPrimClass (long))
319 elements ((jlongArray
) array
) [index
] = value
;
320 else if (elementType
== JvPrimClass (float))
321 elements ((jfloatArray
) array
) [index
] = value
;
322 else if (elementType
== JvPrimClass (double))
323 elements ((jdoubleArray
) array
) [index
] = value
;
325 throw new java::lang::IllegalArgumentException
;
329 java::lang::reflect::Array::setFloat (jobject array
, jint index
, jfloat value
)
331 jclass elementType
= getElementType (array
, index
);
332 if (elementType
== JvPrimClass (float))
333 elements ((jfloatArray
) array
) [index
] = value
;
334 else if (elementType
== JvPrimClass (double))
335 elements ((jdoubleArray
) array
) [index
] = value
;
337 throw new java::lang::IllegalArgumentException
;
341 java::lang::reflect::Array::setDouble (jobject array
, jint index
, jdouble value
)
343 jclass elementType
= getElementType (array
, index
);
344 if (elementType
== JvPrimClass (double))
345 elements ((jdoubleArray
) array
) [index
] = value
;
347 throw new java::lang::IllegalArgumentException
;
351 java::lang::reflect::Array::setBoolean (jobject array
,
352 jint index
, jboolean value
)
354 jclass elementType
= getElementType (array
, index
);
355 if (elementType
== JvPrimClass (boolean
))
356 elements ((jbooleanArray
) array
) [index
] = value
;
358 throw new java::lang::IllegalArgumentException
;
362 java::lang::reflect::Array::set (jobject array
, jint index
,
363 jobject value
, jclass elType
)
365 // We don't have to call getElementType here, or check INDEX,
366 // because it was already done in the Java wrapper.
367 if (value
!= NULL
&& ! _Jv_IsInstanceOf (value
, elType
))
368 throw new java::lang::IllegalArgumentException
;
369 elements ((jobjectArray
) array
) [index
] = value
;