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-stack.h>
18 #include <java/lang/reflect/Array.h>
19 #include <java/lang/ArrayIndexOutOfBoundsException.h>
20 #include <java/lang/IllegalArgumentException.h>
21 #include <java/lang/Byte.h>
22 #include <java/lang/Short.h>
23 #include <java/lang/Integer.h>
24 #include <java/lang/Long.h>
25 #include <java/lang/Float.h>
26 #include <java/lang/Double.h>
27 #include <java/lang/Boolean.h>
28 #include <java/lang/Character.h>
31 java::lang::reflect::Array::newInstance (jclass componentType
, jint length
)
33 if (componentType
->isPrimitive())
35 // We could check for this in _Jv_NewPrimArray, but that seems
36 // like needless overhead when the only real route to this
38 if (componentType
== JvPrimClass (void))
39 throw new java::lang::IllegalArgumentException ();
40 return _Jv_NewPrimArray (componentType
, length
);
43 // FIXME: class loader?
44 return JvNewObjectArray (length
, componentType
, NULL
);
48 java::lang::reflect::Array::newInstance (jclass componentType
,
51 jint ndims
= dimensions
->length
;
53 throw new java::lang::IllegalArgumentException ();
54 jint
* dims
= elements (dimensions
);
56 return newInstance (componentType
, dims
[0]);
58 Class
*caller
= _Jv_StackTrace::GetCallingClass (&Array::class$
);
59 ClassLoader
*caller_loader
= NULL
;
61 caller_loader
= caller
->getClassLoaderInternal();
63 jclass arrayType
= componentType
;
64 for (int i
= 0; i
< ndims
; i
++)
65 arrayType
= _Jv_GetArrayClass (arrayType
, caller_loader
);
67 return _Jv_NewMultiArray (arrayType
, ndims
, dims
);
71 java::lang::reflect::Array::getLength (jobject array
)
73 jclass arrayType
= array
->getClass();
74 if (! arrayType
->isArray ())
75 throw new java::lang::IllegalArgumentException
;
76 return ((__JArray
*) array
)->length
;
80 java::lang::reflect::Array::getElementType (jobject array
, jint index
)
82 jclass arrayType
= array
->getClass();
83 if (! arrayType
->isArray ())
84 throw new java::lang::IllegalArgumentException
;
85 jint length
= ((__JArray
*) array
)->length
;
86 if ((_Jv_uint
) index
>= (_Jv_uint
) length
)
87 _Jv_ThrowBadArrayIndex(index
);
88 return arrayType
->getComponentType ();
92 java::lang::reflect::Array::getBoolean (jobject array
, jint index
)
94 jclass elementType
= getElementType (array
, index
);
95 if (elementType
== JvPrimClass (boolean
))
96 return elements ((jbooleanArray
) array
) [index
];
97 throw new java::lang::IllegalArgumentException
;
101 java::lang::reflect::Array::getChar (jobject array
, jint index
)
103 jclass elementType
= getElementType (array
, index
);
104 if (elementType
== JvPrimClass (char))
105 return elements ((jcharArray
) array
) [index
];
106 throw new java::lang::IllegalArgumentException
;
110 java::lang::reflect::Array::getByte (jobject array
, jint index
)
112 jclass elementType
= getElementType (array
, index
);
113 if (elementType
== JvPrimClass (byte
))
114 return elements ((jbyteArray
) array
) [index
];
115 throw new java::lang::IllegalArgumentException
;
119 java::lang::reflect::Array::getShort (jobject array
, jint index
)
121 jclass elementType
= getElementType (array
, index
);
122 if (elementType
== JvPrimClass (short))
123 return elements ((jshortArray
) array
) [index
];
124 if (elementType
== JvPrimClass (byte
))
125 return elements ((jbyteArray
) array
) [index
];
126 throw new java::lang::IllegalArgumentException
;
130 java::lang::reflect::Array::getInt (jobject array
, jint index
)
132 jclass elementType
= getElementType (array
, index
);
133 if (elementType
== JvPrimClass (int))
134 return elements ((jintArray
) array
) [index
];
135 if (elementType
== JvPrimClass (short))
136 return elements ((jshortArray
) array
) [index
];
137 if (elementType
== JvPrimClass (byte
))
138 return elements ((jbyteArray
) array
) [index
];
139 if (elementType
== JvPrimClass (char))
140 return elements ((jcharArray
) array
) [index
];
141 throw new java::lang::IllegalArgumentException
;
145 java::lang::reflect::Array::getLong (jobject array
, jint index
)
147 jclass elementType
= getElementType (array
, index
);
148 if (elementType
== JvPrimClass (long))
149 return elements ((jlongArray
) array
) [index
];
150 if (elementType
== JvPrimClass (int))
151 return elements ((jintArray
) array
) [index
];
152 if (elementType
== JvPrimClass (short))
153 return elements ((jshortArray
) array
) [index
];
154 if (elementType
== JvPrimClass (byte
))
155 return elements ((jbyteArray
) array
) [index
];
156 if (elementType
== JvPrimClass (char))
157 return elements ((jcharArray
) array
) [index
];
158 throw new java::lang::IllegalArgumentException
;
162 java::lang::reflect::Array::getFloat (jobject array
, jint index
)
164 jclass elementType
= getElementType (array
, index
);
165 if (elementType
== JvPrimClass (float))
166 return elements ((jfloatArray
) array
) [index
];
167 if (elementType
== JvPrimClass (long))
168 return elements ((jlongArray
) array
) [index
];
169 if (elementType
== JvPrimClass (int))
170 return elements ((jintArray
) array
) [index
];
171 if (elementType
== JvPrimClass (short))
172 return elements ((jshortArray
) array
) [index
];
173 if (elementType
== JvPrimClass (byte
))
174 return elements ((jbyteArray
) array
) [index
];
175 if (elementType
== JvPrimClass (char))
176 return elements ((jcharArray
) array
) [index
];
177 throw new java::lang::IllegalArgumentException
;
181 java::lang::reflect::Array::getDouble (jobject array
, jint index
)
183 jclass elementType
= getElementType (array
, index
);
184 if (elementType
== JvPrimClass (double))
185 return elements ((jdoubleArray
) array
) [index
];
186 if (elementType
== JvPrimClass (float))
187 return elements ((jfloatArray
) array
) [index
];
188 if (elementType
== JvPrimClass (long))
189 return elements ((jlongArray
) array
) [index
];
190 if (elementType
== JvPrimClass (int))
191 return elements ((jintArray
) array
) [index
];
192 if (elementType
== JvPrimClass (short))
193 return elements ((jshortArray
) array
) [index
];
194 if (elementType
== JvPrimClass (byte
))
195 return elements ((jbyteArray
) array
) [index
];
196 if (elementType
== JvPrimClass (char))
197 return elements ((jcharArray
) array
) [index
];
198 throw new java::lang::IllegalArgumentException
;
202 java::lang::reflect::Array::get (jobject array
, jint index
)
204 jclass elementType
= getElementType (array
, index
);
205 if (! elementType
->isPrimitive ())
206 return elements ((jobjectArray
) array
) [index
];
207 if (elementType
== JvPrimClass (double))
208 return new java::lang::Double (elements ((jdoubleArray
) array
) [index
]);
209 if (elementType
== JvPrimClass (float))
210 return new java::lang::Float (elements ((jfloatArray
) array
) [index
]);
211 if (elementType
== JvPrimClass (long))
212 return new java::lang::Long (elements ((jlongArray
) array
) [index
]);
213 if (elementType
== JvPrimClass (int))
214 return new java::lang::Integer (elements ((jintArray
) array
) [index
]);
215 if (elementType
== JvPrimClass (short))
216 return new java::lang::Short (elements ((jshortArray
) array
) [index
]);
217 if (elementType
== JvPrimClass (byte
))
218 return new java::lang::Byte (elements ((jbyteArray
) array
) [index
]);
219 if (elementType
== JvPrimClass (char))
220 return new java::lang::Character (elements ((jcharArray
) array
) [index
]);
221 if (elementType
== JvPrimClass (boolean
))
223 _Jv_InitClass (&java::lang::Boolean::class$
);
224 if (elements ((jbooleanArray
) array
) [index
])
225 return java::lang::Boolean::TRUE
;
227 return java::lang::Boolean::FALSE
;
229 throw new java::lang::IllegalArgumentException
;
233 java::lang::reflect::Array::setChar (jobject array
, jint index
, jchar value
)
235 jclass elementType
= getElementType (array
, index
);
236 if (elementType
== JvPrimClass (char))
237 elements ((jcharArray
) array
) [index
] = value
;
238 else if (elementType
== JvPrimClass (int))
239 elements ((jintArray
) array
) [index
] = value
;
240 else if (elementType
== JvPrimClass (long))
241 elements ((jlongArray
) array
) [index
] = value
;
242 else if (elementType
== JvPrimClass (float))
243 elements ((jfloatArray
) array
) [index
] = value
;
244 else if (elementType
== JvPrimClass (double))
245 elements ((jdoubleArray
) array
) [index
] = value
;
247 throw new java::lang::IllegalArgumentException
;
251 java::lang::reflect::Array::setByte (jobject array
, jint index
, jbyte value
)
253 jclass elementType
= getElementType (array
, index
);
254 if (elementType
== JvPrimClass (byte
))
255 elements ((jbyteArray
) array
) [index
] = value
;
256 else if (elementType
== JvPrimClass (short))
257 elements ((jshortArray
) array
) [index
] = value
;
258 else if (elementType
== JvPrimClass (int))
259 elements ((jintArray
) array
) [index
] = value
;
260 else if (elementType
== JvPrimClass (long))
261 elements ((jlongArray
) array
) [index
] = value
;
262 else if (elementType
== JvPrimClass (float))
263 elements ((jfloatArray
) array
) [index
] = value
;
264 else if (elementType
== JvPrimClass (double))
265 elements ((jdoubleArray
) array
) [index
] = value
;
267 throw new java::lang::IllegalArgumentException
;
271 java::lang::reflect::Array::setShort (jobject array
, jint index
, jshort value
)
273 jclass elementType
= getElementType (array
, index
);
274 if (elementType
== JvPrimClass (short))
275 elements ((jshortArray
) array
) [index
] = value
;
276 else if (elementType
== JvPrimClass (int))
277 elements ((jintArray
) array
) [index
] = value
;
278 else if (elementType
== JvPrimClass (long))
279 elements ((jlongArray
) array
) [index
] = value
;
280 else if (elementType
== JvPrimClass (float))
281 elements ((jfloatArray
) array
) [index
] = value
;
282 else if (elementType
== JvPrimClass (double))
283 elements ((jdoubleArray
) array
) [index
] = value
;
285 throw new java::lang::IllegalArgumentException
;
289 java::lang::reflect::Array::setInt (jobject array
, jint index
, jint value
)
291 jclass elementType
= getElementType (array
, index
);
292 if (elementType
== JvPrimClass (int))
293 elements ((jintArray
) array
) [index
] = value
;
294 else if (elementType
== JvPrimClass (long))
295 elements ((jlongArray
) array
) [index
] = value
;
296 else if (elementType
== JvPrimClass (float))
297 elements ((jfloatArray
) array
) [index
] = value
;
298 else if (elementType
== JvPrimClass (double))
299 elements ((jdoubleArray
) array
) [index
] = value
;
301 throw new java::lang::IllegalArgumentException
;
305 java::lang::reflect::Array::setLong (jobject array
, jint index
, jlong value
)
307 jclass elementType
= getElementType (array
, index
);
308 if (elementType
== JvPrimClass (long))
309 elements ((jlongArray
) array
) [index
] = value
;
310 else if (elementType
== JvPrimClass (float))
311 elements ((jfloatArray
) array
) [index
] = value
;
312 else if (elementType
== JvPrimClass (double))
313 elements ((jdoubleArray
) array
) [index
] = value
;
315 throw new java::lang::IllegalArgumentException
;
319 java::lang::reflect::Array::setFloat (jobject array
, jint index
, jfloat value
)
321 jclass elementType
= getElementType (array
, index
);
322 if (elementType
== JvPrimClass (float))
323 elements ((jfloatArray
) array
) [index
] = value
;
324 else if (elementType
== JvPrimClass (double))
325 elements ((jdoubleArray
) array
) [index
] = value
;
327 throw new java::lang::IllegalArgumentException
;
331 java::lang::reflect::Array::setDouble (jobject array
, jint index
, jdouble value
)
333 jclass elementType
= getElementType (array
, index
);
334 if (elementType
== JvPrimClass (double))
335 elements ((jdoubleArray
) array
) [index
] = value
;
337 throw new java::lang::IllegalArgumentException
;
341 java::lang::reflect::Array::setBoolean (jobject array
,
342 jint index
, jboolean value
)
344 jclass elementType
= getElementType (array
, index
);
345 if (elementType
== JvPrimClass (boolean
))
346 elements ((jbooleanArray
) array
) [index
] = value
;
348 throw new java::lang::IllegalArgumentException
;
352 java::lang::reflect::Array::set (jobject array
, jint index
,
353 jobject value
, jclass elType
)
355 // We don't have to call getElementType here, or check INDEX,
356 // because it was already done in the Java wrapper.
357 if (value
!= NULL
&& ! _Jv_IsInstanceOf (value
, elType
))
358 throw new java::lang::IllegalArgumentException
;
359 elements ((jobjectArray
) array
) [index
] = value
;