* src/vm/array.c (vm/exceptions.h): Added.
authortwisti <none@none>
Tue, 21 Aug 2007 14:04:59 +0000 (14:04 +0000)
committertwisti <none@none>
Tue, 21 Aug 2007 14:04:59 +0000 (14:04 +0000)
(vm/primitive.h): Likewise.
(array_element_get): New function.
(array_element_set): Likewise.
(array_element_primitive_get): Cast to specific array-type.
(array_element_primitive_set): New function.
(ARRAY_TYPEARRAY_ELEMENT_GET): Added NPE and AIOOBE checks.
(ARRAY_TYPEARRAY_ELEMENT_SET): New macro.
(array_length_get): New function.

* src/vm/array.h (array_element_get): New function.
(array_element_set): Likewise.
(array_booleanarray_element_get,
array_bytearray_element_get,
array_chararray_element_get,
array_shortarray_element_get,
array_intarray_element_get,
array_longarray_element_get,
array_floatarray_element_get,
array_doublearray_element_get,
array_objectarray_element_get): Changed signature.
(array_booleanarray_element_set,
array_bytearray_element_set,
array_chararray_element_set,
array_shortarray_element_set,
array_intarray_element_set,
array_longarray_element_set,
array_floatarray_element_set,
array_doublearray_element_set,
array_objectarray_element_set): New function.
(array_length_get): Likewise.

src/vm/array.c
src/vm/array.h

index 2f7abe9f5c5999bf297dfdffe8eaae73028c85cc..10524a2e04e6944d2ff0629774f655016d89b8f3 100644 (file)
 #include "native/llni.h"
 
 #include "vm/array.h"
+#include "vm/exceptions.h"
 #include "vm/global.h"
+#include "vm/primitive.h"
 #include "vm/vm.h"
 
 
+/* array_element_get ***********************************************************
+
+   Returns a boxed element of the given Java array.
+
+*******************************************************************************/
+
+java_handle_t *array_element_get(java_handle_t *a, int32_t index)
+{
+       vftbl_t       *v;
+       int            type;
+       imm_union      value;
+       java_handle_t *o;
+
+       v = LLNI_vftbl_direct(a);
+
+       type = v->arraydesc->arraytype;
+
+       value = array_element_primitive_get(a, index);
+
+       o = primitive_box(type, value);
+
+       return o;
+}
+
+
+/* array_element_set ***********************************************************
+
+   Sets a boxed element in the given Java array.
+
+*******************************************************************************/
+
+void array_element_set(java_handle_t *a, int32_t index, java_handle_t *o)
+{
+       imm_union value;
+
+       value = primitive_unbox(o);
+
+       array_element_primitive_set(a, index, value);
+}
+
+
 /* array_element_primitive_get *************************************************
 
    Returns a primitive element of the given Java array.
 imm_union array_element_primitive_get(java_handle_t *a, int32_t index)
 {
        vftbl_t  *v;
-       int       elementtype;
+       int       type;
        imm_union value;
 
        v = LLNI_vftbl_direct(a);
 
-       elementtype = v->arraydesc->elementtype;
+       type = v->arraydesc->arraytype;
 
-       switch (elementtype) {
+       switch (type) {
        case ARRAYTYPE_BOOLEAN:
-               value.i = array_booleanarray_element_get(a, index);
+               value.i = array_booleanarray_element_get((java_handle_booleanarray_t *) a, index);
                break;
        case ARRAYTYPE_BYTE:
-               value.i = array_bytearray_element_get(a, index);
+               value.i = array_bytearray_element_get((java_handle_bytearray_t *) a,
+                                                                                         index);
                break;
        case ARRAYTYPE_CHAR:
-               value.i = array_chararray_element_get(a, index);
+               value.i = array_chararray_element_get((java_handle_chararray_t *) a,
+                                                                                         index);
                break;
        case ARRAYTYPE_SHORT:
-               value.i = array_shortarray_element_get(a, index);
+               value.i = array_shortarray_element_get((java_handle_shortarray_t *) a,
+                                                                                          index);
                break;
        case ARRAYTYPE_INT:
-               value.i = array_intarray_element_get(a, index);
+               value.i = array_intarray_element_get((java_handle_intarray_t *) a,
+                                                                                        index);
                break;
        case ARRAYTYPE_LONG:
-               value.l = array_longarray_element_get(a, index);
+               value.l = array_longarray_element_get((java_handle_longarray_t *) a,
+                                                                                         index);
                break;
        case ARRAYTYPE_FLOAT:
-               value.f = array_floatarray_element_get(a, index);
+               value.f = array_floatarray_element_get((java_handle_floatarray_t *) a,
+                                                                                          index);
                break;
        case ARRAYTYPE_DOUBLE:
-               value.d = array_doublearray_element_get(a, index);
+               value.d = array_doublearray_element_get((java_handle_doublearray_t *) a,
+                                                                                               index);
                break;
        case ARRAYTYPE_OBJECT:
-               value.a = array_objectarray_element_get(a, index);
+               value.a = array_objectarray_element_get((java_handle_objectarray_t *) a,
+                                                                                               index);
                break;
-
        default:
                vm_abort("array_element_primitive_get: invalid array element type %d",
-                                elementtype);
+                                type);
        }
 
        return value;
 }
 
 
+/* array_element_primitive_set *************************************************
+
+   Sets a primitive element in the given Java array.
+
+*******************************************************************************/
+
+void array_element_primitive_set(java_handle_t *a, int32_t index, imm_union value)
+{
+       vftbl_t *v;
+       int      type;
+
+       v = LLNI_vftbl_direct(a);
+
+       type = v->arraydesc->arraytype;
+
+       switch (type) {
+       case ARRAYTYPE_BOOLEAN:
+               array_booleanarray_element_set((java_handle_booleanarray_t *) a,
+                                                                          index, value.i);
+               break;
+       case ARRAYTYPE_BYTE:
+               array_bytearray_element_set((java_handle_bytearray_t *) a,
+                                                                       index, value.i);
+               break;
+       case ARRAYTYPE_CHAR:
+               array_chararray_element_set((java_handle_chararray_t *) a,
+                                                                       index, value.i);
+               break;
+       case ARRAYTYPE_SHORT:
+               array_shortarray_element_set((java_handle_shortarray_t *) a,
+                                                                        index, value.i);
+               break;
+       case ARRAYTYPE_INT:
+               array_intarray_element_set((java_handle_intarray_t *) a,
+                                                                  index, value.i);
+               break;
+       case ARRAYTYPE_LONG:
+               array_longarray_element_set((java_handle_longarray_t *) a,
+                                                                       index, value.l);
+               break;
+       case ARRAYTYPE_FLOAT:
+               array_floatarray_element_set((java_handle_floatarray_t *) a,
+                                                                        index, value.f);
+               break;
+       case ARRAYTYPE_DOUBLE:
+               array_doublearray_element_set((java_handle_doublearray_t *) a,
+                                                                         index, value.d);
+               break;
+       case ARRAYTYPE_OBJECT:
+               array_objectarray_element_set((java_handle_objectarray_t *) a,
+                                                                         index, value.a);
+               break;
+       default:
+               vm_abort("array_element_primitive_set: invalid array element type %d",
+                                type);
+       }
+}
+
+
 /* array_xxxarray_element_get **************************************************
 
    Returns a primitive element of the given Java array.
 
 *******************************************************************************/
 
-#define ARRAY_TYPEARRAY_ELEMENT_GET(name, type)                       \
-type array_##name##array_element_get(java_handle_t *a, int32_t index) \
-{                                                                     \
-       java_handle_##name##array_t *ja;                                  \
-       type                         value;                               \
-                                                                      \
-       ja = (java_handle_##name##array_t *) a;                           \
-                                                                      \
-       value = LLNI_array_direct(ja, index);                             \
-                                                                      \
-       return value;                                                     \
+#define ARRAY_TYPEARRAY_ELEMENT_GET(name, type)                                \
+type array_##name##array_element_get(java_handle_##name##array_t *a, int32_t index) \
+{                                                                              \
+       type    value;                                                             \
+       int32_t size;                                                              \
+                                                                               \
+       if (a == NULL) {                                                           \
+               exceptions_throw_nullpointerexception();                               \
+               return (type) 0;                                                       \
+       }                                                                          \
+                                                                               \
+       size = LLNI_array_size(a);                                                 \
+                                                                               \
+       if ((index < 0) || (index > size)) {                                       \
+               exceptions_throw_arrayindexoutofboundsexception();                     \
+               return (type) 0;                                                       \
+       }                                                                          \
+                                                                               \
+       value = LLNI_array_direct(a, index);                                       \
+                                                                               \
+       return value;                                                              \
 }
 
 ARRAY_TYPEARRAY_ELEMENT_GET(boolean, uint8_t)
@@ -122,6 +241,73 @@ ARRAY_TYPEARRAY_ELEMENT_GET(double,  double)
 ARRAY_TYPEARRAY_ELEMENT_GET(object,  java_handle_t*)
 
 
+/* array_xxxarray_element_set **************************************************
+
+   Sets a primitive element in the given Java array.
+
+*******************************************************************************/
+
+#define ARRAY_TYPEARRAY_ELEMENT_SET(name, type)                                \
+void array_##name##array_element_set(java_handle_##name##array_t *a, int32_t index, type value) \
+{                                                                              \
+       int32_t size;                                                              \
+                                                                               \
+       if (a == NULL) {                                                           \
+               exceptions_throw_nullpointerexception();                               \
+               return;                                                                \
+       }                                                                          \
+                                                                               \
+       size = LLNI_array_size(a);                                                 \
+                                                                               \
+       if ((index < 0) || (index > size)) {                                       \
+               exceptions_throw_arrayindexoutofboundsexception();                     \
+               return;                                                                \
+       }                                                                          \
+                                                                               \
+       LLNI_array_direct(a, index) = value;                                       \
+}
+
+ARRAY_TYPEARRAY_ELEMENT_SET(boolean, uint8_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(byte,    int8_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(char,    uint16_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(short,   int16_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(int,     int32_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(long,    int64_t)
+ARRAY_TYPEARRAY_ELEMENT_SET(float,   float)
+ARRAY_TYPEARRAY_ELEMENT_SET(double,  double)
+ARRAY_TYPEARRAY_ELEMENT_SET(object,  java_handle_t*)
+
+
+/* array_length_get ***********************************************************
+
+   Returns a the length of the given Java array.
+
+*******************************************************************************/
+
+int32_t array_length_get(java_handle_t *a)
+{
+       vftbl_t *v;
+       int32_t  size;
+
+       if (a == NULL) {
+               exceptions_throw_nullpointerexception();
+               return 0;
+       }
+
+       v = LLNI_vftbl_direct(a);
+
+       if (!class_is_array(v->class)) {
+/*             exceptions_throw_illegalargumentexception("Argument is not an array"); */
+               exceptions_throw_illegalargumentexception();
+               return 0;
+       }
+
+       size = LLNI_array_size(a);
+
+       return size;
+}
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
index 02b20d1227eea9335ef226230530a95b0164347f..c6e420630e678b1233484136940f7bc2fdac89f2 100644 (file)
 
 /* function prototypes ********************************************************/
 
-imm_union      array_element_primitive_get(java_handle_t *a, int32_t index);
+java_handle_t *array_element_get(java_handle_t *a, int32_t index);
+void           array_element_set(java_handle_t *a, int32_t index, java_handle_t *o);
 
-uint8_t        array_booleanarray_element_get(java_handle_t *a, int32_t index);
-int8_t         array_bytearray_element_get(java_handle_t *a, int32_t index);
-uint16_t       array_chararray_element_get(java_handle_t *a, int32_t index);
-int16_t        array_shortarray_element_get(java_handle_t *a, int32_t index);
-int32_t        array_intarray_element_get(java_handle_t *a, int32_t index);
-int64_t        array_longarray_element_get(java_handle_t *a, int32_t index);
-float          array_floatarray_element_get(java_handle_t *a, int32_t index);
-double         array_doublearray_element_get(java_handle_t *a, int32_t index);
-java_handle_t *array_objectarray_element_get(java_handle_t *a, int32_t index);
+imm_union      array_element_primitive_get(java_handle_t *a, int32_t index);
+void           array_element_primitive_set(java_handle_t *a, int32_t index, imm_union value);
+
+uint8_t        array_booleanarray_element_get(java_handle_booleanarray_t *a, int32_t index);
+int8_t         array_bytearray_element_get(java_handle_bytearray_t *a, int32_t index);
+uint16_t       array_chararray_element_get(java_handle_chararray_t *a, int32_t index);
+int16_t        array_shortarray_element_get(java_handle_shortarray_t *a, int32_t index);
+int32_t        array_intarray_element_get(java_handle_intarray_t *a, int32_t index);
+int64_t        array_longarray_element_get(java_handle_longarray_t *a, int32_t index);
+float          array_floatarray_element_get(java_handle_floatarray_t *a, int32_t index);
+double         array_doublearray_element_get(java_handle_doublearray_t *a, int32_t index);
+java_handle_t *array_objectarray_element_get(java_handle_objectarray_t *a, int32_t index);
+
+void           array_booleanarray_element_set(java_handle_booleanarray_t *a, int32_t index, uint8_t value);
+void           array_bytearray_element_set(java_handle_bytearray_t *a, int32_t index, int8_t value);
+void           array_chararray_element_set(java_handle_chararray_t *a, int32_t index, uint16_t value);
+void           array_shortarray_element_set(java_handle_shortarray_t *a, int32_t index, int16_t value);
+void           array_intarray_element_set(java_handle_intarray_t *a, int32_t index, int32_t value);
+void           array_longarray_element_set(java_handle_longarray_t *a, int32_t index, int64_t value);
+void           array_floatarray_element_set(java_handle_floatarray_t *a, int32_t index, float value);
+void           array_doublearray_element_set(java_handle_doublearray_t *a, int32_t index, double value);
+void           array_objectarray_element_set(java_handle_objectarray_t *a, int32_t index, java_handle_t *value);
+
+int32_t        array_length_get(java_handle_t *a);
 
 #endif /* _VM_ARRAY_H */