1 /* src/vm/array.c - array functions
3 Copyright (C) 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
32 #include "native/llni.h"
35 #include "vm/exceptions.h"
36 #include "vm/global.h"
37 #include "vm/primitive.h"
41 /* array_element_get ***********************************************************
43 Returns a boxed element of the given Java array.
45 *******************************************************************************/
47 java_handle_t *array_element_get(java_handle_t *a, int32_t index)
54 v = LLNI_vftbl_direct(a);
56 type = v->arraydesc->arraytype;
58 value = array_element_primitive_get(a, index);
60 o = primitive_box(type, value);
66 /* array_element_set ***********************************************************
68 Sets a boxed element in the given Java array.
70 *******************************************************************************/
72 void array_element_set(java_handle_t *a, int32_t index, java_handle_t *o)
76 value = primitive_unbox(o);
78 array_element_primitive_set(a, index, value);
82 /* array_element_primitive_get *************************************************
84 Returns a primitive element of the given Java array.
86 *******************************************************************************/
88 imm_union array_element_primitive_get(java_handle_t *a, int32_t index)
94 v = LLNI_vftbl_direct(a);
96 type = v->arraydesc->arraytype;
99 case ARRAYTYPE_BOOLEAN:
100 value.i = array_booleanarray_element_get((java_handle_booleanarray_t *) a, index);
103 value.i = array_bytearray_element_get((java_handle_bytearray_t *) a,
107 value.i = array_chararray_element_get((java_handle_chararray_t *) a,
110 case ARRAYTYPE_SHORT:
111 value.i = array_shortarray_element_get((java_handle_shortarray_t *) a,
115 value.i = array_intarray_element_get((java_handle_intarray_t *) a,
119 value.l = array_longarray_element_get((java_handle_longarray_t *) a,
122 case ARRAYTYPE_FLOAT:
123 value.f = array_floatarray_element_get((java_handle_floatarray_t *) a,
126 case ARRAYTYPE_DOUBLE:
127 value.d = array_doublearray_element_get((java_handle_doublearray_t *) a,
130 case ARRAYTYPE_OBJECT:
131 value.a = array_objectarray_element_get((java_handle_objectarray_t *) a,
135 vm_abort("array_element_primitive_get: invalid array element type %d",
143 /* array_element_primitive_set *************************************************
145 Sets a primitive element in the given Java array.
147 *******************************************************************************/
149 void array_element_primitive_set(java_handle_t *a, int32_t index, imm_union value)
154 v = LLNI_vftbl_direct(a);
156 type = v->arraydesc->arraytype;
159 case ARRAYTYPE_BOOLEAN:
160 array_booleanarray_element_set((java_handle_booleanarray_t *) a,
164 array_bytearray_element_set((java_handle_bytearray_t *) a,
168 array_chararray_element_set((java_handle_chararray_t *) a,
171 case ARRAYTYPE_SHORT:
172 array_shortarray_element_set((java_handle_shortarray_t *) a,
176 array_intarray_element_set((java_handle_intarray_t *) a,
180 array_longarray_element_set((java_handle_longarray_t *) a,
183 case ARRAYTYPE_FLOAT:
184 array_floatarray_element_set((java_handle_floatarray_t *) a,
187 case ARRAYTYPE_DOUBLE:
188 array_doublearray_element_set((java_handle_doublearray_t *) a,
191 case ARRAYTYPE_OBJECT:
192 array_objectarray_element_set((java_handle_objectarray_t *) a,
196 vm_abort("array_element_primitive_set: invalid array element type %d",
202 /* array_xxxarray_element_get **************************************************
204 Returns a primitive element of the given Java array.
206 *******************************************************************************/
208 #define ARRAY_TYPEARRAY_ELEMENT_GET(name, type) \
209 type array_##name##array_element_get(java_handle_##name##array_t *a, int32_t index) \
215 exceptions_throw_nullpointerexception(); \
219 size = LLNI_array_size(a); \
221 if ((index < 0) || (index > size)) { \
222 exceptions_throw_arrayindexoutofboundsexception(); \
226 value = LLNI_array_direct(a, index); \
231 ARRAY_TYPEARRAY_ELEMENT_GET(boolean, uint8_t)
232 ARRAY_TYPEARRAY_ELEMENT_GET(byte, int8_t)
233 ARRAY_TYPEARRAY_ELEMENT_GET(char, uint16_t)
234 ARRAY_TYPEARRAY_ELEMENT_GET(short, int16_t)
235 ARRAY_TYPEARRAY_ELEMENT_GET(int, int32_t)
236 ARRAY_TYPEARRAY_ELEMENT_GET(long, int64_t)
237 ARRAY_TYPEARRAY_ELEMENT_GET(float, float)
238 ARRAY_TYPEARRAY_ELEMENT_GET(double, double)
239 ARRAY_TYPEARRAY_ELEMENT_GET(object, java_handle_t*)
242 /* array_xxxarray_element_set **************************************************
244 Sets a primitive element in the given Java array.
246 *******************************************************************************/
248 #define ARRAY_TYPEARRAY_ELEMENT_SET(name, type) \
249 void array_##name##array_element_set(java_handle_##name##array_t *a, int32_t index, type value) \
254 exceptions_throw_nullpointerexception(); \
258 size = LLNI_array_size(a); \
260 if ((index < 0) || (index > size)) { \
261 exceptions_throw_arrayindexoutofboundsexception(); \
265 LLNI_array_direct(a, index) = value; \
268 ARRAY_TYPEARRAY_ELEMENT_SET(boolean, uint8_t)
269 ARRAY_TYPEARRAY_ELEMENT_SET(byte, int8_t)
270 ARRAY_TYPEARRAY_ELEMENT_SET(char, uint16_t)
271 ARRAY_TYPEARRAY_ELEMENT_SET(short, int16_t)
272 ARRAY_TYPEARRAY_ELEMENT_SET(int, int32_t)
273 ARRAY_TYPEARRAY_ELEMENT_SET(long, int64_t)
274 ARRAY_TYPEARRAY_ELEMENT_SET(float, float)
275 ARRAY_TYPEARRAY_ELEMENT_SET(double, double)
276 ARRAY_TYPEARRAY_ELEMENT_SET(object, java_handle_t*)
279 /* array_length_get ***********************************************************
281 Returns a the length of the given Java array.
283 *******************************************************************************/
285 int32_t array_length_get(java_handle_t *a)
291 exceptions_throw_nullpointerexception();
295 v = LLNI_vftbl_direct(a);
297 if (!class_is_array(v->class)) {
298 /* exceptions_throw_illegalargumentexception("Argument is not an array"); */
299 exceptions_throw_illegalargumentexception();
303 size = LLNI_array_size(a);
310 * These are local overrides for various environment variables in Emacs.
311 * Please do not remove this and leave it at the end of the file, where
312 * Emacs will automagically detect them.
313 * ---------------------------------------------------------------------
316 * indent-tabs-mode: t
320 * vim:noexpandtab:sw=4:ts=4: