* Removed all Id tags.
[cacao.git] / src / native / jni.c
index 4f015798856a77bf516ea89a759a3603e5888cb6..a28cd68df14fa8481bda0f7a7d8034280a0b197d 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jni.c 8312 2007-08-15 22:10:22Z twisti $
-
 */
 
 
@@ -763,7 +761,7 @@ static void _Jv_jni_CallVoidMethodA(java_handle_t *o, vftbl_t *vftbl,
 *******************************************************************************/
 
 java_handle_t *_Jv_jni_invokeNative(methodinfo *m, java_handle_t *o,
-                                                                       java_objectarray *params)
+                                                                       java_handle_objectarray_t *params)
 {
        methodinfo    *resm;
        java_handle_t *ro;
@@ -799,7 +797,7 @@ java_handle_t *_Jv_jni_invokeNative(methodinfo *m, java_handle_t *o,
        /* check if we got the right number of arguments */
 
        if (((params == NULL) && (paramcount != 0)) ||
-               (params && (params->header.size != paramcount))) 
+               (params && (LLNI_array_size(params) != paramcount))) 
        {
                exceptions_throw_illegalargumentexception();
                return NULL;
@@ -938,12 +936,12 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
        classloader *cl;
        classinfo   *c;
 
-       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d", env, name, loader, buf, bufLen);
+       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d)", env, name, loader, buf, bufLen);
 
        u  = utf_new_char(name);
        cl = (classloader *) loader;
 
-       c = class_define(u, cl, bufLen, (const uint8_t *) buf);
+       c = class_define(u, cl, bufLen, (const uint8_t *) buf, NULL);
 
        return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
 #else
@@ -1028,7 +1026,7 @@ jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
 
        TRACEJNICALLS("_Jv_JNI_GetSuperclass(env=%p, sub=%p)", env, sub);
 
-       c = (classinfo *) sub;
+       c = LLNI_classinfo_unwrap(sub);
 
        if (c == NULL)
                return NULL;
@@ -1095,7 +1093,7 @@ jint _Jv_JNI_ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        if (msg == NULL)
                msg = "";
        s = javastring_new_from_utf_string(msg);
@@ -1406,7 +1404,7 @@ jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz)
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        if ((c->flags & ACC_INTERFACE) || (c->flags & ACC_ABSTRACT)) {
                exceptions_throw_instantiationexception(c);
@@ -1437,7 +1435,7 @@ jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        /* create object */
@@ -1476,7 +1474,7 @@ jobject _Jv_JNI_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        /* create object */
@@ -1513,7 +1511,7 @@ jobject _Jv_JNI_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        /* create object */
@@ -1750,7 +1748,7 @@ jmethodID _Jv_JNI_GetMethodID(JNIEnv* env, jclass clazz, const char *name,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        if (c == NULL)
                return NULL;
@@ -1966,7 +1964,7 @@ type _Jv_JNI_CallNonvirtual##name##Method(JNIEnv *env, jobject obj,         \
        type           ret;                                                     \
                                                                             \
        o = (java_handle_t *) obj;                                              \
-       c = (classinfo *) clazz;                                                \
+       c = LLNI_classinfo_unwrap(clazz);                                       \
        m = (methodinfo *) methodID;                                            \
                                                                             \
        va_start(ap, methodID);                                                 \
@@ -1997,7 +1995,7 @@ type _Jv_JNI_CallNonvirtual##name##MethodV(JNIEnv *env, jobject obj,         \
        type           ret;                                                      \
                                                                              \
        o = (java_handle_t *) obj;                                               \
-       c = (classinfo *) clazz;                                                 \
+       c = LLNI_classinfo_unwrap(clazz);                                        \
        m = (methodinfo *) methodID;                                             \
                                                                              \
        ret = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);                       \
@@ -2045,7 +2043,7 @@ jobject _Jv_JNI_CallNonvirtualObjectMethod(JNIEnv *env, jobject obj,
        va_list        ap;
 
        o = (java_handle_t *) obj;
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        va_start(ap, methodID);
@@ -2066,7 +2064,7 @@ jobject _Jv_JNI_CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj,
        java_handle_t *r;
 
        o = (java_handle_t *) obj;
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args);
@@ -2094,7 +2092,7 @@ void _Jv_JNI_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass clazz,
        va_list        ap;
 
        o = (java_handle_t *) obj;
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        va_start(ap, methodID);
@@ -2111,7 +2109,7 @@ void _Jv_JNI_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass clazz,
        methodinfo    *m;
 
        o = (java_handle_t *) obj;
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        _Jv_jni_CallVoidMethod(o, c->vftbl, m, args);
@@ -2126,7 +2124,7 @@ void _Jv_JNI_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass clazz,
        methodinfo    *m;
 
        o = (java_handle_t *) obj;
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
 
        _Jv_jni_CallVoidMethodA(o, c->vftbl, m, args);
@@ -2154,7 +2152,7 @@ jfieldID _Jv_JNI_GetFieldID(JNIEnv *env, jclass clazz, const char *name,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        /* XXX NPE check? */
 
@@ -2272,7 +2270,7 @@ jmethodID _Jv_JNI_GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        if (!c)
                return NULL;
@@ -2475,7 +2473,7 @@ jfieldID _Jv_JNI_GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        uname = utf_new_char((char *) name);
        usig  = utf_new_char((char *) sig);
@@ -2505,7 +2503,7 @@ type _Jv_JNI_GetStatic##name##Field(JNIEnv *env, jclass clazz, \
                                                                \
        STATISTICS(jniinvokation());                               \
                                                                \
-       c = (classinfo *) clazz;                                   \
+       c = LLNI_classinfo_unwrap(clazz);                          \
        f = (fieldinfo *) fieldID;                                 \
                                                                \
        if (!(c->state & CLASS_INITIALIZED))                       \
@@ -2533,7 +2531,7 @@ jobject _Jv_JNI_GetStaticObjectField(JNIEnv *env, jclass clazz,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        f = (fieldinfo *) fieldID;
 
        if (!(c->state & CLASS_INITIALIZED))
@@ -2561,7 +2559,7 @@ void _Jv_JNI_SetStatic##name##Field(JNIEnv *env, jclass clazz, \
                                                                \
        STATISTICS(jniinvokation());                               \
                                                                \
-       c = (classinfo *) clazz;                                   \
+       c = LLNI_classinfo_unwrap(clazz);                          \
        f = (fieldinfo *) fieldID;                                 \
                                                                \
        if (!(c->state & CLASS_INITIALIZED))                       \
@@ -2589,7 +2587,7 @@ void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
        f = (fieldinfo *) fieldID;
 
        if (!(c->state & CLASS_INITIALIZED))
@@ -2611,9 +2609,9 @@ void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID,
 
 jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len)
 {
-       java_lang_String *s;
-       java_chararray   *a;
-       u4                i;
+       java_lang_String        *s;
+       java_handle_chararray_t *a;
+       u4                       i;
 
        STATISTICS(jniinvokation());
        
@@ -2626,7 +2624,7 @@ jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len)
 
        /* copy text */
        for (i = 0; i < len; i++)
-               a->data[i] = buf[i];
+               LLNI_array_direct(a, i) = buf[i];
 
        LLNI_field_set_ref(s, value , a);
        LLNI_field_set_val(s, offset, 0);
@@ -2664,10 +2662,12 @@ jsize _Jv_JNI_GetStringLength(JNIEnv *env, jstring str)
        
 u2 *javastring_tou2(jstring so) 
 {
-       java_lang_String *s;
-       java_chararray   *a;
-       u2               *stringbuffer;
-       u4                i;
+       java_lang_String        *s;
+       java_handle_chararray_t *a;
+       u2                      *stringbuffer;
+       u4                       i;
+       int32_t                  count;
+       int32_t                  offset;
 
        STATISTICS(jniinvokation());
        
@@ -2681,14 +2681,17 @@ u2 *javastring_tou2(jstring so)
        if (!a)
                return NULL;
 
+       LLNI_field_get_val(s, count, count);
+       LLNI_field_get_val(s, offset, offset);
+
        /* allocate memory */
 
-       stringbuffer = MNEW(u2, LLNI_field_direct(s, count) + 1);
+       stringbuffer = MNEW(u2, count + 1);
 
        /* copy text */
 
-       for (i = 0; i < LLNI_field_direct(s, count); i++)
-               stringbuffer[i] = a->data[LLNI_field_direct(s, offset) + i];
+       for (i = 0; i < count; i++)
+               stringbuffer[i] = LLNI_array_direct(a, offset + i);
        
        /* terminate string */
 
@@ -2773,14 +2776,14 @@ jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes)
 
 jsize _Jv_JNI_GetStringUTFLength(JNIEnv *env, jstring string)
 {   
-    java_lang_String *s;
+       java_lang_String *s;
        s4                length;
 
        TRACEJNICALLS("_Jv_JNI_GetStringUTFLength(env=%p, string=%p)", env, string);
 
        s = (java_lang_String *) string;
 
-    length = u2_utflength(LLNI_field_direct(s, value)->data, LLNI_field_direct(s, count));
+       length = u2_utflength(LLNI_field_direct(s, value)->data, LLNI_field_direct(s, count));
 
        return length;
 }
@@ -2844,13 +2847,16 @@ void _Jv_JNI_ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 
 jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array)
 {
-       java_arrayheader *a;
+       java_handle_t *a;
+       jsize          size;
 
        STATISTICS(jniinvokation());
 
-       a = (java_arrayheader *) array;
+       a = (java_handle_t *) array;
 
-       return a->size;
+       size = LLNI_array_size(a);
+
+       return size;
 }
 
 
@@ -2864,14 +2870,14 @@ 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_objectarray  *oa;
-       s4                 i;
+       classinfo                 *c;
+       java_handle_t             *o;
+       java_handle_objectarray_t *oa;
+       s4                         i;
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) elementClass;
+       c = LLNI_classinfo_unwrap(elementClass);
        o = (java_handle_t *) initialElement;
 
        if (length < 0) {
@@ -2887,7 +2893,7 @@ jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
        /* set all elements to initialElement */
 
        for (i = 0; i < length; i++)
-               oa->data[i] = o;
+               LLNI_objectarray_element_set(oa, i, o);
 
        return (jobjectArray) _Jv_JNI_NewLocalRef(env, (jobject) oa);
 }
@@ -2896,19 +2902,19 @@ jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
 jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
                                                                          jsize index)
 {
-       java_objectarray *oa;
-       java_handle_t    *o;
+       java_handle_objectarray_t *oa;
+       java_handle_t             *o;
 
        STATISTICS(jniinvokation());
 
-       oa = (java_objectarray *) array;
+       oa = (java_handle_objectarray_t *) array;
 
-       if (index >= oa->header.size) {
+       if (index >= LLNI_array_size(oa)) {
                exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
 
-       o = oa->data[index];
+       LLNI_objectarray_element_get(oa, index, o);
 
        return _Jv_JNI_NewLocalRef(env, (jobject) o);
 }
@@ -2917,15 +2923,15 @@ jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
 void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array,
                                                                   jsize index, jobject val)
 {
-       java_objectarray *oa;
-       java_handle_t    *o;
+       java_handle_objectarray_t *oa;
+       java_handle_t             *o;
 
        STATISTICS(jniinvokation());
 
-       oa = (java_objectarray *) array;
+       oa = (java_handle_objectarray_t *) array;
        o  = (java_handle_t *) val;
 
-       if (index >= oa->header.size) {
+       if (index >= LLNI_array_size(oa)) {
                exceptions_throw_arrayindexoutofboundsexception();
                return;
        }
@@ -2936,14 +2942,14 @@ void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array,
        if (!builtin_canstore(oa, o))
                return;
 
-       oa->data[index] = o;
+       LLNI_objectarray_element_set(oa, index, o);
 }
 
 
 #define JNI_NEW_ARRAY(name, type, intern)                \
 type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len)    \
 {                                                        \
-       java_##intern##array *a;                             \
+       java_handle_##intern##array_t *a;                    \
                                                          \
        STATISTICS(jniinvokation());                         \
                                                          \
@@ -2977,16 +2983,16 @@ JNI_NEW_ARRAY(Double,  jdoubleArray,  double)
 type *_Jv_JNI_Get##name##ArrayElements(JNIEnv *env, type##Array array, \
                                                                                 jboolean *isCopy)             \
 {                                                                      \
-       java_##intern##array *a;                                           \
+       java_handle_##intern##array_t *a;                                  \
                                                                        \
        STATISTICS(jniinvokation());                                       \
                                                                        \
-       a = (java_##intern##array *) array;                                \
+       a = (java_handle_##intern##array_t *) array;                       \
                                                                        \
        if (isCopy)                                                        \
                *isCopy = JNI_FALSE;                                           \
                                                                        \
-       return a->data;                                                    \
+       return LLNI_array_data(a);                                         \
 }
 
 JNI_GET_ARRAY_ELEMENTS(Boolean, jboolean, boolean)
@@ -3010,30 +3016,30 @@ JNI_GET_ARRAY_ELEMENTS(Double,  jdouble,  double)
 
 *******************************************************************************/
 
-#define JNI_RELEASE_ARRAY_ELEMENTS(name, type, intern, intern2)           \
-void _Jv_JNI_Release##name##ArrayElements(JNIEnv *env, type##Array array, \
-                                                                                 type *elems, jint mode)         \
-{                                                                         \
-       java_##intern##array *a;                                              \
-                                                                          \
-       STATISTICS(jniinvokation());                                          \
-                                                                          \
-       a = (java_##intern##array *) array;                                   \
-                                                                          \
-       if (elems != a->data) {                                               \
-               switch (mode) {                                                   \
-               case JNI_COMMIT:                                                  \
-                       MCOPY(a->data, elems, intern2, a->header.size);               \
-                       break;                                                        \
-               case 0:                                                           \
-                       MCOPY(a->data, elems, intern2, a->header.size);               \
-                       /* XXX TWISTI how should it be freed? */                      \
-                       break;                                                        \
-               case JNI_ABORT:                                                   \
-                       /* XXX TWISTI how should it be freed? */                      \
-                       break;                                                        \
-               }                                                                 \
-       }                                                                     \
+#define JNI_RELEASE_ARRAY_ELEMENTS(name, type, intern, intern2)            \
+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;                           \
+                                                                           \
+       if (elems != LLNI_array_data(a)) {                                     \
+               switch (mode) {                                                    \
+               case JNI_COMMIT:                                                   \
+                       MCOPY(LLNI_array_data(a), elems, intern2, LLNI_array_size(a)); \
+                       break;                                                         \
+               case 0:                                                            \
+                       MCOPY(LLNI_array_data(a), elems, intern2, LLNI_array_size(a)); \
+                       /* XXX TWISTI how should it be freed? */                       \
+                       break;                                                         \
+               case JNI_ABORT:                                                    \
+                       /* XXX TWISTI how should it be freed? */                       \
+                       break;                                                         \
+               }                                                                  \
+       }                                                                      \
 }
 
 JNI_RELEASE_ARRAY_ELEMENTS(Boolean, jboolean, boolean, u1)
@@ -3053,20 +3059,20 @@ JNI_RELEASE_ARRAY_ELEMENTS(Double,  jdouble,  double,  double)
 
 *******************************************************************************/
 
-#define JNI_GET_ARRAY_REGION(name, type, intern, intern2)              \
-void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array,    \
-                                                                       jsize start, jsize len, type *buf) \
-{                                                                      \
-       java_##intern##array *a;                                           \
-                                                                       \
-       STATISTICS(jniinvokation());                                       \
-                                                                       \
-       a = (java_##intern##array *) array;                                \
-                                                                       \
-       if ((start < 0) || (len < 0) || (start + len > a->header.size))    \
-               exceptions_throw_arrayindexoutofboundsexception();             \
-       else                                                               \
-               MCOPY(buf, &a->data[start], intern2, len);                     \
+#define JNI_GET_ARRAY_REGION(name, type, intern, intern2)               \
+void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array,     \
+                                                                       jsize start, jsize len, type *buf)  \
+{                                                                       \
+       java_handle_##intern##array_t *a;                                   \
+                                                                        \
+       STATISTICS(jniinvokation());                                        \
+                                                                        \
+       a = (java_handle_##intern##array_t *) array;                        \
+                                                                        \
+       if ((start < 0) || (len < 0) || (start + len > LLNI_array_size(a))) \
+               exceptions_throw_arrayindexoutofboundsexception();              \
+       else                                                                \
+               MCOPY(buf, &LLNI_array_direct(a, start), intern2, len);         \
 }
 
 JNI_GET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
@@ -3090,16 +3096,16 @@ 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_##intern##array *a;                                                 \
+       java_handle_##intern##array_t *a;                                        \
                                                                              \
        STATISTICS(jniinvokation());                                             \
                                                                              \
-       a = (java_##intern##array *) array;                                      \
+       a = (java_handle_##intern##array_t *) array;                             \
                                                                              \
-       if ((start < 0) || (len < 0) || (start + len > a->header.size))          \
+       if ((start < 0) || (len < 0) || (start + len > LLNI_array_size(a)))      \
                exceptions_throw_arrayindexoutofboundsexception();                   \
        else                                                                     \
-               MCOPY(&a->data[start], buf, intern2, len);                           \
+               MCOPY(&LLNI_array_direct(a, start), buf, intern2, len);              \
 }
 
 JNI_SET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
@@ -3131,7 +3137,7 @@ jint _Jv_JNI_RegisterNatives(JNIEnv *env, jclass clazz,
 
        STATISTICS(jniinvokation());
 
-       c = (classinfo *) clazz;
+       c = LLNI_classinfo_unwrap(clazz);
 
        /* XXX: if implemented this needs a call to jvmti_NativeMethodBind
        if (jvmti) jvmti_NativeMethodBind(method, address,  new_address_ptr);
@@ -3248,8 +3254,8 @@ jint _Jv_JNI_GetJavaVM(JNIEnv *env, JavaVM **vm)
 void _Jv_JNI_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                                                         jchar *buf)
 {
-       java_lang_String *s;
-       java_chararray   *ca;
+       java_lang_String        *s;
+       java_handle_chararray_t *ca;
 
        STATISTICS(jniinvokation());
 
@@ -3262,7 +3268,7 @@ void _Jv_JNI_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                return;
        }
 
-       MCOPY(buf, &ca->data[start], u2, len);
+       MCOPY(buf, &LLNI_array_direct(ca, start), u2, len);
 }
 
 
@@ -3279,23 +3285,26 @@ void _Jv_JNI_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
 void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
                                                                jsize len, char *buf)
 {
-       java_lang_String *s;
-       java_chararray   *ca;
-       s4                i;
+       java_lang_String        *s;
+       java_handle_chararray_t *ca;
+       s4                       i;
+       int32_t                  count;
+       int32_t                  offset;
 
        TRACEJNICALLS("_Jv_JNI_GetStringUTFRegion(env=%p, str=%p, start=%d, len=%d, buf=%p)", env, str, start, len, buf);
 
        s  = (java_lang_String *) str;
        LLNI_field_get_ref(s, value, ca);
+       LLNI_field_get_val(s, count, count);
+       LLNI_field_get_val(s, offset, offset);
 
-       if ((start < 0) || (len < 0) || (start > LLNI_field_direct(s, count)) ||
-               (start + len > LLNI_field_direct(s, count))) {
+       if ((start < 0) || (len < 0) || (start > count) || (start + len > count)) {
                exceptions_throw_stringindexoutofboundsexception();
                return;
        }
 
        for (i = 0; i < len; i++)
-               buf[i] = ca->data[LLNI_field_direct(s, offset) + start + i];
+               buf[i] = LLNI_array_direct(ca, offset + start + i);
 
        buf[i] = '\0';
 }
@@ -3310,10 +3319,10 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
 void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
                                                                                jboolean *isCopy)
 {
-       java_bytearray *ba;
-       jbyte          *bp;
+       java_handle_bytearray_t *ba;
+       jbyte                   *bp;
 
-       ba = (java_bytearray *) array;
+       ba = (java_handle_bytearray_t *) array;
 
        /* do the same as Kaffe does */