* src/vm/array.hpp: Implemented array access classes in C++.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Fri, 26 Dec 2008 15:20:56 +0000 (16:20 +0100)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Fri, 26 Dec 2008 15:20:56 +0000 (16:20 +0100)
* src/vm/array.cpp: Likewise.

* src/vm/jit/builtin.hpp (builtin_newarray, builtin_anewarray): Removed.
* src/vm/jit/builtin.cpp: Likewise.

* src/vm/vm.cpp (vm_run): Minor rework of argument handling.

* src/vm/string.cpp: This code is messed up and needs to be cleaned up soon.

The rest of the files were just updated to the new array access classes, so I
simply list them below:
* src/native/jni.cpp
* src/native/llni.h
* src/native/vm/cldc1.1/com_sun_cldc_io_ResourceInputStream.cpp
* src/native/vm/cldc1.1/com_sun_cldc_io_j2me_socket_Protocol.cpp
* src/native/vm/cldc1.1/java_lang_String.cpp
* src/native/vm/gnuclasspath/gnu_java_lang_VMCPStringBuilder.cpp
* src/native/vm/gnuclasspath/gnu_java_lang_management_VMRuntimeMXBeanImpl.cpp
* src/native/vm/gnuclasspath/java_lang_VMClassLoader.cpp
* src/native/vm/gnuclasspath/java_lang_VMThrowable.cpp
* src/native/vm/gnuclasspath/java_lang_management_VMManagementFactory.cpp
* src/native/vm/openjdk/jvm.cpp
* src/native/vm/reflection.cpp
* src/native/vm/sun_misc_Unsafe.cpp
* src/vm/annotation.cpp
* src/vm/class.cpp
* src/vm/field.cpp
* src/vm/global.h
* src/vm/jit/argument.cpp
* src/vm/jit/stacktrace.cpp
* src/vm/jit/trace.cpp
* src/vm/method.cpp

--HG--
branch : michi

27 files changed:
src/native/jni.cpp
src/native/llni.h
src/native/vm/cldc1.1/com_sun_cldc_io_ResourceInputStream.cpp
src/native/vm/cldc1.1/com_sun_cldc_io_j2me_socket_Protocol.cpp
src/native/vm/cldc1.1/java_lang_String.cpp
src/native/vm/gnuclasspath/gnu_java_lang_VMCPStringBuilder.cpp
src/native/vm/gnuclasspath/gnu_java_lang_management_VMRuntimeMXBeanImpl.cpp
src/native/vm/gnuclasspath/java_lang_VMClassLoader.cpp
src/native/vm/gnuclasspath/java_lang_VMThrowable.cpp
src/native/vm/gnuclasspath/java_lang_management_VMManagementFactory.cpp
src/native/vm/openjdk/jvm.cpp
src/native/vm/reflection.cpp
src/native/vm/sun_misc_Unsafe.cpp
src/vm/annotation.cpp
src/vm/array.cpp
src/vm/array.hpp
src/vm/class.cpp
src/vm/field.cpp
src/vm/global.h
src/vm/jit/argument.cpp
src/vm/jit/builtin.cpp
src/vm/jit/builtin.hpp
src/vm/jit/stacktrace.cpp
src/vm/jit/trace.cpp
src/vm/method.cpp
src/vm/string.cpp
src/vm/vm.cpp

index 1f3bb40d2a7fca51455b3bc97277aaeefa031740..34c090d4c0814c8171862a0358df4481579831fe 100644 (file)
@@ -2484,22 +2484,25 @@ void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID,
 jstring jni_NewString(JNIEnv *env, const jchar *buf, jsize len)
 {
        TRACEJNICALLS(("jni_NewString(env=%p, buf=%p, len=%d)", env, buf, len));
-       
-       java_handle_chararray_t* a = builtin_newarray_char(len);
 
-       if (a == NULL)
+       CharArray ca(len);
+
+       if (ca.is_null())
                return NULL;
 
        /* copy text */
+
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
        for (jsize i = 0; i < len; i++)
-               LLNI_array_direct(a, i) = buf[i];
+               ptr[i] = buf[i];
 
        java_handle_t* h = builtin_new(class_java_lang_String);
 
        if (h == NULL)
                return NULL;
 
-       java_lang_String s(h, a, len, 0);
+       java_lang_String s(h, ca.get_handle(), len, 0);
 
        return (jstring) jni_NewLocalRef(env, (jobject) s.get_handle());
 }
@@ -2547,11 +2550,12 @@ const jchar* jni_GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 
        java_lang_String s(str);
 
-       java_handle_chararray_t* ca     = s.get_value();
-       int32_t                  count  = s.get_count();
-       int32_t                  offset = s.get_offset();
+       CharArray ca(s.get_value());
+
+       int32_t count  = s.get_count();
+       int32_t offset = s.get_offset();
        
-       if (ca == NULL)
+       if (ca.is_null())
                return NULL;
 
        /* allocate memory */
@@ -2560,8 +2564,10 @@ const jchar* jni_GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 
        /* copy text */
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
        for (i = 0; i < count; i++)
-               stringbuffer[i] = LLNI_array_direct(ca, offset + i);
+               stringbuffer[i] = ptr[offset + i];
        
        /* terminate string */
 
@@ -2621,11 +2627,12 @@ jsize jni_GetStringUTFLength(JNIEnv *env, jstring string)
        TRACEJNICALLS(("jni_GetStringUTFLength(env=%p, string=%p)", env, string));
 
        java_lang_String s(string);
-       java_handle_chararray_t* ca     = s.get_value();
-       int32_t                  count  = s.get_count();
+       CharArray        ca(s.get_value());
+       int32_t          count = s.get_count();
 
        // FIXME GC critical section!
-       int32_t length = u2_utflength(ca->data, count);
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+       int32_t length = u2_utflength(ptr, count);
 
        return length;
 }
@@ -2689,14 +2696,11 @@ void _Jv_JNI_ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 
 jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array)
 {
-       java_handle_t *a;
-       jsize          size;
-
        TRACEJNICALLS(("_Jv_JNI_GetArrayLength(env=%p, array=%p)", env, array));
 
-       a = (java_handle_t *) array;
+       Array a(array);
 
-       size = LLNI_array_size(a);
+       jsize size = a.get_length();
 
        return size;
 }
@@ -2712,10 +2716,9 @@ jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array)
 jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
                                                                        jclass elementClass, jobject initialElement)
 {
-       classinfo                 *c;
-       java_handle_t             *o;
-       java_handle_objectarray_t *oa;
-       s4                         i;
+       classinfo*     c;
+       java_handle_t* o;
+       s4             i;
 
        STATISTICS(jniinvokation());
 
@@ -2727,36 +2730,33 @@ jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
                return NULL;
        }
 
-    oa = builtin_anewarray(length, c);
+       ObjectArray oa(length, c);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        /* set all elements to initialElement */
 
        for (i = 0; i < length; i++)
-               array_objectarray_element_set(oa, i, o);
+               oa.set_element(i, o);
 
-       return (jobjectArray) jni_NewLocalRef(env, (jobject) oa);
+       return (jobjectArray) jni_NewLocalRef(env, (jobject) oa.get_handle());
 }
 
 
 jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
                                                                          jsize index)
 {
-       java_handle_objectarray_t *oa;
-       java_handle_t             *o;
-
        STATISTICS(jniinvokation());
 
-       oa = (java_handle_objectarray_t *) array;
+       ObjectArray oa(array);
 
-       if (index >= LLNI_array_size(oa)) {
+       if (index >= oa.get_length()) {
                exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
 
-       o = array_objectarray_element_get(oa, index);
+       java_handle_t* o = oa.get_element(index);
 
        return jni_NewLocalRef(env, (jobject) o);
 }
@@ -2765,15 +2765,11 @@ jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
 void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array,
                                                                   jsize index, jobject val)
 {
-       java_handle_objectarray_t *oa;
-       java_handle_t             *o;
-
        STATISTICS(jniinvokation());
 
-       oa = (java_handle_objectarray_t *) array;
-       o  = (java_handle_t *) val;
+       ObjectArray oa(array);
 
-       if (index >= LLNI_array_size(oa)) {
+       if (index >= oa.get_length()) {
                exceptions_throw_arrayindexoutofboundsexception();
                return;
        }
@@ -2781,18 +2777,18 @@ void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array,
        /* check if the class of value is a subclass of the element class
           of the array */
 
-       if (!builtin_canstore(oa, o))
+       java_handle_t* o  = (java_handle_t *) val;
+
+       if (!builtin_canstore(oa.get_handle(), o))
                return;
 
-       array_objectarray_element_set(oa, index, o);
+       oa.set_element(index, o);
 }
 
 
-#define JNI_NEW_ARRAY(name, type, intern)                \
+#define JNI_NEW_ARRAY(name, type)                        \
 type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len)    \
 {                                                        \
-       java_handle_##intern##array_t *a;                    \
-                                                         \
        STATISTICS(jniinvokation());                         \
                                                          \
        if (len < 0) {                                       \
@@ -2800,19 +2796,20 @@ type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len)    \
                return NULL;                                     \
        }                                                    \
                                                          \
-       a = builtin_newarray_##intern(len);                  \
+       name##Array a(len);                                  \
                                                          \
-       return (type) jni_NewLocalRef(env, (jobject) a); \
+       return (type) jni_NewLocalRef(env,                   \
+                       (jobject) a.get_handle());                   \
 }
 
-JNI_NEW_ARRAY(Boolean, jbooleanArray, boolean)
-JNI_NEW_ARRAY(Byte,    jbyteArray,    byte)
-JNI_NEW_ARRAY(Char,    jcharArray,    char)
-JNI_NEW_ARRAY(Short,   jshortArray,   short)
-JNI_NEW_ARRAY(Int,     jintArray,     int)
-JNI_NEW_ARRAY(Long,    jlongArray,    long)
-JNI_NEW_ARRAY(Float,   jfloatArray,   float)
-JNI_NEW_ARRAY(Double,  jdoubleArray,  double)
+JNI_NEW_ARRAY(Boolean, jbooleanArray)
+JNI_NEW_ARRAY(Byte,    jbyteArray)
+JNI_NEW_ARRAY(Char,    jcharArray)
+JNI_NEW_ARRAY(Short,   jshortArray)
+JNI_NEW_ARRAY(Int,     jintArray)
+JNI_NEW_ARRAY(Long,    jlongArray)
+JNI_NEW_ARRAY(Float,   jfloatArray)
+JNI_NEW_ARRAY(Double,  jdoubleArray)
 
 
 /* Get<PrimitiveType>ArrayElements *********************************************
@@ -2825,16 +2822,14 @@ JNI_NEW_ARRAY(Double,  jdoubleArray,  double)
 type *_Jv_JNI_Get##name##ArrayElements(JNIEnv *env, type##Array array, \
                                                                                 jboolean *isCopy)             \
 {                                                                      \
-       java_handle_##intern##array_t *a;                                  \
-                                                                       \
        TRACEJNICALLS(("_Jv_JNI_Get" STR(name) "ArrayElements(env=%p, array=%p, isCopy=%d)", env, array, isCopy)); \
                                                                        \
-       a = (java_handle_##intern##array_t *) array;                       \
+       name##Array a(array);                                              \
                                                                        \
        if (isCopy)                                                        \
                *isCopy = JNI_FALSE;                                           \
                                                                        \
-       return (type *) LLNI_array_data(a);                                \
+       return (type *) a.get_raw_data_ptr();                              \
 }
 
 JNI_GET_ARRAY_ELEMENTS(Boolean, jboolean, boolean)
@@ -2862,19 +2857,17 @@ JNI_GET_ARRAY_ELEMENTS(Double,  jdouble,  double)
 void _Jv_JNI_Release##name##ArrayElements(JNIEnv *env, type##Array array,  \
                                                                                  type *elems, jint mode)          \
 {                                                                          \
-       java_handle_##intern##array_t *a;                                      \
-                                                                           \
        STATISTICS(jniinvokation());                                           \
                                                                            \
-       a = (java_handle_##intern##array_t *) array;                           \
+       name##Array a(array);                                                  \
                                                                            \
-       if (elems != (type *) LLNI_array_data(a)) {                            \
+       if (elems != (type *) a.get_raw_data_ptr()) {                          \
                switch (mode) {                                                    \
                case JNI_COMMIT:                                                   \
-                       MCOPY(LLNI_array_data(a), elems, intern2, LLNI_array_size(a)); \
+                       a.set_region(0, a.get_length(), (intern2 *) elems);            \
                        break;                                                         \
                case 0:                                                            \
-                       MCOPY(LLNI_array_data(a), elems, intern2, LLNI_array_size(a)); \
+                       a.set_region(0, a.get_length(), (intern2 *) elems);            \
                        /* XXX TWISTI how should it be freed? */                       \
                        break;                                                         \
                case JNI_ABORT:                                                    \
@@ -2905,16 +2898,14 @@ JNI_RELEASE_ARRAY_ELEMENTS(Double,  jdouble,  double,  double)
 void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array,     \
                                                                        jsize start, jsize len, type *buf)  \
 {                                                                       \
-       java_handle_##intern##array_t *a;                                   \
-                                                                        \
        TRACEJNICALLS(("_Jv_JNI_Get" STR(name) "ArrayRegion(env=%p, array=%p, start=%d, len=%d, buf=%p)", env, array, start, len, buf)); \
                                                                         \
-       a = (java_handle_##intern##array_t *) array;                        \
+       name##Array a(array);                                               \
                                                                         \
-       if ((start < 0) || (len < 0) || (start + len > LLNI_array_size(a))) \
+       if ((start < 0) || (len < 0) || (start + len > a.get_length()))     \
                exceptions_throw_arrayindexoutofboundsexception();              \
        else                                                                \
-               MCOPY(buf, &LLNI_array_direct(a, start), intern2, len);         \
+               a.get_region(start, len, (intern2 *) buf);                      \
 }
 
 JNI_GET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
@@ -2938,16 +2929,14 @@ JNI_GET_ARRAY_REGION(Double,  jdouble,  double,  double)
 void _Jv_JNI_Set##name##ArrayRegion(JNIEnv *env, type##Array array,          \
                                                                        jsize start, jsize len, const type *buf) \
 {                                                                            \
-       java_handle_##intern##array_t *a;                                        \
-                                                                             \
        STATISTICS(jniinvokation());                                             \
                                                                              \
-       a = (java_handle_##intern##array_t *) array;                             \
+       name##Array a(array);                                                    \
                                                                              \
-       if ((start < 0) || (len < 0) || (start + len > LLNI_array_size(a)))      \
+       if ((start < 0) || (len < 0) || (start + len > a.get_length()))          \
                exceptions_throw_arrayindexoutofboundsexception();                   \
        else                                                                     \
-               MCOPY(&LLNI_array_direct(a, start), buf, intern2, len);              \
+               a.set_region(start, len, (intern2 *) buf);                           \
 }
 
 JNI_SET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
@@ -3094,15 +3083,15 @@ jint _Jv_JNI_GetJavaVM(JNIEnv *env, JavaVM **javavm)
 void jni_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
 {
        java_lang_String s(str);
-       java_handle_chararray_t* ca    = s.get_value();
-       int32_t                  count = s.get_count();
+       CharArray        ca(s.get_value());
+       int32_t          count = s.get_count();
 
        if ((start < 0) || (len < 0) || (start > count) || (start + len > count)) {
                exceptions_throw_stringindexoutofboundsexception();
                return;
        }
 
-       MCOPY(buf, &LLNI_array_direct(ca, start), u2, len);
+       ca.get_region(start, len, buf);
 }
 
 
@@ -3121,9 +3110,11 @@ void jni_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, ch
        TRACEJNICALLS(("jni_GetStringUTFRegion(env=%p, str=%p, start=%d, len=%d, buf=%p)", env, str, start, len, buf));
 
        java_lang_String s(str);
-       java_handle_chararray_t* ca     = s.get_value();
-       int32_t                  count  = s.get_count();
-       int32_t                  offset = s.get_offset();
+
+       CharArray ca(s.get_value());
+
+       int32_t count  = s.get_count();
+       int32_t offset = s.get_offset();
 
        if ((start < 0) || (len < 0) || (start > count) || (start + len > count)) {
                exceptions_throw_stringindexoutofboundsexception();
@@ -3132,8 +3123,10 @@ void jni_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, ch
 
        int32_t i;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
        for (i = 0; i < len; i++)
-               buf[i] = LLNI_array_direct(ca, offset + start + i);
+               buf[i] = ptr[offset + start + i];
 
        buf[i] = '\0';
 }
index 6112dfbfe4a4b286db7632a7e3430ef3219c7e91..77cb9299b68a2000778c09bc10d8cb0599568513 100644 (file)
 
 #define LLNI_field_direct(obj, field) (LLNI_DIRECT(obj)->field)
 #define LLNI_vftbl_direct(obj)        (LLNI_DIRECT((java_handle_t *) (obj))->vftbl)
-#define LLNI_array_direct(arr, index) (LLNI_DIRECT(arr)->data[(index)])
-#define LLNI_array_data(arr)          (LLNI_DIRECT(arr)->data)
-#define LLNI_array_size(arr)          (LLNI_DIRECT((java_handle_objectarray_t *) (arr))->header.size)
 
 
 /* LLNI critical sections ******************************************************
index ba78eaaddf441a7309fec2eee7b96f5fa3495ed6..81742ad62ce502d395eaa2a96fadbefb56b52287 100644 (file)
@@ -34,7 +34,6 @@
 #include "mm/memory.hpp"
 
 #include "native/jni.hpp"
-#include "native/llni.h"
 #include "native/native.hpp"
 
 #if defined(ENABLE_JNI_HEADERS)
@@ -302,8 +301,9 @@ JNIEXPORT jint JNICALL Java_com_sun_cldc_io_ResourceInputStream_readBytes(JNIEnv
 {
        /* get pointer to the buffer */
        // XXX Not GC safe.
-       void* buf = &(LLNI_array_direct((java_handle_bytearray_t*) byteArray, off));
-       
+       ByteArray ba(byteArray);
+       void* buf = (void*) (((int8_t*) ba.get_raw_data_ptr()) + off);
+
        com_sun_cldchi_jvm_FileDescriptor fd(jobj);
 
        int64_t filep      = fd.get_pointer();
index 16bebd345efc6aa23b3d1d82550b4c612853c676..856745cfba274719d69ecd1be6b05cc4ab1b7ea7 100644 (file)
@@ -37,7 +37,6 @@
 #include "mm/memory.hpp"
 
 #include "native/jni.hpp"
-#include "native/llni.h"
 #include "native/native.hpp"
 
 #if defined(ENABLE_JNI_HEADERS)
@@ -63,7 +62,8 @@ JNIEXPORT jint JNICALL Java_com_sun_cldc_io_j2me_socket_Protocol_open0(JNIEnv *e
 
        // The hostname byte-array is a NULL terminated C-string.
        // XXX Not GC safe.
-       char* name = (char*) &(LLNI_array_data((java_handle_bytearray_t*) hostname));
+       ByteArray ba(hostname);
+       char* name = (char*) ba.get_raw_data_ptr();
 
        /* get the host */
 
@@ -106,7 +106,8 @@ JNIEXPORT jint JNICALL Java_com_sun_cldc_io_j2me_socket_Protocol_readBuf(JNIEnv
 {
        // Get pointer to the buffer.
        // XXX Not GC safe.
-       void* buf = &(LLNI_array_direct((java_handle_bytearray_t*) b, off));
+       ByteArray ba(b);
+       void* buf = (void*) (((int8_t*) ba.get_raw_data_ptr()) + off);
 
        // Receive from the socket.
        ssize_t result = recv(handle, buf, len, 0);
@@ -157,7 +158,8 @@ JNIEXPORT jint JNICALL Java_com_sun_cldc_io_j2me_socket_Protocol_writeBuf(JNIEnv
 {
        // Get pointer to the buffer.
        // XXX Not GC safe.
-       void* buf = &(LLNI_array_direct((java_handle_bytearray_t*) b, off));
+       ByteArray ba(b);
+       void* buf = (void*) (((int8_t*) ba.get_raw_data_ptr()) + off);
        
        // Send the given byte to the socket.
        ssize_t result = send(handle, buf, len, 0);
index b86e539d45c22aa35cd12947f3c0ab84984a0633..a1f72ae7448efcd67ebf7bdca976aa1afa410221 100644 (file)
@@ -30,7 +30,6 @@
 #include <string.h>
 
 #include "native/jni.hpp"
-#include "native/llni.h"
 #include "native/native.hpp"
 
 #if defined(ENABLE_JNI_HEADERS)
@@ -53,14 +52,15 @@ JNIEXPORT jint JNICALL Java_java_lang_String_hashCode(JNIEnv *env, jstring _this
 {
        java_lang_String jls(_this);
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray value(jls.get_value());
+
        int32_t offset = jls.get_offset();
        int32_t count  = jls.get_count();
 
        int32_t hash = 0;
 
        for (int32_t i = 0; i < count; i++) {
-               hash = (31 * hash) + LLNI_array_direct(value, offset + i);
+               hash = (31 * hash) + value.get_element(offset + i);
        }
 
        return hash;
@@ -76,12 +76,13 @@ JNIEXPORT jint JNICALL Java_java_lang_String_indexOf__I(JNIEnv *env, jstring _th
 {
        java_lang_String jls(_this);
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray value(jls.get_value());
+
        int32_t offset = jls.get_offset();
        int32_t count  = jls.get_count();
 
        for (int32_t i = 0; i < count; i++) {
-               if (LLNI_array_direct(value, offset + i) == ch) {
+               if (value.get_element(offset + i) == ch) {
                        return i;
                }
        }
@@ -99,7 +100,8 @@ JNIEXPORT jint JNICALL Java_java_lang_String_indexOf__II(JNIEnv *env, jstring _t
 {
        java_lang_String jls(_this);
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray value(jls.get_value());
+
        int32_t offset = jls.get_offset();
        int32_t count  = jls.get_count();
 
@@ -112,7 +114,7 @@ JNIEXPORT jint JNICALL Java_java_lang_String_indexOf__II(JNIEnv *env, jstring _t
        }
 
        for (int32_t i = fromIndex ; i < count ; i++) {
-               if (LLNI_array_direct(value, offset + i) == ch) {
+               if (value.get_element(offset + i) == ch) {
                        return i;
                }
        }
@@ -130,14 +132,15 @@ JNIEXPORT jint JNICALL Java_java_lang_String_lastIndexOf__II(JNIEnv *env, jstrin
 {
        java_lang_String jls(_this);
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray value(jls.get_value());
+
        int32_t offset = jls.get_offset();
        int32_t count  = jls.get_count();
 
        int32_t start = ((fromIndex >= count) ? count - 1 : fromIndex);
 
        for (int32_t i = start; i >= 0; i--) {
-               if (LLNI_array_direct(value, offset + i) == ch) {
+               if (value.get_element(offset + i) == ch) {
                        return i;
                }
        }
index c0b34194224d2ec9d1ca69d1f0cc0a39e054b6fc..59ba4e704b624b562e2ac446d08faab33f08655d 100644 (file)
@@ -35,6 +35,7 @@
 # include "native/vm/include/gnu_java_lang_VMCPStringBuilder.h"
 #endif
 
+#include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/globals.hpp"
@@ -51,13 +52,13 @@ JNIEXPORT jstring JNICALL Java_gnu_java_lang_VMCPStringBuilder_toString(JNIEnv *
        /* This is a native version of
           java.lang.String.<init>([CIIZ)Ljava/lang/String; */
 
-    if (startIndex < 0) {
+       if (startIndex < 0) {
 /*             exceptions_throw_stringindexoutofboundsexception("offset: " + offset); */
                exceptions_throw_stringindexoutofboundsexception();
                return NULL;
        }
 
-    if (count < 0) {
+       if (count < 0) {
 /*             exceptions_throw_stringindexoutofboundsexception("count: " + count); */
                exceptions_throw_stringindexoutofboundsexception();
                return NULL;
@@ -65,13 +66,9 @@ JNIEXPORT jstring JNICALL Java_gnu_java_lang_VMCPStringBuilder_toString(JNIEnv *
 
     /* equivalent to: offset + count < 0 || offset + count > data.length */
 
-       java_handle_chararray_t* ca = (java_handle_chararray_t*) value;
+       CharArray ca(value);
 
-       LLNI_CRITICAL_START;
-       int32_t length = LLNI_array_size(ca);
-       LLNI_CRITICAL_END;
-
-    if (length - startIndex < count) {
+       if (ca.get_length() - startIndex < count) {
 /*             exceptions_throw_stringindexoutofboundsexception("offset + count: " + (offset + count)); */
                exceptions_throw_stringindexoutofboundsexception();
                return NULL;
@@ -82,7 +79,7 @@ JNIEXPORT jstring JNICALL Java_gnu_java_lang_VMCPStringBuilder_toString(JNIEnv *
        if (h == NULL)
                return NULL;
 
-       java_lang_String s(h, ca, (int32_t) count, (int32_t) startIndex);
+       java_lang_String s(h, ca.get_handle(), (int32_t) count, (int32_t) startIndex);
 
        return (jstring) s.get_handle();
 }
index c17382a54fc729faca297936393680a2bd4f5e11..0bca5347cd76f41d99cc84602649db58b460f4eb 100644 (file)
@@ -34,6 +34,7 @@
 # include "native/vm/include/gnu_java_lang_management_VMRuntimeMXBeanImpl.h"
 #endif
 
+#include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/global.h"
 #include "vm/globals.hpp"
@@ -53,7 +54,9 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_gnu_java_lang_management_VMRun
 {
        log_println("Java_gnu_java_lang_management_VMRuntimeMXBeanImpl_getInputArguments: IMPLEMENT ME!");
 
-       return builtin_anewarray(0, class_java_lang_String);
+       ObjectArray oa(0, class_java_lang_String);
+
+       return oa.get_handle();
 }
 
 
index ebeeb162885c7f07b55162ea875171cfeebc57a2..b67c8bc9ef48de663bc5034d189a81006380e26e 100644 (file)
@@ -46,6 +46,7 @@
 #include "vm/assertion.hpp"
 #endif
 
+#include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/class.hpp"
 #include "vm/classcache.hpp"
@@ -79,11 +80,10 @@ extern "C" {
  */
 JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, jobject cl, jstring name, jbyteArray data, jint offset, jint len, jobject pd)
 {
-       utf             *utfname;
-       classinfo       *c;
-       classloader_t   *loader;
-       java_handle_bytearray_t* ba;
-       uint8_t*                 stream;
+       utf*           utfname;
+       classinfo*     c;
+       classloader_t* loader;
+       uint8_t*       stream;
 
 #if defined(ENABLE_JVMTI)
        jint new_class_data_len = 0;
@@ -99,7 +99,9 @@ JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, j
 
        /* check the indexes passed */
 
-       if ((offset < 0) || (len < 0) || ((offset + len) > LLNI_array_size(data))) {
+       ByteArray ba(data);
+
+       if ((offset < 0) || (len < 0) || ((offset + len) > ba.get_length())) {
                exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
@@ -138,8 +140,7 @@ JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, j
        else
 #endif
        {
-               ba = (java_handle_bytearray_t*) data;
-               stream = (uint8_t *) &LLNI_array_direct(ba, offset);
+               stream = ((uint8_t *) ba.get_raw_data_ptr()) + offset;
                c = class_define(utfname, loader, len, stream, (java_handle_t *) pd);
        }
 
index fca7f8d1d783d0b9396f820adfe3ddeac5983569..2e2bae3664cf9e9ef49f944af0d3fa5719ec7894 100644 (file)
@@ -94,10 +94,10 @@ JNIEXPORT jobjectArray JNICALL Java_java_lang_VMThrowable_getStackTrace(JNIEnv *
 
        // Get the stacktrace from the VMThrowable object.
 
-       java_handle_bytearray_t* ba = vmt.get_vmdata();
+       ByteArray ba(vmt.get_vmdata());
 
        // XXX Critical GC section?
-       stacktrace_t* st = (stacktrace_t*) LLNI_array_data(ba);
+       stacktrace_t* st = (stacktrace_t*) ba.get_raw_data_ptr();
 
        assert(st != NULL);
 
index 23400775965991fd8ab821e8198ef71ecb437a75..48b7770866bea2cfbcc2621177a77357b1c53922 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "toolbox/logging.hpp"
 
+#include "vm/array.hpp"
 #include "vm/globals.hpp"
 #include "vm/vm.hpp"
 
@@ -54,13 +55,11 @@ extern "C" {
  */
 JNIEXPORT jobjectArray JNICALL Java_java_lang_management_VMManagementFactory_getMemoryPoolNames(JNIEnv *env, jclass clazz)
 {
-       java_handle_objectarray_t *oa;
-
        log_println("Java_java_lang_management_VMManagementFactory_getMemoryPoolNames: IMPLEMENT ME!");
 
-       oa = builtin_anewarray(0, class_java_lang_String);
+       ObjectArray oa(0, class_java_lang_String);
 
-       return oa;
+       return oa.get_handle();
 }
 
 
@@ -71,13 +70,11 @@ JNIEXPORT jobjectArray JNICALL Java_java_lang_management_VMManagementFactory_get
  */
 JNIEXPORT jobjectArray JNICALL Java_java_lang_management_VMManagementFactory_getMemoryManagerNames(JNIEnv *env, jclass clazz)
 {
-       java_handle_objectarray_t *oa;
-
        log_println("Java_java_lang_management_VMManagementFactory_getMemoryManagerNames: IMPLEMENT ME!");
 
-       oa = builtin_anewarray(0, class_java_lang_String);
+       ObjectArray oa(0, class_java_lang_String);
 
-       return oa;
+       return oa.get_handle();
 }
 
 
@@ -88,13 +85,11 @@ JNIEXPORT jobjectArray JNICALL Java_java_lang_management_VMManagementFactory_get
  */
 JNIEXPORT jobjectArray JNICALL Java_java_lang_management_VMManagementFactory_getGarbageCollectorNames(JNIEnv *env, jclass clazz)
 {
-       java_handle_objectarray_t *oa;
-
        log_println("Java_java_lang_management_VMManagementFactory_getGarbageCollectorNames: IMPLEMENT ME!");
 
-       oa = builtin_anewarray(0, class_java_lang_String);
+       ObjectArray oa(0, class_java_lang_String);
 
-       return oa;
+       return oa.get_handle();
 }
 
 } // extern "C"
index cc431263185f5366f223875e3ac581068eef4c7a..f356686358642efa01c9008f83f1dfed5fb1628d 100644 (file)
@@ -409,9 +409,9 @@ jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
                return 0;
        }
 
-       java_handle_bytearray_t* ba = jlt.get_backtrace();
+       ByteArray ba(jlt.get_backtrace());
 
-       if (ba == NULL)
+       if (ba.is_null())
                return 0;
 
        // We need a critical section here as the stacktrace structure is
@@ -419,7 +419,7 @@ jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
 
        LLNI_CRITICAL_START;
 
-       stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
+       stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
 
        int32_t depth = st->length;
 
@@ -436,11 +436,11 @@ jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
        TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
 
        java_lang_Throwable jlt(throwable);
-       java_handle_bytearray_t* ba = jlt.get_backtrace();
+       ByteArray ba(jlt.get_backtrace());
 
        // XXX We need a critical section here as the stacktrace structure is
        // mapped onto a Java byte-array.
-       stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
+       stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
 
        return stacktrace_get_StackTraceElement(st, index);
 }
@@ -777,7 +777,7 @@ jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
 
        oa = class_get_interfaces(c);
 
-       return (jobjectArray) oa;
+       return oa;
 }
 
 
@@ -827,14 +827,11 @@ jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
 
 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
 {
-       classinfo                 *c;
-       java_handle_objectarray_t *hoa;
-
        TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
 
-       c = LLNI_classinfo_unwrap(cls);
+       classinfo* c = LLNI_classinfo_unwrap(cls);
 
-       hoa = (java_handle_objectarray_t *) signers;
+       ObjectArray oa(signers);
 
     /* This call is ignored for primitive types and arrays.  Signers
           are only set once, ClassLoader.java, and thus shouldn't be
@@ -844,7 +841,8 @@ void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
        if (class_is_primitive(c) || class_is_array(c))
                return;
 
-       LLNI_classinfo_field_set(c, signers, hoa);
+       // XXX: Fix this!
+       LLNI_classinfo_field_set(c, signers, (java_objectarray_t*) oa.get_handle());
 }
 
 
@@ -1030,7 +1028,7 @@ jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
 
        oa = class_get_declaredclasses(c, false);
 
-       return (jobjectArray) oa;
+       return oa;
 }
 
 
@@ -1179,7 +1177,7 @@ jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean pu
 
        oa = class_get_declaredfields(c, publicOnly);
 
-       return (jobjectArray) oa;
+       return oa;
 }
 
 
@@ -1193,7 +1191,7 @@ jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean p
 
        java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
 
-       return (jobjectArray) oa;
+       return oa;
 }
 
 
@@ -1210,7 +1208,7 @@ jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jbool
 
        oa = class_get_declaredconstructors(c, publicOnly);
 
-       return (jobjectArray) oa;
+       return oa;
 }
 
 
@@ -1623,47 +1621,43 @@ jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
 
 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
 {
-       java_handle_objectarray_t             *classes;
-       java_handle_objectarray_t             *packages;
-       java_booleanarray_t                   *classEnabled;
-       java_booleanarray_t                   *packageEnabled;
 #if defined(ENABLE_ASSERTION)
-       java_handle_t                         *js;
-       s4                                     i, j;
+       java_handle_tjs;
+       s4             i, j;
 #endif
 
        TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
 
 #if defined(ENABLE_ASSERTION)
-       classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
+       ObjectArray classes(assertion_class_count, class_java_lang_Object);
 #else
-       classes = builtin_anewarray(0, class_java_lang_Object);
+       ObjectArray classes(0, class_java_lang_Object);
 #endif
-       if (classes == NULL)
+       if (classes.is_null())
                return NULL;
 
 #if defined(ENABLE_ASSERTION)
-       packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
+       ObjectArray packages(assertion_package_count, class_java_lang_Object);
 #else
-       packages = builtin_anewarray(0, class_java_lang_Object);
+       ObjectArray packages(0, class_java_lang_Object);
 #endif
-       if (packages == NULL)
+       if (packages.is_null())
                return NULL;
        
 #if defined(ENABLE_ASSERTION)
-       classEnabled = builtin_newarray_boolean(assertion_class_count);
+       BooleanArray classEnabled(assertion_class_count);
 #else
-       classEnabled = builtin_newarray_boolean(0);
+       BooleanArray classEnabled(0);
 #endif
-       if (classEnabled == NULL)
+       if (classEnabled.is_null())
                return NULL;
 
 #if defined(ENABLE_ASSERTION)
-       packageEnabled = builtin_newarray_boolean(assertion_package_count);
+       BooleanArray packageEnabled(assertion_package_count);
 #else
-       packageEnabled = builtin_newarray_boolean(0);
+       BooleanArray packageEnabled(0);
 #endif
-       if (packageEnabled == NULL)
+       if (packageEnabled.is_null())
                return NULL;
 
 #if defined(ENABLE_ASSERTION)
@@ -1682,13 +1676,13 @@ jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
                        }
 
                        if (item->package == false) {
-                               classes->data[i] = js;
-                               classEnabled->data[i] = (jboolean) item->enabled;
+                               classes.set_element(i, js);
+                               classEnabled.set_element(i, (jboolean) item->enabled);
                                i += 1;
                        }
                        else {
-                               packages->data[j] = js;
-                               packageEnabled->data[j] = (jboolean) item->enabled;
+                               packages.set_element(j, js);
+                               packageEnabled.set_element(j, (jboolean) item->enabled);
                                j += 1;
                        }
                }
@@ -1697,7 +1691,11 @@ jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
 
        /* set instance fields */
 
-       java_lang_AssertionStatusDirectives jlasd(classes, classEnabled, packages, packageEnabled);
+       java_lang_AssertionStatusDirectives jlasd(
+                       classes.get_handle(),
+                       classEnabled.get_handle(),
+                       packages.get_handle(),
+                       packageEnabled.get_handle());
 
        return (jobject) jlasd.get_handle();
 }
@@ -2333,7 +2331,7 @@ jobjectArray JVM_GetClassContext(JNIEnv *env)
 {
        TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
 
-       return (jobjectArray) stacktrace_getClassContext();
+       return stacktrace_getClassContext();
 }
 
 
@@ -2439,13 +2437,21 @@ jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring c
 
 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
 {
-       java_handle_t *a;
-
        TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
 
-       a = (java_handle_t *) arr;
+       if (arr == NULL) {
+               exceptions_throw_nullpointerexception();
+               return -1;
+       }
+
+       Array a(arr);
+
+       // Check for exception in constructor.
+       if (a.is_null()) {
+               return -1;
+       }
 
-       return array_length_get(a);
+       return a.get_length();
 }
 
 
@@ -2453,21 +2459,16 @@ jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
 
 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
 {
-       java_handle_t *a;
-       java_handle_t *o;
-
        TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
 
-       a = (java_handle_t *) arr;
+       Array a(arr);
 
 /*     if (!class_is_array(a->objheader.vftbl->class)) { */
 /*             exceptions_throw_illegalargumentexception(); */
 /*             return NULL; */
 /*     } */
 
-       o = array_element_get(a, index);
-
-       return (jobject) o;
+       return a.get_boxed_element(index);
 }
 
 
@@ -2489,15 +2490,11 @@ jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint w
 
 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
 {
-       java_handle_t *a;
-       java_handle_t *value;
-
        TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
 
-       a     = (java_handle_t *) arr;
-       value = (java_handle_t *) val;
+       Array a(arr);
 
-       array_element_set(a, index, value);
+       a.set_boxed_element(index, val);
 }
 
 
@@ -2513,11 +2510,6 @@ void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v
 
 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
 {
-       classinfo                 *c;
-       classinfo                 *pc;
-       java_handle_t             *a;
-       java_handle_objectarray_t *oa;
-
        TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
 
        if (eltClass == NULL) {
@@ -2525,14 +2517,14 @@ jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
                return NULL;
        }
 
-       /* NegativeArraySizeException is checked in builtin_newarray. */
+       /* NegativeArraySizeException is checked by array constructor. */
 
-       c = LLNI_classinfo_unwrap(eltClass);
+       classinfo* c = LLNI_classinfo_unwrap(eltClass);
 
        /* Create primitive or object array. */
 
        if (class_is_primitive(c)) {
-               pc = Primitive::get_arrayclass_by_name(c->name);
+               classinfo* pc = Primitive::get_arrayclass_by_name(c->name);
 
                /* void arrays are not allowed. */
 
@@ -2541,14 +2533,14 @@ jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
                        return NULL;
                }
 
-               a = builtin_newarray(length, pc);
+               Array a(length, pc);
 
-               return (jobject) a;
+               return (jobject) a.get_handle();
        }
        else {
-               oa = builtin_anewarray(length, c);
+               ObjectArray oa(length, c);
 
-               return (jobject) oa;
+               return (jobject) oa.get_handle();
        }
 }
 
@@ -2558,7 +2550,6 @@ jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
 {
        classinfo                 *c;
-       java_handle_intarray_t    *ia;
        int32_t                    length;
        long                      *dims;
        int32_t                    value;
@@ -2577,17 +2568,17 @@ jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
 
        c = LLNI_classinfo_unwrap(eltClass);
 
-       ia = (java_handle_intarray_t *) dim;
-
-       length = array_length_get((java_handle_t *) ia);
+       IntArray ia(dim);
 
        /* We check here for exceptions thrown in array_length_get,
           otherwise these exceptions get overwritten by the following
           IllegalArgumentException. */
 
-       if (length < 0)
+       if (ia.is_null())
                return NULL;
 
+       length = ia.get_length();
+
        if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
                exceptions_throw_illegalargumentexception();
                return NULL;
@@ -2598,7 +2589,7 @@ jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
        dims = MNEW(long, length);
 
        for (i = 0; i < length; i++) {
-               value = LLNI_array_direct(ia, i);
+               value = ia.get_element(i);
                dims[i] = (long) value;
        }
 
@@ -3205,9 +3196,9 @@ jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
 
        // Allocate array to hold the java.lang.Thread objects.
        int32_t length = active_threads.size();
-       java_handle_objectarray_t* oa = builtin_anewarray(length, class_java_lang_Thread);
+       ObjectArray oa(length, class_java_lang_Thread);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        // Iterate over all threads (which were active just a second ago).
@@ -3218,12 +3209,12 @@ jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
                java_handle_t* h = thread_get_object(t);
                assert(h != NULL);
 
-               array_objectarray_element_set(oa, index, h);
+               oa.set_element(index, h);
 
                index++;
        }
 
-       return oa;
+       return oa.get_handle();
 }
 
 
@@ -3240,8 +3231,10 @@ jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threa
                return NULL;
        }
 
+       ObjectArray oa(threads);
+
        // Get length of the threads array.
-       int32_t length = array_length_get((java_handle_t*) threads);
+       int32_t length = oa.get_length();
 
        if (length <= 0) {
                exceptions_throw_illegalargumentexception();
@@ -3250,15 +3243,15 @@ jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threa
 
        // Allocate array to hold stacktraces.
        classinfo* arrayclass = class_array_of(class_java_lang_StackTraceElement, true);
-       java_handle_objectarray_t* oas = builtin_anewarray(length, arrayclass);
+       ObjectArray oaresult(length, arrayclass);
 
-       if (oas == NULL) {
+       if (oaresult.is_null()) {
                return NULL;
        }
 
        // Iterate over all passed thread objects.
        for (i = 0; i < length; i++) {
-               java_handle_t* thread = array_objectarray_element_get(threads, i);
+               java_handle_t* thread = oa.get_element(i);
 
                // Get thread for the given thread object.
                threadobject* t = thread_get_thread(thread);
@@ -3271,15 +3264,15 @@ jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threa
                stacktrace_t* st = stacktrace_get_of_thread(t);
 
                // Convert stacktrace into array of StackTraceElements.
-               java_handle_objectarray_t* oa = stacktrace_get_StackTraceElements(st);
+               java_handle_objectarray_t* oaste = stacktrace_get_StackTraceElements(st);
 
-               if (oa == NULL)
+               if (oaste == NULL)
                        return NULL;
 
-               array_objectarray_element_set(oas, i, (java_handle_t*) oa);
+               oaresult.set_element(i, oaste);
        }
 
-       return oas;
+       return oaresult.get_handle();
 }
 
 
@@ -3307,32 +3300,28 @@ jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
 
 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
 {
-       classinfo                 *c;
-       methodinfo                *m;
-       java_handle_objectarray_t *oa;
-
        TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
 
-       c = LLNI_classinfo_unwrap(ofClass);
+       classinfo* c = LLNI_classinfo_unwrap(ofClass);
 
        if ((c == NULL) || class_is_primitive(c))
                return NULL;
 
-       m = class_get_enclosingmethod_raw(c);
+       methodinfo* m = class_get_enclosingmethod_raw(c);
 
        if (m == NULL)
                return NULL;
 
-       oa = builtin_anewarray(3, class_java_lang_Object);
+       ObjectArray oa(3, class_java_lang_Object);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
-       array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
-       array_objectarray_element_set(oa, 1, javastring_new(m->name));
-       array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
+       oa.set_element(0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
+       oa.set_element(1, javastring_new(m->name));
+       oa.set_element(2, javastring_new(m->descriptor));
 
-       return (jobjectArray) oa;
+       return oa.get_handle();
 }
 
 
@@ -3340,8 +3329,6 @@ jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
 
 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
 {
-       java_handle_intarray_t *ia;
-
        TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
                                  env, javaThreadState));
 
@@ -3354,69 +3341,79 @@ jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
 
        switch (javaThreadState) {
     case THREAD_STATE_NEW:
-               ia = builtin_newarray_int(1);
+               {
+                       IntArray ia(1);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
-               break; 
+                       ia.set_element(0, THREAD_STATE_NEW);
+                       return ia.get_handle();
+               }
 
     case THREAD_STATE_RUNNABLE:
-               ia = builtin_newarray_int(1);
+               {
+                       IntArray ia(1);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
-               break; 
+                       ia.set_element(0, THREAD_STATE_RUNNABLE);
+                       return ia.get_handle();
+               }
 
     case THREAD_STATE_BLOCKED:
-               ia = builtin_newarray_int(1);
+               {
+                       IntArray ia(1);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
-               break; 
+                       ia.set_element(0, THREAD_STATE_BLOCKED);
+                       return ia.get_handle();
+               }
 
     case THREAD_STATE_WAITING:
-               ia = builtin_newarray_int(2);
+               {
+                       IntArray ia(2);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
-               array_intarray_element_set(ia, 1, THREAD_STATE_PARKED);
-               break; 
+                       ia.set_element(0, THREAD_STATE_WAITING);
+                       ia.set_element(1, THREAD_STATE_PARKED);
+                       return ia.get_handle();
+               }
 
     case THREAD_STATE_TIMED_WAITING:
-               ia = builtin_newarray_int(2);
+               {
+                       IntArray ia(2);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               /* XXX Not sure about that one. */
-/*             array_intarray_element_set(ia, 0, SLEEPING); */
-               array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
-               array_intarray_element_set(ia, 1, THREAD_STATE_TIMED_PARKED);
-               break; 
+                       /* XXX Not sure about that one. */
+/*                     ia.set_element(0, SLEEPING); */
+                       ia.set_element(0, THREAD_STATE_TIMED_WAITING);
+                       ia.set_element(1, THREAD_STATE_TIMED_PARKED);
+                       return ia.get_handle();
+               }
 
     case THREAD_STATE_TERMINATED:
-               ia = builtin_newarray_int(1);
+               {
+                       IntArray ia(1);
 
-               if (ia == NULL)
-                       return NULL;
+                       if (ia.is_null())
+                               return NULL;
 
-               array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
-               break; 
+                       ia.set_element(0, THREAD_STATE_TERMINATED);
+                       return ia.get_handle();
+               }
 
     default:
                /* Unknown state - probably incompatible JDK version */
                return NULL;
        }
-
-       return (jintArray) ia;
 }
 
 
@@ -3424,14 +3421,12 @@ jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
 
 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
 {
-       java_handle_intarray_t    *ia;
-       java_handle_objectarray_t *oa;
-       java_object_t             *s;
+       java_object_t* s;
 
        TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
                                  env, javaThreadState, values));
 
-       ia = (java_handle_intarray_t *) values;
+       IntArray ia(values);
 
        /* If new thread states are added in future JDK and VM versions,
           this should check if the JDK version is compatible with thread
@@ -3447,112 +3442,122 @@ jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArra
 
        switch (javaThreadState) {
     case THREAD_STATE_NEW:
-               assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
+               {
+                       assert(ia.get_length() == 1 && ia.get_element(0) == THREAD_STATE_NEW);
 
-               oa = builtin_anewarray(1, class_java_lang_String);
+                       ObjectArray oa(1, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-               s = javastring_new(utf_new_char("NEW"));
+                       s = javastring_new(utf_new_char("NEW"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
-               break; 
+                       oa.set_element(0, s);
+                       return oa.get_handle();
+               }
 
     case THREAD_STATE_RUNNABLE:
-               oa = builtin_anewarray(1, class_java_lang_String);
+               {
+                       ObjectArray oa(1, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-               s = javastring_new(utf_new_char("RUNNABLE"));
+                       s = javastring_new(utf_new_char("RUNNABLE"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
-               break; 
+                       oa.set_element(0, s);
+                       return oa.get_handle();
+               }
 
     case THREAD_STATE_BLOCKED:
-               oa = builtin_anewarray(1, class_java_lang_String);
+               {
+                       ObjectArray oa(1, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-               s = javastring_new(utf_new_char("BLOCKED"));
+                       s = javastring_new(utf_new_char("BLOCKED"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
-               break; 
+                       oa.set_element(0, s);
+                       return oa.get_handle();
+               }
 
     case THREAD_STATE_WAITING:
-               oa = builtin_anewarray(2, class_java_lang_String);
+               {
+                       ObjectArray oa(2, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-               s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
+                       s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
+                       oa.set_element(0, s);
 
-               s = javastring_new(utf_new_char("WAITING.PARKED"));
+                       s = javastring_new(utf_new_char("WAITING.PARKED"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 1, s);
-               break; 
+                       oa.set_element(1, s);
+                       return oa.get_handle();
+               }
 
     case THREAD_STATE_TIMED_WAITING:
-               oa = builtin_anewarray(2, class_java_lang_String);
+               {
+                       ObjectArray oa(2, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-/*             s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
-               s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
+/*                     s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
+                       s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
+                       oa.set_element(0, s);
 
-               s = javastring_new(utf_new_char("TIMED_WAITING.PARKED"));
+                       s = javastring_new(utf_new_char("TIMED_WAITING.PARKED"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 1, s);
-               break; 
+                       oa.set_element(1, s);
+                       return oa.get_handle();
+               }
 
     case THREAD_STATE_TERMINATED:
-               oa = builtin_anewarray(1, class_java_lang_String);
+               {
+                       ObjectArray oa(1, class_java_lang_String);
 
-               if (oa == NULL)
-                       return NULL;
+                       if (oa.is_null())
+                               return NULL;
 
-               s = javastring_new(utf_new_char("TERMINATED"));
+                       s = javastring_new(utf_new_char("TERMINATED"));
 
-               if (s == NULL)
-                       return NULL;
+                       if (s == NULL)
+                               return NULL;
 
-               array_objectarray_element_set(oa, 0, s);
-               break; 
+                       oa.set_element(0, s);
+                       return oa.get_handle();
+               }
 
        default:
                /* Unknown state - probably incompatible JDK version */
                return NULL;
        }
-
-       return (jobjectArray) oa;
 }
 
 
index 73a8545b8afef1b164d7e7987378f5782e0b7db4..0cc2d414450078414f4fb678b926fa4a792300f5 100644 (file)
@@ -37,6 +37,7 @@
 #include "native/vm/reflection.hpp"
 
 #include "vm/access.hpp"
+#include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/global.h"
@@ -85,8 +86,10 @@ java_handle_t* Reflection::invoke(methodinfo *m, java_handle_t *o, java_handle_o
 
        /* check if we got the right number of arguments */
 
+       ObjectArray oa(params);
+
        if (((params == NULL) && (paramcount != 0)) ||
-               (params && (LLNI_array_size(params) != paramcount))) 
+               (params && (oa.get_length() != paramcount))) 
        {
                exceptions_throw_illegalargumentexception();
                return NULL;
index a6c86a6daa8550c3e799ef774a7556a7123c4a73..8c9779ecc0084e057cbbd915e267a40471860515 100644 (file)
@@ -40,6 +40,7 @@
 # include "native/include/sun_misc_Unsafe.h"
 #endif
 
+#include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/initialize.hpp"
@@ -825,7 +826,9 @@ JNIEXPORT jclass JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3
 
        /* check the indexes passed */
 
-       if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
+       ByteArray ba(b);
+
+       if ((off < 0) || (len < 0) || ((off + len) > ba.get_length())) {
                exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
@@ -841,7 +844,8 @@ JNIEXPORT jclass JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3
 
        /* define the class */
 
-       c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct((java_handle_bytearray_t*) b, off)),
+       uint8_t* ptr = ((uint8_t*) ba.get_raw_data_ptr()) + off;
+       c = class_define(utfname, cl, len, ptr,
                                         (java_handle_t *) protectionDomain);
 
        if (c == NULL)
index 2a5fafdffb81dc6a4e83808f8efb8c48c3c50200..7e930ab053a681084f821774eaaf36e1667cbc48 100644 (file)
 static java_handle_objectarray_t *annotation_bytearrays_resize(
        java_handle_objectarray_t *bytearrays, uint32_t size)
 {
-       java_handle_objectarray_t *newbas = NULL; /* new array     */
        uint32_t minsize = 0;      /* count of object refs to copy */
        uint32_t oldsize = 0;      /* size of old array            */
 
+       ObjectArray bas(bytearrays);
+
        if (bytearrays != NULL) {
-               oldsize = array_length_get((java_handle_t*)bytearrays);
+               oldsize = bas.get_length();
                
                /* if the size already fits do nothing */
                if (size == oldsize) {
                        return bytearrays;
                }
        }
-       
-       newbas = builtin_anewarray(size,
+
+       // Allocate new array on the heap.
+
+       ObjectArray newbas(size,
                Primitive::get_arrayclass_by_type(PRIMITIVETYPE_BYTE));
-       
+
        /* is there a old byte array array? */
-       if (newbas != NULL && bytearrays != NULL) {
+       if (newbas.is_non_null() && bytearrays != NULL) {
                minsize = size < oldsize ? size : oldsize;
 
                LLNI_CRITICAL_START;
                MCOPY(
-                       LLNI_array_data(newbas), LLNI_array_data(bytearrays),
+                       newbas.get_raw_data_ptr(), bas.get_raw_data_ptr(),
                        java_object_t*, minsize);
                LLNI_CRITICAL_END;
        }
 
-       return newbas;
+       return newbas.get_handle();
 }
 
 
@@ -118,7 +121,6 @@ static java_handle_t *annotation_bytearrays_insert(
        java_handle_t *bytearrays, uint32_t index,
        java_handle_bytearray_t *bytearray)
 {
-       java_handle_objectarray_t *bas; /* bytearrays                */
        uint32_t size = 0;              /* current size of the array */
 
        /* do nothing if NULL is inserted but no array exists */
@@ -126,34 +128,35 @@ static java_handle_t *annotation_bytearrays_insert(
                return NULL;
        }
 
+       ObjectArray bas(bytearrays);
+
        /* get lengths if array exists */
        if (bytearrays != NULL) {
-               size = array_length_get(bytearrays);
+               size = bas.get_length();
        }
 
-       bas = (java_handle_objectarray_t*)bytearrays;
-
        if (bytearray == NULL) {
                /* insert NULL only if array is big enough */
                if (size > index) {
-                       array_objectarray_element_set(bas, index, NULL);
+                       bas.set_element(index, NULL);
                }
        }
        else {
+               // XXX: We should use a clone function here!!!
                /* resize array if it's not enough for inserted value */
                if (size <= index) {
-                       bas = annotation_bytearrays_resize(bas, index + 1);
+                       bas = annotation_bytearrays_resize(bas.get_handle(), index + 1);
 
-                       if (bas == NULL) {
+                       if (bas.is_null()) {
                                /* out of memory */
                                return NULL;
                        }
                }
 
-               array_objectarray_element_set(bas, index, (java_handle_t*)bytearray);
+               bas.set_element(index, (java_handle_t*) bytearray);
        }
        
-       return (java_handle_t*)bas;
+       return bas.get_handle();
 }
 
 
@@ -186,7 +189,6 @@ static bool annotation_load_attribute_body(classbuffer *cb,
        java_handle_bytearray_t **attribute, const char *errormsg_prefix)
 {
        uint32_t                 size = 0;    /* size of the attribute     */
-       java_handle_bytearray_t *ba   = NULL; /* the raw attributes' bytes */
 
        assert(cb != NULL);
        assert(attribute != NULL);
@@ -207,9 +209,9 @@ static bool annotation_load_attribute_body(classbuffer *cb,
        /* if attribute_length == 0 then NULL is
         * the right value for this attribute */
        if (size > 0) {
-               ba = builtin_newarray_byte(size);
+               ByteArray ba(size);
 
-               if (ba == NULL) {
+               if (ba.is_null()) {
                        /* out of memory */
                        return false;
                }
@@ -217,12 +219,13 @@ static bool annotation_load_attribute_body(classbuffer *cb,
                /* load data */
                LLNI_CRITICAL_START;
 
-               suck_nbytes((uint8_t*)LLNI_array_data(ba), cb, size);
+               uint8_t* ptr = (uint8_t*) ba.get_raw_data_ptr();
+               suck_nbytes(ptr, cb, size);
 
                LLNI_CRITICAL_END;
 
                /* return data */
-               *attribute = ba;
+               *attribute = ba.get_handle();
        }
        
        return true;
index de602db1490a4a2d2d59021fe12d3a4068c4387f..fc40745f9b6e836f4487404a5c41981a07abfd26 100644 (file)
@@ -2,6 +2,7 @@
 
    Copyright (C) 2007
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+   Copyright (C) 2008 Theobroma Systems Ltd.
 
    This file is part of CACAO.
 
 #include "vm/array.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/global.h"
+#include "vm/globals.hpp"
 #include "vm/primitive.hpp"
 #include "vm/vm.hpp"
 
 
-/* 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)
+/**
+ * Returns a boxed element of the given Java array.
+ */
+java_handle_t* Array::get_boxed_element(int32_t index)
 {
        vftbl_t       *v;
        int            type;
        imm_union      value;
        java_handle_t *o;
 
-       if (a == NULL) {
+       if (is_null()) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
 
-       v = LLNI_vftbl_direct(a);
+       v = LLNI_vftbl_direct(_handle);
 
        type = v->arraydesc->arraytype;
 
-       value = array_element_primitive_get(a, index);
+       value = get_primitive_element(index);
 
        o = Primitive::box(type, value);
 
@@ -66,82 +65,97 @@ java_handle_t *array_element_get(java_handle_t *a, int32_t index)
 }
 
 
-/* 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)
+/**
+ * Sets a boxed element in the given Java array.
+ */
+void Array::set_boxed_element(int32_t index, java_handle_t *o)
 {
        imm_union value;
 
        value = Primitive::unbox(o);
 
-       array_element_primitive_set(a, index, value);
+       set_primitive_element(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)
+/**
+ * Returns a primitive element of the given Java array.
+ */
+imm_union Array::get_primitive_element(int32_t index)
 {
        vftbl_t  *v;
        int       type;
        imm_union value;
 
-       if (a == NULL) {
+       if (is_null()) {
                exceptions_throw_nullpointerexception();
                value.a = NULL;
                return value;
        }
 
+       java_handle_array_t* a = _handle;
+
        v = LLNI_vftbl_direct(a);
 
        type = v->arraydesc->arraytype;
 
        switch (type) {
        case ARRAYTYPE_BOOLEAN:
-               value.i = array_booleanarray_element_get((java_handle_booleanarray_t *) a, index);
+               {
+                       BooleanArray array(a);
+                       value.i = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_BYTE:
-               value.i = array_bytearray_element_get((java_handle_bytearray_t *) a,
-                                                                                         index);
+               {
+                       ByteArray array(a);
+                       value.i = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_CHAR:
-               value.i = array_chararray_element_get((java_handle_chararray_t *) a,
-                                                                                         index);
+               {
+                       CharArray array(a);
+                       value.i = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_SHORT:
-               value.i = array_shortarray_element_get((java_handle_shortarray_t *) a,
-                                                                                          index);
+               {
+                       ShortArray array(a);
+                       value.i = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_INT:
-               value.i = array_intarray_element_get((java_handle_intarray_t *) a,
-                                                                                        index);
+               {
+                       IntArray array(a);
+                       value.i = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_LONG:
-               value.l = array_longarray_element_get((java_handle_longarray_t *) a,
-                                                                                         index);
+               {
+                       LongArray array(a);
+                       value.l = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_FLOAT:
-               value.f = array_floatarray_element_get((java_handle_floatarray_t *) a,
-                                                                                          index);
+               {
+                       FloatArray array(a);
+                       value.f = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_DOUBLE:
-               value.d = array_doublearray_element_get((java_handle_doublearray_t *) a,
-                                                                                               index);
+               {
+                       DoubleArray array(a);
+                       value.d = array.get_element(index);
+               }
                break;
        case ARRAYTYPE_OBJECT:
-               value.a = array_objectarray_element_get((java_handle_objectarray_t *) a,
-                                                                                               index);
+               {
+                       ObjectArray array(a);
+                       value.a = array.get_element(index);
+               }
                break;
        default:
-               vm_abort("array_element_primitive_get: invalid array element type %d",
+               vm_abort("Array::primitive_element_get: invalid array element type %d",
                                 type);
        }
 
@@ -149,62 +163,79 @@ imm_union array_element_primitive_get(java_handle_t *a, int32_t index)
 }
 
 
-/* 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)
+/**
+ * Sets a primitive element in the given Java array.
+ */
+void Array::set_primitive_element(int32_t index, imm_union value)
 {
        vftbl_t *v;
        int      type;
 
-       if (a == NULL) {
+       if (is_null()) {
                exceptions_throw_nullpointerexception();
                return;
        }
 
+       java_handle_array_t* a = _handle;
+
        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);
+               {
+                       BooleanArray array(a);
+                       array.set_element(index, value.i);
+               }
                break;
        case ARRAYTYPE_BYTE:
-               array_bytearray_element_set((java_handle_bytearray_t *) a,
-                                                                       index, value.i);
+               {
+                       ByteArray array(a);
+                       array.set_element(index, value.i);
+               }
                break;
        case ARRAYTYPE_CHAR:
-               array_chararray_element_set((java_handle_chararray_t *) a,
-                                                                       index, value.i);
+               {
+                       CharArray array(a);
+                       array.set_element(index, value.i);
+               }
                break;
        case ARRAYTYPE_SHORT:
-               array_shortarray_element_set((java_handle_shortarray_t *) a,
-                                                                        index, value.i);
+               {
+                       ShortArray array(a);
+                       array.set_element(index, value.i);
+               }
                break;
        case ARRAYTYPE_INT:
-               array_intarray_element_set((java_handle_intarray_t *) a,
-                                                                  index, value.i);
+               {
+                       IntArray array(a);
+                       array.set_element(index, value.i);
+               }
                break;
        case ARRAYTYPE_LONG:
-               array_longarray_element_set((java_handle_longarray_t *) a,
-                                                                       index, value.l);
+               {
+                       LongArray array(a);
+                       array.set_element(index, value.l);
+               }
                break;
        case ARRAYTYPE_FLOAT:
-               array_floatarray_element_set((java_handle_floatarray_t *) a,
-                                                                        index, value.f);
+               {
+                       FloatArray array(a);
+                       array.set_element(index, value.f);
+               }
                break;
        case ARRAYTYPE_DOUBLE:
-               array_doublearray_element_set((java_handle_doublearray_t *) a,
-                                                                         index, value.d);
+               {
+                       DoubleArray array(a);
+                       array.set_element(index, value.d);
+               }
                break;
        case ARRAYTYPE_OBJECT:
-               array_objectarray_element_set((java_handle_objectarray_t *) a,
-                                                                         index, static_cast<java_handle_t*>(value.a));
+               {
+                       ObjectArray array(a);
+                       array.set_element(index, static_cast<java_handle_t*>(value.a));
+               }
                break;
        default:
                vm_abort("array_element_primitive_set: invalid array element type %d",
@@ -213,171 +244,48 @@ void array_element_primitive_set(java_handle_t *a, int32_t index, imm_union valu
 }
 
 
-/* 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_##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;                                                              \
-}
-
-java_handle_t *array_objectarray_element_get(java_handle_objectarray_t *a, int32_t index)
-{
-       java_handle_t *value;
-       int32_t size;
-
-       if (a == NULL) {
-               exceptions_throw_nullpointerexception();
-               return NULL;
-       }
-
-       size = LLNI_array_size(a);
-
-       if ((index < 0) || (index >= size)) {
-               exceptions_throw_arrayindexoutofboundsexception();
-               return NULL;
-       }
-
-       LLNI_CRITICAL_START;
-       value = LLNI_WRAP(LLNI_array_direct(a, index));
-       LLNI_CRITICAL_END;
-
-       return value;
-}
-
-ARRAY_TYPEARRAY_ELEMENT_GET(boolean, uint8_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(byte,    int8_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(char,    uint16_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(short,   int16_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(int,     int32_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(long,    int64_t)
-ARRAY_TYPEARRAY_ELEMENT_GET(float,   float)
-ARRAY_TYPEARRAY_ELEMENT_GET(double,  double)
-
-
-/* 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;                                       \
-}
-
-void array_objectarray_element_set(java_handle_objectarray_t *a, int32_t index, java_handle_t *value)
+/**
+ * Creates an array of references to the given class type on the heap.
+ * The handle pointer to the array can be NULL in case of an exception.
+ */
+ObjectArray::ObjectArray(int32_t length, classinfo* componentclass)
+               : ArrayTemplate<java_handle_t*>(NULL)
 {
-       int32_t size;
+       // Is class loaded?
+       assert(componentclass->state & CLASS_LOADED);
 
-       if (a == NULL) {
-               exceptions_throw_nullpointerexception();
-               return;
-       }
-
-       /* Sanity check. */
-
-       assert(a->header.objheader.vftbl->arraydesc->arraytype == ARRAYTYPE_OBJECT);
-
-       if (value != NULL) {
-               if (builtin_canstore(a, value) == false) {
-                       exceptions_throw_illegalargumentexception();
+       // Is class linked?
+       if (!(componentclass->state & CLASS_LINKED))
+               if (!link_class(componentclass)) {
+                       _handle = NULL;
                        return;
                }
-       }
 
-       size = LLNI_array_size(a);
+       classinfo* arrayclass = class_array_of(componentclass, true);
 
-       if ((index < 0) || (index >= size)) {
-               exceptions_throw_arrayindexoutofboundsexception();
+       if (arrayclass == NULL) {
+               _handle = NULL;
                return;
        }
 
-       LLNI_CRITICAL_START;
-       LLNI_array_direct(a, index) = LLNI_UNWRAP(value);
-       LLNI_CRITICAL_END;
-}
-
-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_length_get ***********************************************************
-
-   Returns a the length of the given Java array.
-
-   ARGUMENTS:
-       a ... Java array
+       // Delegate allocation to generic array class
+       Array a(length, arrayclass);
 
-   RETURN VALUE:
-         -1 ... exception thrown
-          >= 0 ... length of the Java array
+       _handle = a.get_handle();
+}
 
-*******************************************************************************/
 
-int32_t array_length_get(java_handle_t *a)
+/**
+ * Creates an array of references to classinfos on the heap.
+ * The handle pointer to the array can be NULL in case of an exception.
+ */
+ClassArray::ClassArray(int32_t length)
+               : ArrayTemplate<classinfo*>(NULL)
 {
-       classinfo *c;
-       int32_t    size;
-
-       if (a == NULL) {
-               exceptions_throw_nullpointerexception();
-               return -1;
-       }
-
-       LLNI_class_get(a, c);
-
-       if (!class_is_array(c)) {
-/*             exceptions_throw_illegalargumentexception("Argument is not an array"); */
-               exceptions_throw_illegalargumentexception();
-               return -1;
-       }
-
-       size = LLNI_array_size(a);
+       // Delegate allocation to object array class
+       ObjectArray oa(length, class_java_lang_Class);
 
-       return size;
+       _handle = oa.get_handle();
 }
 
 
index 86f10843b0577087540bd676724f1af76e020742..06813aee46bf560c1f860d38c7c069dbe42666b6 100644 (file)
@@ -2,6 +2,7 @@
 
    Copyright (C) 2007
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+   Copyright (C) 2008 Theobroma Systems Ltd.
 
    This file is part of CACAO.
 
 
 #include <stdint.h>
 
+#include "mm/gc.hpp" // XXX Remove me!
+
+#include "native/llni.h" // XXX Remove me!
+
+#include "vm/class.hpp"
+#include "vm/exceptions.hpp"
 #include "vm/global.h"
 #include "vm/primitive.hpp"
 
 #define ARRAYTYPE_OBJECT      PRIMITIVETYPE_VOID     /* don't use as index! */
 
 
-/* function prototypes ********************************************************/
-
 #ifdef __cplusplus
-extern "C" {
+
+/**
+ * This is a generic accessor class for Java arrays (of unspecified type),
+ * which can be used to safely operate on Java arrays in native code.
+ */
+class Array {
+protected:
+       // Handle of Java array.
+       java_handle_array_t* _handle;
+
+private:
+       // We don't want a Java arrays to be copied.
+       Array(Array* a) {}
+       Array(Array& a) {}
+
+public:
+       inline Array(java_handle_t* h);
+       inline Array(int32_t length, classinfo* arrayclass);
+       virtual ~Array() {}
+
+       // Getters.
+       virtual inline java_handle_array_t* get_handle() const { return _handle; }
+       inline int32_t                      get_length() const;
+
+       inline bool is_null    () const;
+       inline bool is_non_null() const;
+
+       // Safe element modification functions for primitive values
+       imm_union get_primitive_element(int32_t index);
+       void      set_primitive_element(int32_t index, imm_union value);
+
+       // Safe element modification functions for boxed values
+       java_handle_t* get_boxed_element(int32_t index);
+       void           set_boxed_element(int32_t index, java_handle_t *o);
+
+       // XXX REMOVE ME!
+       inline void* get_raw_data_ptr() { return ((java_objectarray_t*) _handle)->data; }
+};
+
+
+/**
+ * Constructor checks if passed handle really is a Java array.
+ */
+inline Array::Array(java_handle_t* h)
+{
+       if (h == NULL) {
+               _handle = NULL;
+               return;
+       }
+
+#if 0
+       classinfo* c;
+       LLNI_class_get(h, c);
+       if (!class_is_array(c)) {
+               printf("Array::Array(): WARNING, passed handle is not an array\n");
+               //exceptions_throw_illegalargumentexception("Argument is not an array");
+               exceptions_throw_illegalargumentexception();
+               _handle = NULL;
+               return;
+       }
 #endif
 
-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);
-
-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);
+       _handle = h;
+}
 
-#ifdef __cplusplus
-} // extern "C"
+/**
+ * Creates an array of the given array type on the heap.
+ * The handle pointer to the array can be NULL in case of an exception.
+ */
+inline Array::Array(int32_t size, classinfo* arrayclass)
+{
+       // Sanity check.
+       assert(class_is_array(arrayclass));
+
+       if (size < 0) {
+               exceptions_throw_negativearraysizeexception();
+               _handle = NULL;
+               return;
+       }
+
+       arraydescriptor* desc          = arrayclass->vftbl->arraydesc;
+       int32_t          dataoffset    = desc->dataoffset;
+       int32_t          componentsize = desc->componentsize;
+       int32_t          actualsize    = dataoffset + size * componentsize;
+
+       // Check for overflow.
+
+       if (((u4) actualsize) < ((u4) size)) {
+               exceptions_throw_outofmemoryerror();
+               _handle = NULL;
+               return;
+       }
+
+       java_array_t* a = (java_array_t*) heap_alloc(actualsize, (desc->arraytype == ARRAYTYPE_OBJECT), NULL, true);
+
+       if (a == NULL) {
+               _handle = NULL;
+               return;
+       }
+
+       LLNI_vftbl_direct(a) = arrayclass->vftbl;
+
+#if defined(ENABLE_THREADS)
+       a->objheader.lockword.init();
+#endif
+
+       a->size = size;
+
+       _handle = (java_handle_array_t*) a;
+}
+
+inline int32_t Array::get_length() const
+{
+       if (is_null()) {
+               printf("Array::get_length(): WARNING, got null-pointer\n");
+               exceptions_throw_nullpointerexception();
+               return -1;
+       }
+
+       // XXX Fix me!
+       int32_t length = ((java_array_t*) _handle)->size;
+
+       return length;
+}
+
+inline bool Array::is_null() const
+{
+       return (_handle == NULL);
+}
+
+inline bool Array::is_non_null() const
+{
+       return (_handle != NULL);
+}
+
+
+/**
+ * This is a template of an accessor class for Java arrays
+ * of a specific type.
+ */
+template<class T> class ArrayTemplate : public Array {
+protected:
+       ArrayTemplate(int32_t length, classinfo* arrayclass) : Array(length, arrayclass) {}
+
+public:
+       inline ArrayTemplate(java_handle_array_t* h) : Array(h) {}
+
+       // Safe element modification functions
+       inline T    get_element(int32_t index);
+       inline void set_element(int32_t index, T value);
+
+       // Region copy functions
+       inline void get_region(int32_t offset, int32_t count, T* buffer);
+       inline void set_region(int32_t offset, int32_t count, const T* buffer);
+};
+
+
+template<class T> inline T ArrayTemplate<T>::get_element(int32_t index)
+{
+       if (is_null()) {
+               exceptions_throw_nullpointerexception();
+               return 0;
+       }
+
+       if ((index < 0) || (index >= get_length())) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return 0;
+       }
+
+       // XXX Fix me!
+       T* ptr = (T*) get_raw_data_ptr();
+
+       return ptr[index];
+}
+
+template<class T> inline void ArrayTemplate<T>::set_element(int32_t index, T value)
+{
+       if (is_null()) {
+               exceptions_throw_nullpointerexception();
+               return;
+       }
+
+       if ((index < 0) || (index >= get_length())) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return;
+       }
+
+       // XXX Fix me!
+       T* ptr = (T*) get_raw_data_ptr();
+
+       ptr[index] = value;
+}
+
+template<> inline void ArrayTemplate<java_handle_t*>::set_element(int32_t index, java_handle_t* value)
+{
+       if (is_null()) {
+               exceptions_throw_nullpointerexception();
+               return;
+       }
+
+       // Sanity check.
+       assert(((java_array_t*) _handle)->objheader.vftbl->arraydesc->arraytype == ARRAYTYPE_OBJECT);
+
+       // Check if value can be stored
+       if (value != NULL) {
+               if (builtin_canstore(get_handle(), value) == false) {
+                       exceptions_throw_illegalargumentexception();
+                       return;
+               }
+       }
+
+       if ((index < 0) || (index >= get_length())) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return;
+       }
+
+       // XXX Fix me!
+       java_handle_t** ptr = (java_handle_t**) get_raw_data_ptr();
+
+       ptr[index] = value;
+}
+
+template<class T> inline void ArrayTemplate<T>::get_region(int32_t offset, int32_t count, T* buffer)
+{
+       // Copy the array region inside a GC critical section.
+       GCCriticalSection cs;
+
+       // XXX Fix me!
+       const T* ptr = (T*) get_raw_data_ptr();
+
+       os::memcpy(buffer, ptr + offset, sizeof(T) * count);
+}
+
+template<class T> inline void ArrayTemplate<T>::set_region(int32_t offset, int32_t count, const T* buffer)
+{
+       // Copy the array region inside a GC critical section.
+       GCCriticalSection cs;
+
+       // XXX Fix me!
+       T* ptr = (T*) get_raw_data_ptr();
+
+       os::memcpy(ptr + offset, buffer, sizeof(T) * count);
+}
+
+
+/**
+ * Actual implementations of common Java array access classes.
+ */
+class BooleanArray : public ArrayTemplate<uint8_t> {
+public:
+       inline BooleanArray(java_handle_booleanarray_t* h) : ArrayTemplate<uint8_t>(h) {}
+       inline BooleanArray(int32_t length) : ArrayTemplate<uint8_t>(length, primitivetype_table[ARRAYTYPE_BOOLEAN].arrayclass) {}
+};
+
+class ByteArray : public ArrayTemplate<int8_t> {
+public:
+       inline ByteArray(java_handle_bytearray_t* h) : ArrayTemplate<int8_t>(h) {}
+       inline ByteArray(int32_t length) : ArrayTemplate<int8_t>(length, primitivetype_table[ARRAYTYPE_BYTE].arrayclass) {}
+};
+
+class CharArray : public ArrayTemplate<uint16_t> {
+public:
+       inline CharArray(java_handle_chararray_t* h) : ArrayTemplate<uint16_t>(h) {}
+       inline CharArray(int32_t length) : ArrayTemplate<uint16_t>(length, primitivetype_table[ARRAYTYPE_CHAR].arrayclass) {}
+};
+
+class ShortArray : public ArrayTemplate<int16_t> {
+public:
+       inline ShortArray(java_handle_shortarray_t* h) : ArrayTemplate<int16_t>(h) {}
+       inline ShortArray(int32_t length) : ArrayTemplate<int16_t>(length, primitivetype_table[ARRAYTYPE_SHORT].arrayclass) {}
+};
+
+class IntArray : public ArrayTemplate<int32_t> {
+public:
+       inline IntArray(java_handle_intarray_t* h) : ArrayTemplate<int32_t>(h) {}
+       inline IntArray(int32_t length) : ArrayTemplate<int32_t>(length, primitivetype_table[ARRAYTYPE_INT].arrayclass) {}
+};
+
+class LongArray : public ArrayTemplate<int64_t> {
+public:
+       inline LongArray(java_handle_longarray_t* h) : ArrayTemplate<int64_t>(h) {}
+       inline LongArray(int32_t length) : ArrayTemplate<int64_t>(length, primitivetype_table[ARRAYTYPE_LONG].arrayclass) {}
+};
+
+class FloatArray : public ArrayTemplate<float> {
+public:
+       inline FloatArray(java_handle_floatarray_t* h) : ArrayTemplate<float>(h) {}
+       inline FloatArray(int32_t length) : ArrayTemplate<float>(length, primitivetype_table[ARRAYTYPE_FLOAT].arrayclass) {}
+};
+
+class DoubleArray : public ArrayTemplate<double> {
+public:
+       inline DoubleArray(java_handle_doublearray_t* h) : ArrayTemplate<double>(h) {}
+       inline DoubleArray(int32_t length) : ArrayTemplate<double>(length, primitivetype_table[ARRAYTYPE_DOUBLE].arrayclass) {}
+};
+
+/**
+ * Actual implementation of access class for Java Object arrays.
+ */
+class ObjectArray : public ArrayTemplate<java_handle_t*> {
+public:
+       inline ObjectArray(java_handle_objectarray_t* h) : ArrayTemplate<java_handle_t*>(h) {}
+       ObjectArray(int32_t length, classinfo* componentclass);
+};
+
+/**
+ * Actual implementation of access class for java.lang.Class arrays.
+ */
+class ClassArray : public ArrayTemplate<classinfo*> {
+public:
+       ClassArray(int32_t length);
+};
+
+
+#else
+# warning No legacy C functions for array access classes.
 #endif
 
 #endif // _VM_ARRAY_HPP
index 698356d11566973010920c69af5720f75694445d..07329bc319a48b57526a7f76160dff1d050bd332 100644 (file)
@@ -1586,7 +1586,6 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
        utf                   *outername;
        int                    declaredclasscount;  /* number of declared classes */
        int                    pos;                     /* current declared class */
-       java_handle_objectarray_t *oa;               /* array of declared classes */
        int                    i;
        classinfo             *ic;
 
@@ -1619,9 +1618,9 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
 
        /* Allocate Class[] and check for OOM. */
 
-       oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
+       ClassArray declaredclasses(declaredclasscount);
 
-       if (oa == NULL)
+       if (declaredclasses.is_null())
                return NULL;
 
        for (i = 0, pos = 0; i < c->innerclasscount; i++) {
@@ -1653,11 +1652,11 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
                                if (!link_class(ic))
                                        return NULL;
 
-                       LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
+                       declaredclasses.set_element(pos++, ic);
                }
        }
 
-       return oa;
+       return declaredclasses.get_handle();
 }
 
 
@@ -1672,11 +1671,10 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
 #if defined(ENABLE_JAVASE)
 java_handle_objectarray_t *class_get_declaredconstructors(classinfo *c, bool publicOnly)
 {
-       methodinfo*                m;
-       java_handle_objectarray_t* oa;
-       int                        count;
-       int                        index;
-       int                        i;
+       methodinfo* m;
+       int         count;
+       int         index;
+       int         i;
 
        /* Determine number of constructors. */
 
@@ -1692,9 +1690,9 @@ java_handle_objectarray_t *class_get_declaredconstructors(classinfo *c, bool pub
 
        /* Create array of constructors. */
 
-       oa = builtin_anewarray(count, class_java_lang_reflect_Constructor);
+       ObjectArray oa(count, class_java_lang_reflect_Constructor);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        /* Get the constructors and store them in the array. */
@@ -1710,12 +1708,12 @@ java_handle_objectarray_t *class_get_declaredconstructors(classinfo *c, bool pub
 
                        /* Store object into array. */
 
-                       array_objectarray_element_set(oa, index, rc.get_handle());
+                       oa.set_element(index, rc.get_handle());
                        index++;
                }
        }
 
-       return oa;
+       return oa.get_handle();
 }
 #endif
 
@@ -1736,11 +1734,10 @@ java_handle_objectarray_t *class_get_declaredconstructors(classinfo *c, bool pub
 #if defined(ENABLE_JAVASE)
 java_handle_objectarray_t *class_get_declaredfields(classinfo *c, bool publicOnly)
 {
-       java_handle_objectarray_t *oa;
-       fieldinfo                 *f;
-       int                        count;
-       int                        index;
-       int                        i;
+       fieldinfo* f;
+       int        count;
+       int        index;
+       int        i;
 
        /* Determine number of fields. */
 
@@ -1752,9 +1749,9 @@ java_handle_objectarray_t *class_get_declaredfields(classinfo *c, bool publicOnl
 
        /* Create array of fields. */
 
-       oa = builtin_anewarray(count, class_java_lang_reflect_Field);
+       ObjectArray oa(count, class_java_lang_reflect_Field);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        /* Get the fields and store them in the array. */
@@ -1769,12 +1766,12 @@ java_handle_objectarray_t *class_get_declaredfields(classinfo *c, bool publicOnl
 
                        /* Store object into array. */
 
-                       array_objectarray_element_set(oa, index, rf.get_handle());
+                       oa.set_element(index, rf.get_handle());
                        index++;
                }
        }
 
-       return oa;
+       return oa.get_handle();
 }
 #endif
 
@@ -1795,19 +1792,20 @@ java_handle_objectarray_t *class_get_declaredfields(classinfo *c, bool publicOnl
 #if defined(ENABLE_JAVASE)
 java_handle_objectarray_t *class_get_declaredmethods(classinfo *c, bool publicOnly)
 {
-       java_handle_objectarray_t *oa;         /* result: array of Method-objects */
-       methodinfo                *m;     /* the current method to be represented */
-       int                        count;
-       int                        index;
-       int                        i;
+       methodinfo* m;     /* the current method to be represented */
+       int         count;
+       int         index;
+       int         i;
 
        /* JOWENN: array classes do not declare methods according to mauve
           test.  It should be considered, if we should return to my old
           clone method overriding instead of declaring it as a member
           function. */
 
-       if (class_is_array(c))
-               return builtin_anewarray(0, class_java_lang_reflect_Method);
+       if (class_is_array(c)) {
+               ObjectArray oa(0, class_java_lang_reflect_Method);
+               return oa.get_handle();
+       }
 
        /* Determine number of methods. */
 
@@ -1824,9 +1822,9 @@ java_handle_objectarray_t *class_get_declaredmethods(classinfo *c, bool publicOn
 
        /* Create array of methods. */
 
-       oa = builtin_anewarray(count, class_java_lang_reflect_Method);
+       ObjectArray oa(count, class_java_lang_reflect_Method);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        /* Get the methods and store them in the array. */
@@ -1843,12 +1841,12 @@ java_handle_objectarray_t *class_get_declaredmethods(classinfo *c, bool publicOn
 
                        /* Store object into array. */
 
-                       array_objectarray_element_set(oa, index, rm.get_handle());
+                       oa.set_element(index, rm.get_handle());
                        index++;
                }
        }
 
-       return oa;
+       return oa.get_handle();
 }
 #endif
 
@@ -2046,28 +2044,27 @@ java_handle_t* class_get_enclosingmethod(classinfo *c)
 
 *******************************************************************************/
 
-java_handle_objectarray_t *class_get_interfaces(classinfo *c)
+java_handle_objectarray_tclass_get_interfaces(classinfo *c)
 {
-       classinfo                 *ic;
-       java_handle_objectarray_t *oa;
-       u4                         i;
+       classinfo* ic;
+       u4         i;
 
        if (!(c->state & CLASS_LINKED))
                if (!link_class(c))
                        return NULL;
 
-       oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
+       ClassArray interfaces(c->interfacescount);
 
-       if (oa == NULL)
+       if (interfaces.is_null())
                return NULL;
 
        for (i = 0; i < c->interfacescount; i++) {
                ic = c->interfaces[i];
 
-               LLNI_array_direct(oa, i) = (java_object_t *) ic;
+               interfaces.set_element(i, ic);
        }
 
-       return oa;
+       return interfaces.get_handle();
 }
 
 
@@ -2092,7 +2089,7 @@ java_handle_bytearray_t *class_get_annotations(classinfo *c)
 
        LLNI_classinfo_field_get(c, annotations, annotations);
 
-       return (java_handle_bytearray_t*)annotations;
+       return (java_handle_bytearray_t*) annotations;
 #else
        return NULL;
 #endif
index 6b6b4ed43be2776661cef9998341f69008b6bea4..9d034b36cbcfefce3714e5dfb5db7f3211fca972 100644 (file)
@@ -405,26 +405,24 @@ java_handle_bytearray_t *field_get_annotations(fieldinfo *f)
 #if defined(ENABLE_ANNOTATIONS)
        classinfo               *c;           /* declaring class           */
        int                      slot;        /* slot of this field        */
-       java_handle_bytearray_t *annotations; /* unparsed annotations      */
        java_handle_t           *field_annotations;  /* array of unparsed  */
                       /* annotations of all fields of the declaring class */
 
-       c           = f->clazz;
-       slot        = f - c->fields;
-       annotations = NULL;
+       c    = f->clazz;
+       slot = f - c->fields;
 
        LLNI_classinfo_field_get(c, field_annotations, field_annotations);
 
+       ObjectArray oa(field_annotations);
+
        /* the field_annotations array might be shorter then the field
         * count if the fields above a certain index have no annotations.
         */
-       if (field_annotations != NULL &&
-               array_length_get(field_annotations) > slot) {
-               annotations = (java_handle_bytearray_t*)array_objectarray_element_get(
-                               (java_handle_objectarray_t*)field_annotations, slot);
+       if (field_annotations != NULL && oa.get_length() > slot) {
+               return (java_handle_bytearray_t*) oa.get_element(slot);
+       } else {
+               return NULL;
        }
-       
-       return annotations;
 #else
        return NULL;
 #endif
index 011d9b4a03e78ed78a64e8158fceada9e0ebcc9b..33b7fb1e7ecd32cae73c00b1d1155bc902e12e16 100644 (file)
@@ -323,34 +323,17 @@ struct java_objectarray_t {
 
 *******************************************************************************/
 
-#if defined(ENABLE_HANDLES)
-typedef struct java_handle_t {
-       java_object_t *heap_object;
-} java_handle_t;
-
-typedef struct java_handle_array_t        { java_array_t        *heap_object; } java_handle_array_t;
-typedef struct java_handle_objectarray_t  { java_objectarray_t  *heap_object; } java_handle_objectarray_t;
-typedef struct java_handle_booleanarray_t { java_booleanarray_t *heap_object; } java_handle_booleanarray_t;
-typedef struct java_handle_bytearray_t    { java_bytearray_t    *heap_object; } java_handle_bytearray_t;
-typedef struct java_handle_chararray_t    { java_chararray_t    *heap_object; } java_handle_chararray_t;
-typedef struct java_handle_shortarray_t   { java_shortarray_t   *heap_object; } java_handle_shortarray_t;
-typedef struct java_handle_intarray_t     { java_intarray_t     *heap_object; } java_handle_intarray_t;
-typedef struct java_handle_longarray_t    { java_longarray_t    *heap_object; } java_handle_longarray_t;
-typedef struct java_handle_floatarray_t   { java_floatarray_t   *heap_object; } java_handle_floatarray_t;
-typedef struct java_handle_doublearray_t  { java_doublearray_t  *heap_object; } java_handle_doublearray_t;
-#else
 typedef java_object_t       java_handle_t;
-typedef java_array_t        java_handle_array_t;
-typedef java_objectarray_t  java_handle_objectarray_t;
-typedef java_booleanarray_t java_handle_booleanarray_t;
-typedef java_bytearray_t    java_handle_bytearray_t;
-typedef java_chararray_t    java_handle_chararray_t;
-typedef java_shortarray_t   java_handle_shortarray_t;
-typedef java_intarray_t     java_handle_intarray_t;
-typedef java_longarray_t    java_handle_longarray_t;
-typedef java_floatarray_t   java_handle_floatarray_t;
-typedef java_doublearray_t  java_handle_doublearray_t;
-#endif
+typedef java_handle_t       java_handle_array_t;
+typedef java_handle_array_t java_handle_objectarray_t;
+typedef java_handle_array_t java_handle_booleanarray_t;
+typedef java_handle_array_t java_handle_bytearray_t;
+typedef java_handle_array_t java_handle_chararray_t;
+typedef java_handle_array_t java_handle_shortarray_t;
+typedef java_handle_array_t java_handle_intarray_t;
+typedef java_handle_array_t java_handle_longarray_t;
+typedef java_handle_array_t java_handle_floatarray_t;
+typedef java_handle_array_t java_handle_doublearray_t;
 
 
 /* global constants related to the verifier ***********************************/
index 5ee7ca6d5b22e5b8d62acb6a222f05f38402a7bf..9736c1e24945dce0707558fdd7920ae1d8e355bb 100644 (file)
@@ -582,10 +582,12 @@ uint64_t *argument_vmarray_from_objectarray(methodinfo *m, java_handle_t *o,
                i++;
        }
 
+       ObjectArray oa(params);
+
        for (j = 0; i < md->paramcount; i++, j++, pd++, td++) {
                /* XXX This function can throw an exception, which should not happend
                   here, since we are outside the nativeworld. */
-               param = array_objectarray_element_get(params, j);
+               param = oa.get_element(j);
 
                switch (td->type) {
                case TYPE_INT:
index 491d48ce6c056cac6b6c212424807374485f3d46..b7b2a54c0912d27c058cfc3f6c140fcae8c94e9c 100644 (file)
@@ -628,7 +628,7 @@ bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 
        LLNI_CRITICAL_START;
 
-       result = builtin_fast_canstore(LLNI_DIRECT(oa), LLNI_UNWRAP(o));
+       result = builtin_fast_canstore((java_objectarray_t*) LLNI_DIRECT(oa), LLNI_UNWRAP(o));
 
        LLNI_CRITICAL_END;
 
@@ -1086,7 +1086,7 @@ java_object_t *builtin_fast_new(classinfo *c)
 }
 
 
-/* builtin_newarray ************************************************************
+/* builtin_java_newarray *******************************************************
 
    Creates an array with the given vftbl on the heap. This function
    takes as class argument an array class.
@@ -1094,111 +1094,27 @@ java_object_t *builtin_fast_new(classinfo *c)
    RETURN VALUE:
       pointer to the array or NULL if no memory is available
 
-   NOTE: This builtin can be called from NATIVE code only.
+   NOTE: This is a SLOW builtin and can be called from JIT code only.
 
 *******************************************************************************/
 
-java_handle_t *builtin_newarray(int32_t size, classinfo *arrayclass)
+java_handle_array_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclazz)
 {
-       arraydescriptor *desc;
-       s4               dataoffset;
-       s4               componentsize;
-       s4               actualsize;
-       java_handle_t   *a;
 #if defined(ENABLE_RT_TIMING)
        struct timespec time_start, time_end;
 #endif
 
        RT_TIMING_GET_TIME(time_start);
 
-       desc          = arrayclass->vftbl->arraydesc;
-       dataoffset    = desc->dataoffset;
-       componentsize = desc->componentsize;
-
-       if (size < 0) {
-               exceptions_throw_negativearraysizeexception();
-               return NULL;
-       }
-
-       actualsize = dataoffset + size * componentsize;
+       classinfo* arrayclass = LLNI_classinfo_unwrap(arrayclazz);
 
-       /* check for overflow */
-
-       if (((u4) actualsize) < ((u4) size)) {
-               exceptions_throw_outofmemoryerror();
-               return NULL;
-       }
-
-       a = (java_handle_t*) heap_alloc(actualsize, (desc->arraytype == ARRAYTYPE_OBJECT), NULL, true);
-
-       if (a == NULL)
-               return NULL;
-
-#if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
-       /* XXX this is only a dirty hack to make Boehm work with handles */
-
-       a = LLNI_WRAP((java_object_t *) a);
-#endif
-
-       LLNI_vftbl_direct(a) = arrayclass->vftbl;
-
-#if defined(ENABLE_THREADS)
-       LLNI_DIRECT(a)->lockword.init();
-#endif
-
-       LLNI_array_size(a) = size;
+       // Allocate a new array with given size and class on the heap
+       Array a(size, arrayclass);
 
        RT_TIMING_GET_TIME(time_end);
        RT_TIMING_TIME_DIFF(time_start, time_end, RT_TIMING_NEW_ARRAY);
 
-       return a;
-}
-
-
-/* builtin_java_newarray *******************************************************
-
-   NOTE: This is a SLOW builtin and can be called from JIT code only.
-
-*******************************************************************************/
-
-java_handle_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclazz)
-{
-       return builtin_newarray(size, LLNI_classinfo_unwrap(arrayclazz));
-}
-
-
-/* builtin_anewarray ***********************************************************
-
-   Creates an array of references to the given class type on the heap.
-
-   RETURN VALUE:
-      pointer to the array or NULL if no memory is
-      available
-
-   NOTE: This builtin can be called from NATIVE code only.
-
-*******************************************************************************/
-
-java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass)
-{
-       classinfo *arrayclass;
-       
-       /* is class loaded */
-
-       assert(componentclass->state & CLASS_LOADED);
-
-       /* is class linked */
-
-       if (!(componentclass->state & CLASS_LINKED))
-               if (!link_class(componentclass))
-                       return NULL;
-
-       arrayclass = class_array_of(componentclass, true);
-
-       if (!arrayclass)
-               return NULL;
-
-       return (java_handle_objectarray_t *) builtin_newarray(size, arrayclass);
+       return a.get_handle();
 }
 
 
@@ -1213,21 +1129,21 @@ java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentc
 
 *******************************************************************************/
 
-#define BUILTIN_NEWARRAY_TYPE(type, arraytype)                             \
-java_handle_##type##array_t *builtin_newarray_##type(int32_t size)              \
-{                                                                          \
-       return (java_handle_##type##array_t *)                                 \
-               builtin_newarray(size, primitivetype_table[arraytype].arrayclass); \
+#define BUILTIN_NEWARRAY_TYPE(type, name)                          \
+java_handle_##type##array_t *builtin_newarray_##type(int32_t size) \
+{                                                                  \
+       name##Array a(size);                                           \
+       return a.get_handle();                                         \
 }
 
-BUILTIN_NEWARRAY_TYPE(boolean, ARRAYTYPE_BOOLEAN)
-BUILTIN_NEWARRAY_TYPE(byte,    ARRAYTYPE_BYTE)
-BUILTIN_NEWARRAY_TYPE(char,    ARRAYTYPE_CHAR)
-BUILTIN_NEWARRAY_TYPE(short,   ARRAYTYPE_SHORT)
-BUILTIN_NEWARRAY_TYPE(int,     ARRAYTYPE_INT)
-BUILTIN_NEWARRAY_TYPE(long,    ARRAYTYPE_LONG)
-BUILTIN_NEWARRAY_TYPE(float,   ARRAYTYPE_FLOAT)
-BUILTIN_NEWARRAY_TYPE(double,  ARRAYTYPE_DOUBLE)
+BUILTIN_NEWARRAY_TYPE(boolean, Boolean)
+BUILTIN_NEWARRAY_TYPE(byte,    Byte)
+BUILTIN_NEWARRAY_TYPE(char,    Char)
+BUILTIN_NEWARRAY_TYPE(short,   Short)
+BUILTIN_NEWARRAY_TYPE(int,     Int)
+BUILTIN_NEWARRAY_TYPE(long,    Long)
+BUILTIN_NEWARRAY_TYPE(float,   Float)
+BUILTIN_NEWARRAY_TYPE(double,  Double)
 
 
 /* builtin_multianewarray_intern ***********************************************
@@ -1245,38 +1161,37 @@ BUILTIN_NEWARRAY_TYPE(double,  ARRAYTYPE_DOUBLE)
 
 ******************************************************************************/
 
-static java_handle_t *builtin_multianewarray_intern(int n,
+static java_handle_array_t *builtin_multianewarray_intern(int n,
                                                                                                        classinfo *arrayclass,
                                                                                                        long *dims)
 {
-       s4             size;
-       java_handle_t *a;
-       classinfo     *componentclass;
-       s4             i;
+       int32_t i;
 
        /* create this dimension */
 
-       size = (s4) dims[0];
-       a = builtin_newarray(size, arrayclass);
+       int32_t size = (int32_t) dims[0];
+       Array a(size, arrayclass);
 
-       if (!a)
+       if (a.is_null())
                return NULL;
 
        /* if this is the last dimension return */
 
        if (!--n)
-               return a;
+               return a.get_handle();
 
        /* get the class of the components to create */
 
-       componentclass = arrayclass->vftbl->arraydesc->componentvftbl->clazz;
+       classinfo* componentclass = arrayclass->vftbl->arraydesc->componentvftbl->clazz;
 
        /* The verifier guarantees that the dimension count is in the range. */
 
        /* create the component arrays */
 
+       ObjectArray oa(a.get_handle());
+
        for (i = 0; i < size; i++) {
-               java_handle_t *ea =
+               java_handle_array_t *ea =
 #if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
                        /* we save an s4 to a s8 slot, 8-byte aligned */
 
@@ -1288,10 +1203,10 @@ static java_handle_t *builtin_multianewarray_intern(int n,
                if (!ea)
                        return NULL;
 
-               array_objectarray_element_set((java_handle_objectarray_t *) a, i, ea);
+               oa.set_element(i, (java_handle_t*) ea);
        }
 
-       return a;
+       return a.get_handle();
 }
 
 
@@ -2136,6 +2051,9 @@ void builtin_arraycopy(java_handle_t *src, s4 srcStart,
                return;
        }
 
+       Array sa(src);
+       Array da(dest);
+
        sdesc = LLNI_vftbl_direct(src)->arraydesc;
        ddesc = LLNI_vftbl_direct(dest)->arraydesc;
 
@@ -2151,8 +2069,8 @@ void builtin_arraycopy(java_handle_t *src, s4 srcStart,
        }
 
        // Check if ranges are valid.
-       if ((((uint32_t) srcStart  + (uint32_t) len) > (uint32_t) LLNI_array_size(src)) ||
-               (((uint32_t) destStart + (uint32_t) len) > (uint32_t) LLNI_array_size(dest))) {
+       if ((((uint32_t) srcStart  + (uint32_t) len) > (uint32_t) sa.get_length()) ||
+               (((uint32_t) destStart + (uint32_t) len) > (uint32_t) da.get_length())) {
                exceptions_throw_arrayindexoutofboundsexception();
                return;
        }
@@ -2179,19 +2097,17 @@ void builtin_arraycopy(java_handle_t *src, s4 srcStart,
        else {
                /* We copy references of different type */
 
-               java_handle_objectarray_t *oas = (java_handle_objectarray_t *) src;
-               java_handle_objectarray_t *oad = (java_handle_objectarray_t *) dest;
+               ObjectArray oas((java_handle_objectarray_t*) src);
+               ObjectArray oad((java_handle_objectarray_t*) dest);
  
                if (destStart <= srcStart) {
                        for (i = 0; i < len; i++) {
-                               java_handle_t *o;
+                               java_handle_t* o = oas.get_element(srcStart + i);
 
-                               o = array_objectarray_element_get(oas, srcStart + i);
-
-                               if (!builtin_canstore(oad, o))
+                               if (!builtin_canstore(oad.get_handle(), o))
                                        return;
 
-                               array_objectarray_element_set(oad, destStart + i, o);
+                               oad.set_element(destStart + i, o);
                        }
                }
                else {
@@ -2202,14 +2118,12 @@ void builtin_arraycopy(java_handle_t *src, s4 srcStart,
                           index have been copied before the throw. */
 
                        for (i = len - 1; i >= 0; i--) {
-                               java_handle_t *o;
-
-                               o = array_objectarray_element_get(oas, srcStart + i);
+                               java_handle_t* o = oas.get_element(srcStart + i);
 
-                               if (!builtin_canstore(oad, o))
+                               if (!builtin_canstore(oad.get_handle(), o))
                                        return;
 
-                               array_objectarray_element_set(oad, destStart + i, o);
+                               oad.set_element(destStart + i, o);
                        }
                }
        }
@@ -2274,7 +2188,9 @@ java_handle_t *builtin_clone(void *env, java_handle_t *o)
        /* we are cloning an array */
 
        if (ad != NULL) {
-               size = ad->dataoffset + ad->componentsize * LLNI_array_size(o);
+               Array a(o);
+
+               size = ad->dataoffset + ad->componentsize * a.get_length();
         
                co = (java_handle_t*) heap_alloc(size, (ad->arraytype == ARRAYTYPE_OBJECT), NULL, true);
 
index 60b58e25c672497252ad3d94c99c1377b1a950c6..af81aced2d3c8adbc2d5cced00f3f0eae663ddb3 100644 (file)
@@ -168,14 +168,9 @@ java_handle_t *builtin_escape_reason_new(classinfo *c);
 java_object_t *builtin_fast_new(classinfo *c);
 #define BUILTIN_FAST_new (functionptr) builtin_fast_new
 
-java_handle_t *builtin_newarray(int32_t size, classinfo *arrayclass);
-/* NOT AN OP */
-java_handle_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclass);
+java_handle_array_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclass);
 #define BUILTIN_newarray (functionptr) builtin_java_newarray
 
-java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass);
-/* NOT AN OP */
-
 java_handle_booleanarray_t *builtin_newarray_boolean(int32_t size);
 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
 java_handle_chararray_t *builtin_newarray_char(int32_t size);
index 8efa4b25bcfe75e72a730f6f78fbaae542274ab6..e3389e4ac49a33cc210d7b3963a255058bb1fb4e 100644 (file)
@@ -516,15 +516,14 @@ static int stacktrace_depth(stackframeinfo_t *sfi)
 
 java_handle_bytearray_t *stacktrace_get(stackframeinfo_t *sfi)
 {
-       stackframeinfo_t         tmpsfi;
-       int                      depth;
-       java_handle_bytearray_t *ba;
-       int32_t                  ba_size;
-       stacktrace_t            *st;
-       stacktrace_entry_t      *ste;
-       methodinfo              *m;
-       bool                     skip_fillInStackTrace;
-       bool                     skip_init;
+       stackframeinfo_t    tmpsfi;
+       int                 depth;
+       int32_t             ba_size;
+       stacktrace_t       *st;
+       stacktrace_entry_t *ste;
+       methodinfo         *m;
+       bool                skip_fillInStackTrace;
+       bool                skip_init;
 
        CYCLES_STATS_DECLARE_AND_START_WITH_OVERHEAD
 
@@ -550,9 +549,9 @@ java_handle_bytearray_t *stacktrace_get(stackframeinfo_t *sfi)
 
        ba_size = sizeof(stacktrace_t) + sizeof(stacktrace_entry_t) * depth;
 
-       ba = builtin_newarray_byte(ba_size);
+       ByteArray ba(ba_size);
 
-       if (ba == NULL)
+       if (ba.is_null())
                goto return_NULL;
 
        /* Get a stacktrace entry pointer. */
@@ -561,7 +560,7 @@ java_handle_bytearray_t *stacktrace_get(stackframeinfo_t *sfi)
 
        LLNI_CRITICAL_START;
 
-       st = (stacktrace_t *) LLNI_array_data(ba);
+       st = (stacktrace_t *) ba.get_raw_data_ptr();
 
        ste = st->entries;
 
@@ -639,7 +638,7 @@ java_handle_bytearray_t *stacktrace_get(stackframeinfo_t *sfi)
 
        CYCLES_STATS_END_WITH_OVERHEAD(stacktrace_fillInStackTrace,
                                                                   stacktrace_overhead)
-       return ba;
+       return ba.get_handle();
 
 return_NULL:
 /*     dump_release(dumpsize); */
@@ -774,9 +773,9 @@ java_handle_objectarray_t* stacktrace_get_StackTraceElements(stacktrace_t* st)
        int32_t length = (st != NULL) ? st->length : 0;
 
        // Create the stacktrace element array.
-       java_handle_objectarray_t* oa = builtin_anewarray(length, class_java_lang_StackTraceElement);
+       ObjectArray oa(length, class_java_lang_StackTraceElement);
 
-       if (oa == NULL)
+       if (oa.is_null())
                return NULL;
 
        // Iterate over all stacktrace elements.
@@ -789,10 +788,10 @@ java_handle_objectarray_t* stacktrace_get_StackTraceElements(stacktrace_t* st)
                        return NULL;
 
                // Store stacktrace element in array.
-               array_objectarray_element_set(oa, i, h);
+               oa.set_element(i, h);
        }
 
-       return oa;
+       return oa.get_handle();
 }
 #endif
 
@@ -931,8 +930,6 @@ java_handle_objectarray_t *stacktrace_getClassContext(void)
        stackframeinfo_t           *sfi;
        stackframeinfo_t            tmpsfi;
        int                         depth;
-       java_handle_objectarray_t  *oa;
-       java_object_t             **data;
        int                         i;
        methodinfo                 *m;
 
@@ -959,20 +956,15 @@ java_handle_objectarray_t *stacktrace_getClassContext(void)
 
        /* Allocate the Class array. */
 
-       oa = builtin_anewarray(depth, class_java_lang_Class);
+       ClassArray ca(depth);
 
-       if (oa == NULL) {
+       if (ca.is_null()) {
                CYCLES_STATS_END(stacktrace_getClassContext);
 
                return NULL;
        }
 
        /* Fill the Class array from the stacktrace list. */
-
-       LLNI_CRITICAL_START;
-
-       data = LLNI_array_data(oa);
-
        /* Iterate over the whole stack. */
 
        i = 0;
@@ -991,7 +983,7 @@ java_handle_objectarray_t *stacktrace_getClassContext(void)
 
                /* Store the class in the array. */
 
-               data[i] = (java_object_t *) m->clazz;
+               ca.set_element(i, m->clazz);
 
                i++;
        }
@@ -1000,7 +992,7 @@ java_handle_objectarray_t *stacktrace_getClassContext(void)
 
        CYCLES_STATS_END(stacktrace_getClassContext)
 
-       return oa;
+       return ca.get_handle();
 }
 
 
@@ -1092,15 +1084,12 @@ classinfo *stacktrace_get_current_class(void)
 #if defined(ENABLE_JAVASE) && defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 java_handle_objectarray_t *stacktrace_get_stack(void)
 {
-       stackframeinfo_t          *sfi;
-       stackframeinfo_t           tmpsfi;
-       int                        depth;
-       java_handle_objectarray_t *oa;
-       java_handle_objectarray_t *classes;
-       java_handle_objectarray_t *methodnames;
-       methodinfo                *m;
-       java_handle_t             *string;
-       int                        i;
+       stackframeinfo_t *sfi;
+       stackframeinfo_t  tmpsfi;
+       int               depth;
+       methodinfo       *m;
+       java_handle_t    *string;
+       int               i;
 
        CYCLES_STATS_DECLARE_AND_START
 
@@ -1122,25 +1111,23 @@ java_handle_objectarray_t *stacktrace_get_stack(void)
 
        /* Allocate the required arrays. */
 
-       oa = builtin_anewarray(2, arrayclass_java_lang_Object);
+       ObjectArray oa(2, arrayclass_java_lang_Object);
+       ClassArray  classes(depth);
+       ObjectArray methodnames(depth, class_java_lang_String);
 
-       if (oa == NULL)
+       if (oa.is_null())
                goto return_NULL;
 
-       classes = builtin_anewarray(depth, class_java_lang_Class);
-
-       if (classes == NULL)
+       if (classes.is_null())
                goto return_NULL;
 
-       methodnames = builtin_anewarray(depth, class_java_lang_String);
-
-       if (methodnames == NULL)
+       if (methodnames.is_null())
                goto return_NULL;
 
        /* Set up the 2-dimensional array. */
 
-       array_objectarray_element_set(oa, 0, (java_handle_t *) classes);
-       array_objectarray_element_set(oa, 1, (java_handle_t *) methodnames);
+       oa.set_element(0, (java_handle_t *) classes.get_handle());
+       oa.set_element(1, (java_handle_t *) methodnames.get_handle());
 
        /* Iterate over the whole stack. */
        /* TODO We should use a critical section here to speed things
@@ -1161,10 +1148,8 @@ java_handle_objectarray_t *stacktrace_get_stack(void)
                        continue;
 
                /* Store the class in the array. */
-               /* NOTE: We use a LLNI-macro here, because a classinfo is not
-                  a handle. */
 
-               LLNI_array_direct(classes, i) = (java_object_t *) m->clazz;
+               classes.set_element(i, m->clazz);
 
                /* Store the name in the array. */
 
@@ -1173,14 +1158,14 @@ java_handle_objectarray_t *stacktrace_get_stack(void)
                if (string == NULL)
                        goto return_NULL;
 
-               array_objectarray_element_set(methodnames, i, string);
+               methodnames.set_element(i, string);
 
                i++;
        }
 
        CYCLES_STATS_END(stacktrace_get_stack)
 
-       return oa;
+       return oa.get_handle();
 
 return_NULL:
        CYCLES_STATS_END(stacktrace_get_stack)
@@ -1324,16 +1309,18 @@ void stacktrace_print_current(void)
 stacktrace_t* stacktrace_get_of_thread(threadobject* t)
 {
        stackframeinfo_t*        sfi;
-       java_handle_bytearray_t* ba;
+       java_handle_bytearray_t* stba;
        stacktrace_t*            st;
 
-       sfi = t->_stackframeinfo;
-       ba  = stacktrace_get(sfi);
+       sfi  = t->_stackframeinfo;
+       stba = stacktrace_get(sfi);
+
+       ByteArray ba(stba);
 
-       if (ba == NULL)
+       if (ba.is_null())
                return NULL;
 
-       st  = (stacktrace_t*) LLNI_array_data(ba);
+       st  = (stacktrace_t*) ba.get_raw_data_ptr();
 
        return st;
 }
@@ -1407,11 +1394,11 @@ void stacktrace_print_exception(java_handle_t *h)
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        java_lang_VMThrowable vmt(t.get_vmState());
-       java_handle_bytearray_t* backtrace = vmt.get_vmdata();
+       ByteArray backtrace(vmt.get_vmdata());
 
 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) || defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1)
 
-       java_handle_bytearray_t* backtrace = t.get_backtrace();
+       ByteArray backtrace(t.get_backtrace());
 
 #else
 # error unknown classpath configuration
@@ -1419,14 +1406,14 @@ void stacktrace_print_exception(java_handle_t *h)
 
        // Sanity check.
 
-       assert(backtrace != NULL);
+       assert(backtrace.is_non_null());
 
        /* We need a critical section here as we use the byte-array data
           pointer directly. */
 
        LLNI_CRITICAL_START;
        
-       stacktrace_t* st = (stacktrace_t*) LLNI_array_data(backtrace);
+       stacktrace_t* st = (stacktrace_t*) backtrace.get_raw_data_ptr();
 
        stacktrace_print(st);
 
index 98667f76cc0692b9ef3a08a1fd9e5dcbbe01f98a..f6dd77abae0d6f6d036637b0940cdd7beefb8adc 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "toolbox/logging.hpp"
 
+#include "vm/array.hpp"
 #include "vm/global.h"
 #include "vm/globals.hpp"
 #include "vm/javaobjects.hpp"
@@ -569,9 +570,11 @@ void trace_exception_builtin(java_handle_t* h)
                logtextlen += utf_bytes(jlt.get_vftbl()->clazz->name);
 
                if (jls.get_handle()) {
+                       CharArray ca(jls.get_value());
                        // FIXME This is not handle capable!
+                       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
                        logtextlen += strlen(": ") +
-                               u2_utflength(jls.get_value()->data + jls.get_offset(), jls.get_count());
+                               u2_utflength(ptr + jls.get_offset(), jls.get_count());
                }
        } 
        else {
index 21f542400075da4e55c13da38236e24826c61996..6389a4f86b9d727792fd11b731fbdf6e51982d95 100644 (file)
@@ -699,12 +699,11 @@ int32_t method_get_parametercount(methodinfo *m)
 
 java_handle_objectarray_t *method_get_parametertypearray(methodinfo *m)
 {
-       methoddesc                *md;
-       typedesc                  *paramtypes;
-       int32_t                    paramcount;
-       java_handle_objectarray_t *oa;
-       int32_t                    i;
-       classinfo                 *c;
+       methoddesc* md;
+       typedesc*   paramtypes;
+       int32_t     paramcount;
+       int32_t     i;
+       classinfo*  c;
 
        md = m->parseddesc;
 
@@ -726,9 +725,9 @@ java_handle_objectarray_t *method_get_parametertypearray(methodinfo *m)
 
        /* create class-array */
 
-       oa = builtin_anewarray(paramcount, class_java_lang_Class);
+       ClassArray ca(paramcount);
 
-       if (oa == NULL)
+       if (ca.is_null())
                return NULL;
 
     /* get classes */
@@ -737,10 +736,10 @@ java_handle_objectarray_t *method_get_parametertypearray(methodinfo *m)
                if (!resolve_class_from_typedesc(&paramtypes[i], true, false, &c))
                        return NULL;
 
-               LLNI_array_direct(oa, i) = (java_object_t *) c;
+               ca.set_element(i, c);
        }
 
-       return oa;
+       return ca.get_handle();
 }
 
 
@@ -752,15 +751,14 @@ java_handle_objectarray_t *method_get_parametertypearray(methodinfo *m)
 
 java_handle_objectarray_t *method_get_exceptionarray(methodinfo *m)
 {
-       java_handle_objectarray_t *oa;
-       classinfo                 *c;
-       s4                         i;
+       classinfo* c;
+       s4         i;
 
        /* create class-array */
 
-       oa = builtin_anewarray(m->thrownexceptionscount, class_java_lang_Class);
+       ClassArray ca(m->thrownexceptionscount);
 
-       if (oa == NULL)
+       if (ca.is_null())
                return NULL;
 
        /* iterate over all exceptions and store the class in the array */
@@ -771,10 +769,10 @@ java_handle_objectarray_t *method_get_exceptionarray(methodinfo *m)
                if (c == NULL)
                        return NULL;
 
-               LLNI_array_direct(oa, i) = (java_object_t *) c;
+               ca.set_element(i, c);
        }
 
-       return oa;
+       return ca.get_handle();
 }
 
 
@@ -864,26 +862,24 @@ java_handle_bytearray_t *method_get_annotations(methodinfo *m)
 #if defined(ENABLE_ANNOTATIONS)
        classinfo     *c;                  /* methods' declaring class          */
        int            slot;               /* methods' slot                     */
-       java_handle_t *annotations;        /* methods' unparsed annotations     */
        java_handle_t *method_annotations; /* all methods' unparsed annotations */
                                           /* of the declaring class            */
 
-       c           = m->clazz;
-       slot        = m - c->methods;
-       annotations = NULL;
+       c    = m->clazz;
+       slot = m - c->methods;
 
        LLNI_classinfo_field_get(c, method_annotations, method_annotations);
 
+       ObjectArray oa((java_handle_objectarray_t*) method_annotations);
+
        /* the method_annotations array might be shorter then the method
         * count if the methods above a certain index have no annotations.
         */     
-       if (method_annotations != NULL &&
-               array_length_get(method_annotations) > slot) {
-               annotations = array_objectarray_element_get(
-                       (java_handle_objectarray_t*)method_annotations, slot);
+       if (method_annotations != NULL && oa.get_length() > slot) {
+               return (java_handle_bytearray_t*) oa.get_element(slot);
+       } else {
+               return NULL;
        }
-       
-       return (java_handle_bytearray_t*)annotations;
 #else
        return NULL;
 #endif
@@ -910,30 +906,26 @@ java_handle_bytearray_t *method_get_parameterannotations(methodinfo *m)
 #if defined(ENABLE_ANNOTATIONS)
        classinfo     *c;                           /* methods' declaring class */
        int            slot;                        /* methods' slot            */
-       java_handle_t *parameterAnnotations;        /* methods' unparsed        */
-                                                   /* parameter annotations    */
        java_handle_t *method_parameterannotations; /* all methods' unparsed    */
                                                    /* parameter annotations of */
                                                    /* the declaring class      */
 
-       c                    = m->clazz;
-       slot                 = m - c->methods;
-       parameterAnnotations = NULL;
+       c    = m->clazz;
+       slot = m - c->methods;
 
        LLNI_classinfo_field_get(
                c, method_parameterannotations, method_parameterannotations);
 
+       ObjectArray oa((java_handle_objectarray_t*) method_parameterannotations);
+
        /* the method_annotations array might be shorter then the method
         * count if the methods above a certain index have no annotations.
         */     
-       if (method_parameterannotations != NULL &&
-               array_length_get(method_parameterannotations) > slot) {
-               parameterAnnotations = array_objectarray_element_get(
-                               (java_handle_objectarray_t*)method_parameterannotations,
-                               slot);
+       if (method_parameterannotations != NULL && oa.get_length() > slot) {
+               return (java_handle_bytearray_t*) oa.get_element(slot);
+       } else {
+               return NULL;
        }
-       
-       return (java_handle_bytearray_t*)parameterAnnotations;
 #else
        return NULL;
 #endif
@@ -959,29 +951,26 @@ java_handle_bytearray_t *method_get_annotationdefault(methodinfo *m)
 #if defined(ENABLE_ANNOTATIONS)
        classinfo     *c;                         /* methods' declaring class     */
        int            slot;                      /* methods' slot                */
-       java_handle_t *annotationDefault;         /* methods' unparsed            */
-                                                 /* annotation default value     */
        java_handle_t *method_annotationdefaults; /* all methods' unparsed        */
                                                  /* annotation default values of */
                                                  /* the declaring class          */
 
-       c                 = m->clazz;
-       slot              = m - c->methods;
-       annotationDefault = NULL;
+       c    = m->clazz;
+       slot = m - c->methods;
 
        LLNI_classinfo_field_get(
                c, method_annotationdefaults, method_annotationdefaults);
 
+       ObjectArray oa((java_handle_objectarray_t*) method_annotationdefaults);
+
        /* the method_annotations array might be shorter then the method
         * count if the methods above a certain index have no annotations.
-        */     
-       if (method_annotationdefaults != NULL &&
-               array_length_get(method_annotationdefaults) > slot) {
-               annotationDefault = array_objectarray_element_get(
-                               (java_handle_objectarray_t*)method_annotationdefaults, slot);
+        */
+       if (method_annotationdefaults != NULL && oa.get_length() > slot) {
+               return (java_handle_bytearray_t*) oa.get_element(slot);
+       } else {
+               return NULL;
        }
-       
-       return (java_handle_bytearray_t*)annotationDefault;
 #else
        return NULL;
 #endif
index 632f69e040da2314fe6adae59b1bbb039173f403..45b4ad46ebffcf421c594820e695361ad2c16980 100644 (file)
@@ -93,7 +93,6 @@ bool string_init(void)
  
 void stringtable_update(void)
 {
-       java_chararray_t *a;
        literalstring    *s;       /* hashtable entry */
 
        for (unsigned int i = 0; i < hashtable_string.size; i++) {
@@ -109,7 +108,7 @@ void stringtable_update(void)
                                        os::abort("stringtable_update: invalid literalstring in hashtable");
                                }
 
-                               a = LLNI_UNWRAP(js.get_value());
+                               java_chararray_t* a = (java_chararray_t*) js.get_value();
 
                                if (js.get_vftbl() == NULL)
                                        // FIXME
@@ -150,23 +149,26 @@ static java_handle_t *javastring_new_from_utf_buffer(const char *buffer, u4 blen
        int32_t utflength = utf_get_number_of_u2s_for_buffer(buffer, blength);
 
        java_handle_t*           h  = builtin_new(class_java_lang_String);
-       java_handle_chararray_t* ca = builtin_newarray_char(utflength);
+       CharArray ca(utflength);
 
        /* javastring or character-array could not be created */
 
-       if ((h == NULL) || (ca == NULL))
+       if ((h == NULL) || ca.is_null())
                return NULL;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        /* decompress utf-string */
 
        utf_ptr = buffer;
 
        for (int32_t i = 0; i < utflength; i++)
-               LLNI_array_direct(ca, i) = utf_nextu2((char **) &utf_ptr);
+               ptr[i] = utf_nextu2((char **) &utf_ptr);
        
        /* set fields of the javastring-object */
 
-       java_lang_String jls(h, ca, utflength);
+       java_lang_String jls(h, ca.get_handle(), utflength);
 
        return jls.get_handle();
 }
@@ -204,20 +206,23 @@ java_handle_t *javastring_safe_new_from_utf8(const char *text)
        /* allocate the String object and the char array */
 
        java_handle_t*           h  = builtin_new(class_java_lang_String);
-       java_handle_chararray_t* ca = builtin_newarray_char(len);
+       CharArray ca(len);
 
        /* javastring or character-array could not be created? */
 
-       if ((h == NULL) || (ca == NULL))
+       if ((h == NULL) || ca.is_null())
                return NULL;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        /* decompress UTF-8 string */
 
-       utf8_safe_convert_to_u2s(text, nbytes, LLNI_array_data(ca));
+       utf8_safe_convert_to_u2s(text, nbytes, ptr);
 
        /* set fields of the String object */
 
-       java_lang_String jls(h, ca, len);
+       java_lang_String jls(h, ca.get_handle(), len);
 
        return jls.get_handle();
 }
@@ -266,21 +271,24 @@ java_handle_t *javastring_new(utf *u)
        int32_t utflength = utf_get_number_of_u2s(u);
 
        java_handle_t*           h  = builtin_new(class_java_lang_String);
-       java_handle_chararray_t* ca = builtin_newarray_char(utflength);
+       CharArray ca(utflength);
 
        /* javastring or character-array could not be created */
 
-       if ((h == NULL) || (ca == NULL))
+       if ((h == NULL) || ca.is_null())
                return NULL;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        /* decompress utf-string */
 
        for (int32_t i = 0; i < utflength; i++)
-               LLNI_array_direct(ca, i) = utf_nextu2(&utf_ptr);
+               ptr[i] = utf_nextu2(&utf_ptr);
        
        /* set fields of the javastring-object */
 
-       java_lang_String jls(h, ca, utflength);
+       java_lang_String jls(h, ca.get_handle(), utflength);
 
        return jls.get_handle();
 }
@@ -306,12 +314,15 @@ java_handle_t *javastring_new_slash_to_dot(utf *u)
        int32_t utflength = utf_get_number_of_u2s(u);
 
        java_handle_t*           h  = builtin_new(class_java_lang_String);
-       java_handle_chararray_t* ca = builtin_newarray_char(utflength);
+       CharArray ca(utflength);
 
        /* javastring or character-array could not be created */
-       if ((h == NULL) || (ca == NULL))
+       if ((h == NULL) || ca.is_null())
                return NULL;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        /* decompress utf-string */
 
        for (int32_t i = 0; i < utflength; i++) {
@@ -320,12 +331,12 @@ java_handle_t *javastring_new_slash_to_dot(utf *u)
                if (ch == '/')
                        ch = '.';
 
-               LLNI_array_direct(ca, i) = ch;
+               ptr[i] = ch;
        }
        
        /* set fields of the javastring-object */
 
-       java_lang_String jls(h, ca, utflength);
+       java_lang_String jls(h, ca.get_handle(), utflength);
 
        return jls.get_handle();
 }
@@ -355,21 +366,24 @@ java_handle_t *javastring_new_from_ascii(const char *text)
        int32_t len = strlen(text);
 
        java_handle_t*           h  = builtin_new(class_java_lang_String);
-       java_handle_chararray_t* ca = builtin_newarray_char(len);
+       CharArray ca(len);
 
        /* javastring or character-array could not be created */
 
-       if ((h == NULL) || (ca == NULL))
+       if ((h == NULL) || ca.is_null())
                return NULL;
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        /* copy text */
 
        for (int32_t i = 0; i < len; i++)
-               LLNI_array_direct(ca, i) = text[i];
+               ptr[i] = text[i];
        
        /* set fields of the javastring-object */
 
-       java_lang_String jls(h, ca, len);
+       java_lang_String jls(h, ca.get_handle(), len);
 
        return jls.get_handle();
 }
@@ -392,9 +406,9 @@ char* javastring_tochar(java_handle_t* h)
        if (jls.is_null())
                return (char*) "";
 
-       java_handle_chararray_t* ca = jls.get_value();
+       CharArray ca(jls.get_value());
 
-       if (ca == NULL)
+       if (ca.is_null())
                return (char*) "";
 
        int32_t count  = jls.get_count();
@@ -402,9 +416,12 @@ char* javastring_tochar(java_handle_t* h)
 
        char* buf = MNEW(char, count + 1);
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        int32_t i;
        for (i = 0; i < count; i++)
-               buf[i] = LLNI_array_direct(ca, offset + i);
+               buf[i] = ptr[offset + i];
 
        buf[i] = '\0';
 
@@ -425,15 +442,18 @@ utf *javastring_toutf(java_handle_t *string, bool isclassname)
        if (jls.is_null())
                return utf_null;
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray ca(jls.get_value());
 
-       if (jls.get_value() == NULL)
+       if (ca.is_null())
                return utf_null;
 
        int32_t count  = jls.get_count();
        int32_t offset = jls.get_offset();
 
-       return utf_new_u2(LLNI_array_data(value) + offset, count, isclassname);
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
+       return utf_new_u2(ptr + offset, count, isclassname);
 }
 
 
@@ -446,35 +466,41 @@ utf *javastring_toutf(java_handle_t *string, bool isclassname)
 
 *******************************************************************************/
 
-static java_object_t *literalstring_u2(java_chararray_t *a, int32_t length,
+static java_handle_t *literalstring_u2(java_handle_chararray_t *a, int32_t length,
                                                                           u4 offset, bool copymode)
 {
-    literalstring    *s;                /* hashtable element                  */
-    java_chararray_t *ca;               /* copy of u2-array                   */
-    u4                key;
-    u4                slot;
-    u2                i;
+       literalstring    *s;                /* hashtable element                  */
+       u4                key;
+       u4                slot;
+       u2                i;
 
        mutex->lock();
 
-    /* find location in hashtable */
+       // XXX: Fix me!
+       CharArray ca(a);
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
+       /* find location in hashtable */
 
-    key  = unicode_hashkey(a->data + offset, length);
-    slot = key & (hashtable_string.size - 1);
-    s    = (literalstring*) hashtable_string.ptr[slot];
+       key  = unicode_hashkey(ptr + offset, length);
+       slot = key & (hashtable_string.size - 1);
+       s    = (literalstring*) hashtable_string.ptr[slot];
 
-    while (s) {
+       while (s) {
                // FIXME
                java_lang_String js(LLNI_WRAP(s->string));
 
                if (length == js.get_count()) {
                        /* compare text */
 
-                       for (i = 0; i < length; i++)
+                       for (i = 0; i < length; i++) {
                                // FIXME This is not handle capable!
+                               CharArray jsca(js.get_value());
+                               uint16_t* sptr = (uint16_t*) jsca.get_raw_data_ptr();
                                
-                               if (a->data[offset + i] != ((java_chararray_t*) LLNI_UNWRAP(js.get_value()))->data[i])
+                               if (ptr[offset + i] != sptr[i])
                                        goto nomatch;
+                       }
 
                        /* string already in hashtable, free memory */
 
@@ -483,38 +509,37 @@ static java_object_t *literalstring_u2(java_chararray_t *a, int32_t length,
 
                        mutex->unlock();
 
-                       return (java_object_t*) LLNI_UNWRAP(js.get_handle());
+                       return js.get_handle();
                }
 
        nomatch:
                /* follow link in external hash chain */
                s = s->hashlink;
-    }
+       }
 
-    if (copymode) {
+       java_chararray_t* acopy;
+       if (copymode) {
                /* create copy of u2-array for new javastring */
                u4 arraysize = sizeof(java_chararray_t) + sizeof(u2) * (length - 1) + 10;
-               ca = (java_chararray_t*) mem_alloc(arraysize);
+               acopy = (java_chararray_t*) mem_alloc(arraysize);
 /*             memcpy(ca, a, arraysize); */
-               memcpy(&(ca->header), &(a->header), sizeof(java_array_t));
-               memcpy(&(ca->data), &(a->data) + offset, sizeof(u2) * (length - 1) + 10);
-    }
+               memcpy(&(acopy->header), &(((java_chararray_t*) a)->header), sizeof(java_array_t));
+               memcpy(&(acopy->data), &(((java_chararray_t*) a)->data) + offset, sizeof(u2) * (length - 1) + 10);
+       }
        else {
-               ca = a;
+               acopy = (java_chararray_t*) a;
        }
 
-    /* location in hashtable found, complete arrayheader */
+       /* location in hashtable found, complete arrayheader */
 
-    ca->header.objheader.vftbl = Primitive::get_arrayclass_by_type(ARRAYTYPE_CHAR)->vftbl;
-    ca->header.size            = length;
+       acopy->header.objheader.vftbl = Primitive::get_arrayclass_by_type(ARRAYTYPE_CHAR)->vftbl;
+       acopy->header.size            = length;
 
        assert(class_java_lang_String);
        assert(class_java_lang_String->state & CLASS_LOADED);
 
        // Create a new java.lang.String object on the system heap.
        java_object_t* o = (java_object_t*) MNEW(uint8_t, class_java_lang_String->instancesize);
-       // FIXME
-       java_handle_t* h = LLNI_WRAP(o);
 
 #if defined(ENABLE_STATISTICS)
        if (opt_stat)
@@ -527,8 +552,8 @@ static java_object_t *literalstring_u2(java_chararray_t *a, int32_t length,
 
        o->vftbl = class_java_lang_String->vftbl;
 
-       // FIXME
-       java_lang_String jls(h, LLNI_WRAP(ca), length);
+       CharArray cacopy((java_handle_chararray_t*) acopy);
+       java_lang_String jls(o, cacopy.get_handle(), length);
 
        /* create new literalstring */
 
@@ -603,23 +628,23 @@ static java_object_t *literalstring_u2(java_chararray_t *a, int32_t length,
 
 java_object_t *literalstring_new(utf *u)
 {
-    char             *utf_ptr;       /* pointer to current unicode character  */
+       char             *utf_ptr;       /* pointer to current unicode character  */
                                         /* utf string                            */
-    u4                utflength;     /* length of utf-string if uncompressed  */
-    java_chararray_t *a;             /* u2-array constructed from utf string  */
-    u4                i;
+       u4                utflength;     /* length of utf-string if uncompressed  */
+       java_chararray_t *a;             /* u2-array constructed from utf string  */
+       u4                i;
 
        utf_ptr = u->text;
        utflength = utf_get_number_of_u2s(u);
 
-    /* allocate memory */ 
-    a = (java_chararray_t*) mem_alloc(sizeof(java_chararray_t) + sizeof(u2) * (utflength - 1) + 10);
+       /* allocate memory */ 
+       a = (java_chararray_t*) mem_alloc(sizeof(java_chararray_t) + sizeof(u2) * (utflength - 1) + 10);
 
-    /* convert utf-string to u2-array */
-    for (i = 0; i < utflength; i++)
+       /* convert utf-string to u2-array */
+       for (i = 0; i < utflength; i++)
                a->data[i] = utf_nextu2(&utf_ptr);
 
-    return literalstring_u2(a, utflength, 0, false);
+       return literalstring_u2((java_handle_chararray_t*) a, utflength, 0, false);
 }
 
 
@@ -653,25 +678,20 @@ static void literalstring_free(java_object_t* string)
 
    Intern the given Java string.
 
-   XXX NOTE: Literal Strings are direct references since they are not placed
-   onto the GC-Heap. That's why this function looks so "different".
-
 *******************************************************************************/
 
 java_handle_t *javastring_intern(java_handle_t *string)
 {
        java_lang_String jls(string);
 
-       java_handle_chararray_t* value = jls.get_value();
-       // FIXME
-       java_chararray_t* ca = LLNI_UNWRAP(value); /* XXX see note above */
+       CharArray ca(jls.get_value());
 
        int32_t count  = jls.get_count();
        int32_t offset = jls.get_offset();
 
-       java_object_t* o = literalstring_u2(ca, count, offset, true); /* XXX see note above */
+       java_handle_t* o = literalstring_u2(ca.get_handle(), count, offset, true);
 
-       return LLNI_WRAP(o); /* XXX see note above */
+       return o;
 }
 
 
@@ -685,13 +705,16 @@ void javastring_fprint(java_handle_t *s, FILE *stream)
 {
        java_lang_String jls(s);
 
-       java_handle_chararray_t* value = jls.get_value();
+       CharArray ca(jls.get_value());
 
        int32_t count  = jls.get_count();
        int32_t offset = jls.get_offset();
 
+       // XXX: Fix me!
+       uint16_t* ptr = (uint16_t*) ca.get_raw_data_ptr();
+
        for (int32_t i = offset; i < offset + count; i++) {
-               uint16_t c = LLNI_array_direct(value, i);
+               uint16_t c = ptr[i];
                fputc(c, stream);
        }
 }
index 448e4a7e99992f0a3f506316c970979bf3ffd391..497d75490a2d2f61cf2bba6d2c900b78d2006c17 100644 (file)
@@ -1617,21 +1617,8 @@ void VM::print_run_time_config()
 
 void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
 {
-       char*                      option;
-       char*                      mainname;
-       char*                      p;
-       utf                       *mainutf;
-       classinfo                 *mainclass;
-       java_handle_t             *e;
-       methodinfo                *m;
-       java_handle_objectarray_t *oa; 
-       s4                         oalength;
-       utf                       *u;
-       java_handle_t             *s;
-       int                        status;
-
-       // Prevent compiler warnings.
-       oa = NULL;
+       methodinfo* m;
+       int         status;
 
 #if !defined(NDEBUG)
        if (compileall) {
@@ -1640,9 +1627,9 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
        }
 #endif
 
-       /* Get the main class plus it's arguments. */
+       /* Get the main class or jar file argument. */
 
-       mainname = NULL;
+       char* mainname = NULL;
 
        if (opt_index < vm_args->nOptions) {
                /* Get main-class argument. */
@@ -1653,7 +1640,7 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
                   classpath. */
 
                if (opt_jar == true) {
-                       p = MNEW(char, strlen(mainname) + strlen("0"));
+                       char* p = MNEW(char, strlen(mainname) + strlen("0"));
 
                        strcpy(p, mainname);
 
@@ -1669,22 +1656,9 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
                                        mainname[i] = '/';
                }
 
-               /* Build argument array.  Move index to first argument. */
+               /* Move index to first argument. */
 
                opt_index++;
-
-               oalength = vm_args->nOptions - opt_index;
-
-               oa = builtin_anewarray(oalength, class_java_lang_String);
-
-               for (int i = 0; i < oalength; i++) {
-                       option = vm_args->options[opt_index + i].optionString;
-
-                       u = utf_new_char(option);
-                       s = javastring_new(u);
-
-                       array_objectarray_element_set(oa, i, s);
-               }
        }
 
        /* Do we have a main-class argument? */
@@ -1699,6 +1673,24 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
        }
 #endif
 
+       /* Build argument array. */
+
+       int32_t oalength = vm_args->nOptions - opt_index;
+
+       ObjectArray oa(oalength, class_java_lang_String);
+
+       if (oa.is_null())
+               vm_exit(1);
+
+       for (int i = 0; i < oalength; i++) {
+               char* option = vm_args->options[opt_index + i].optionString;
+
+               utf*           u = utf_new_char(option);
+               java_handle_t* s = javastring_new(u);
+
+               oa.set_element(i, s);
+       }
+
        /* set return value to OK */
 
        status = 0;
@@ -1714,17 +1706,17 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
 
        /* load the main class */
 
-       mainutf = utf_new_char(mainname);
+       utf* mainutf = utf_new_char(mainname);
 
 #if defined(ENABLE_JAVAME_CLDC1_1)
-       mainclass = load_class_bootstrap(mainutf);
+       classinfo* mainclass = load_class_bootstrap(mainutf);
 #else
-       mainclass = load_class_from_sysloader(mainutf);
+       classinfo* mainclass = load_class_from_sysloader(mainutf);
 #endif
 
        /* error loading class */
 
-       e = exceptions_get_and_clear_exception();
+       java_handle_t* e = exceptions_get_and_clear_exception();
 
        if ((e != NULL) || (mainclass == NULL)) {
                exceptions_throw_noclassdeffounderror_cause(e);
@@ -1784,7 +1776,7 @@ void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
 
        /* start the main thread */
 
-       (void) vm_call_method(m, NULL, oa);
+       (void) vm_call_method(m, NULL, oa.get_handle());
 
        /* exception occurred? */