2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / libjava / java / lang / reflect / natArray.cc
blobce76b9c92d4c7045d1e94f4d94ff4d0318e80a77
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
9 details. */
11 #include <config.h>
13 #include <stdlib.h>
15 #include <jvm.h>
16 #include <gcj/cni.h>
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>
29 jobject
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
36 // problem is here.
37 if (componentType == JvPrimClass (void))
38 throw new java::lang::IllegalArgumentException ();
39 return _Jv_NewPrimArray (componentType, length);
41 else
42 // FIXME: class loader?
43 return JvNewObjectArray (length, componentType, NULL);
46 jobject
47 java::lang::reflect::Array::newInstance (jclass componentType,
48 jintArray dimensions)
50 jint ndims = dimensions->length;
51 if (ndims == 0)
52 throw new java::lang::IllegalArgumentException ();
53 jint* dims = elements (dimensions);
54 if (ndims == 1)
55 return newInstance (componentType, dims[0]);
57 gnu::gcj::runtime::StackTrace *t
58 = new gnu::gcj::runtime::StackTrace(4);
59 Class *caller = NULL;
60 ClassLoader *caller_loader = NULL;
61 try
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);
80 jint
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;
89 jclass
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 ();
101 jboolean
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;
110 jchar
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;
119 jbyte
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;
128 jshort
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;
139 jint
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;
154 jlong
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;
171 jfloat
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;
190 jdouble
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;
211 jobject
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;
236 else
237 return java::lang::Boolean::FALSE;
239 throw new java::lang::IllegalArgumentException;
242 void
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;
256 else
257 throw new java::lang::IllegalArgumentException;
260 void
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;
276 else
277 throw new java::lang::IllegalArgumentException;
280 void
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;
294 else
295 throw new java::lang::IllegalArgumentException;
298 void
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;
310 else
311 throw new java::lang::IllegalArgumentException;
314 void
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;
324 else
325 throw new java::lang::IllegalArgumentException;
328 void
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;
336 else
337 throw new java::lang::IllegalArgumentException;
340 void
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;
346 else
347 throw new java::lang::IllegalArgumentException;
350 void
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;
357 else
358 throw new java::lang::IllegalArgumentException;
361 void
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;