* src/native/llni.h: Added macros for array handling.
[cacao.git] / src / vm / string.c
index b6b075175ed7987686ea870dbe702c09edf43712..b34e0ad9e48269a1e728cdf455843c17cabbfc23 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/string.c - java.lang.String related functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Reinhard Grafl
-            Roman Obermaisser
-            Andreas Krall
-
-   Changes: Christian Thalinger
-                       Edwin Steiner
-
-   $Id: string.c 5123 2006-07-12 21:45:34Z twisti $
+   $Id: string.c 8318 2007-08-16 10:05:34Z michi $
 
 */
 
 #include "vm/global.h"
 
 #include "mm/memory.h"
+
+#include "native/jni.h"
+#include "native/llni.h"
+
 #include "native/include/java_lang_String.h"
 
-#if defined(ENABLE_THREADS)
-# include "threads/native/lock.h"
-#else
-# include "threads/none/lock.h"
-#endif
+#include "threads/lock-common.h"
 
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
-#include "vm/loader.h"
-#include "vm/options.h"
+#include "vm/primitive.h"
 #include "vm/stringlocal.h"
-#include "vm/utf8.h"
+#include "vm/vm.h"
+
+#include "vmcore/options.h"
+#include "vmcore/statistics.h"
+#include "vmcore/utf8.h"
 
 
 /* global variables ***********************************************************/
 hashtable hashtable_string;             /* hashtable for javastrings          */
 
 #if defined(ENABLE_THREADS)
-static java_objectheader *lock_hashtable_string;
+static java_object_t *lock_hashtable_string;
 #endif
 
 
-/* global string definitions **************************************************/
-
-/* exception/error super class */
-
-const char *string_java_lang_Throwable =
-    "java/lang/Throwable";
-
-const char *string_java_lang_VMThrowable =
-    "java/lang/VMThrowable";
-
-
-/* specify some exception strings for code generation */
-
-const char *string_java_lang_ArithmeticException =
-    "java/lang/ArithmeticException";
-
-const char *string_java_lang_ArithmeticException_message =
-    "/ by zero";
-
-const char *string_java_lang_ArrayIndexOutOfBoundsException =
-    "java/lang/ArrayIndexOutOfBoundsException";
-
-const char *string_java_lang_ArrayStoreException =
-    "java/lang/ArrayStoreException";
-
-const char *string_java_lang_ClassCastException =
-    "java/lang/ClassCastException";
-
-const char *string_java_lang_ClassNotFoundException =
-       "java/lang/ClassNotFoundException";
-
-const char *string_java_lang_CloneNotSupportedException =
-    "java/lang/CloneNotSupportedException";
-
-const char *string_java_lang_Exception =
-    "java/lang/Exception";
-
-const char *string_java_lang_IllegalAccessException =
-    "java/lang/IllegalAccessException";
-
-const char *string_java_lang_IllegalArgumentException =
-    "java/lang/IllegalArgumentException";
-
-const char *string_java_lang_IllegalMonitorStateException =
-    "java/lang/IllegalMonitorStateException";
-
-const char *string_java_lang_IndexOutOfBoundsException =
-    "java/lang/IndexOutOfBoundsException";
-
-const char *string_java_lang_InstantiationException =
-    "java/lang/InstantiationException";
-
-const char *string_java_lang_InterruptedException =
-    "java/lang/InterruptedException";
-
-const char *string_java_lang_NegativeArraySizeException =
-    "java/lang/NegativeArraySizeException";
-
-const char *string_java_lang_NoSuchFieldException =
-       "java/lang/NoSuchFieldException";
-
-const char *string_java_lang_NoSuchMethodException =
-       "java/lang/NoSuchMethodException";
-
-const char *string_java_lang_NullPointerException =
-    "java/lang/NullPointerException";
-
-const char *string_java_lang_StringIndexOutOfBoundsException =
-    "java/lang/StringIndexOutOfBoundsException";
-
-const char *string_java_lang_reflect_InvocationTargetException =
-    "java/lang/reflect/InvocationTargetException";
-
-
-/* specify some error strings for code generation */
-
-const char *string_java_lang_AbstractMethodError =
-    "java/lang/AbstractMethodError";
-
-const char *string_java_lang_ClassCircularityError =
-    "java/lang/ClassCircularityError";
-
-const char *string_java_lang_ClassFormatError =
-    "java/lang/ClassFormatError";
-
-const char *string_java_lang_Error =
-    "java/lang/Error";
-
-const char *string_java_lang_ExceptionInInitializerError =
-    "java/lang/ExceptionInInitializerError";
-
-const char *string_java_lang_IncompatibleClassChangeError =
-    "java/lang/IncompatibleClassChangeError";
-
-const char *string_java_lang_InstantiationError =
-    "java/lang/InstantiationError";
-
-const char *string_java_lang_InternalError =
-    "java/lang/InternalError";
-
-const char *string_java_lang_LinkageError =
-    "java/lang/LinkageError";
-
-const char *string_java_lang_NoClassDefFoundError =
-    "java/lang/NoClassDefFoundError";
-
-const char *string_java_lang_NoSuchFieldError =
-       "java/lang/NoSuchFieldError";
-
-const char *string_java_lang_NoSuchMethodError =
-       "java/lang/NoSuchMethodError";
-
-const char *string_java_lang_OutOfMemoryError =
-    "java/lang/OutOfMemoryError";
-
-const char *string_java_lang_UnsatisfiedLinkError =
-    "java/lang/UnsatisfiedLinkError";
-
-const char *string_java_lang_UnsupportedClassVersionError =
-    "java/lang/UnsupportedClassVersionError";
-
-const char *string_java_lang_VerifyError =
-    "java/lang/VerifyError";
-
-const char *string_java_lang_VirtualMachineError =
-    "java/lang/VirtualMachineError";
-
-
 /* string_init *****************************************************************
 
    Initialize the string hashtable lock.
@@ -217,9 +83,9 @@ bool string_init(void)
 #if defined(ENABLE_THREADS)
        /* create string hashtable lock object */
 
-       lock_hashtable_string = NEW(java_objectheader);
+       lock_hashtable_string = NEW(java_object_t);
 
-       lock_init_object_lock(lock_hashtable_string);
+       LOCK_INIT_OBJECT_LOCK(lock_hashtable_string);
 #endif
 
        /* everything's ok */
@@ -238,25 +104,24 @@ bool string_init(void)
  
 void stringtable_update(void)
 {
-       java_lang_String *js;   
-       java_chararray *a;
-       literalstring *s;       /* hashtable entry */
+       java_lang_String *js;
+       java_chararray_t *a;
+       literalstring    *s;       /* hashtable entry */
        int i;
 
        for (i = 0; i < hashtable_string.size; i++) {
                s = hashtable_string.ptr[i];
                if (s) {
                        while (s) {
-                                                               
                                js = (java_lang_String *) s->string;
                                
-                               if (!js || !js->value) {
+                               if ((js == NULL) || (js->value == NULL)) {
                                        /* error in hashtable found */
-                                       log_text("invalid literalstring in hashtable");
-                                       assert(0);
+
+                                       vm_abort("stringtable_update: invalid literalstring in hashtable");
                                }
 
-                               a = js->value;
+                               LLNI_field_get_ref(js, value, a);
 
                                if (!js->header.vftbl) 
                                        /* vftbl of javastring is NULL */ 
@@ -264,7 +129,8 @@ void stringtable_update(void)
 
                                if (!a->header.objheader.vftbl) 
                                        /* vftbl of character-array is NULL */ 
-                                       a->header.objheader.vftbl = primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
+                                       a->header.objheader.vftbl =
+                                               primitive_arrayclass_get_by_type(ARRAYTYPE_CHAR)->vftbl;
 
                                /* follow link in external hash chain */
                                s = s->hashlink;
@@ -289,36 +155,104 @@ void stringtable_update(void)
 
 *******************************************************************************/
 
-java_lang_String *javastring_new_from_utf_buffer(const char *buffer, u4 blength)
+static java_handle_t *javastring_new_from_utf_buffer(const char *buffer,
+                                                                                                                u4 blength)
 {
        const char *utf_ptr;            /* current utf character in utf string    */
        u4 utflength;                   /* length of utf-string if uncompressed   */
-       java_lang_String *s;            /* result-string                          */
-       java_chararray *a;
+       java_handle_t     *o;
+       java_lang_String  *s;           /* result-string                          */
+       java_handle_chararray_t *a;
        u4 i;
 
        assert(buffer);
 
        utflength = utf_get_number_of_u2s_for_buffer(buffer,blength);
 
-       s = (java_lang_String *) builtin_new(class_java_lang_String);
+       o = builtin_new(class_java_lang_String);
        a = builtin_newarray_char(utflength);
 
        /* javastring or character-array could not be created */
-       if (!a || !s)
+
+       if ((o == NULL) || (a == NULL))
                return NULL;
 
        /* decompress utf-string */
+
        utf_ptr = buffer;
+
        for (i = 0; i < utflength; i++)
-               a->data[i] = utf_nextu2((char **)&utf_ptr);
+               LLNI_array_direct(a, i) = utf_nextu2((char **) &utf_ptr);
        
        /* set fields of the javastring-object */
-       s->value  = a;
-       s->offset = 0;
-       s->count  = utflength;
 
-       return s;
+       s = (java_lang_String *) o;
+
+       LLNI_field_set_ref(s, value , a);
+       LLNI_field_set_val(s, offset, 0);
+       LLNI_field_set_val(s, count , utflength);
+
+       return o;
+}
+
+
+/* javastring_safe_new_from_utf8 ***********************************************
+
+   Create a new object of type java/lang/String with the text from
+   the specified UTF-8 string. This function is safe for invalid UTF-8.
+   (Invalid characters will be replaced by U+fffd.)
+
+   IN:
+      text.........the UTF-8 string, zero-terminated.
+
+   RETURN VALUE:
+      the java.lang.String object, or
+      NULL if an exception has been thrown
+
+*******************************************************************************/
+
+java_handle_t *javastring_safe_new_from_utf8(const char *text)
+{
+       java_handle_t           *o;
+       java_handle_chararray_t *a;
+       java_lang_String        *s;
+       s4 nbytes;
+       s4 len;
+
+       assert(text);
+
+       /* Get number of bytes. We need this to completely emulate the messy */
+       /* behaviour of the RI. :(                                           */
+
+       nbytes = strlen(text);
+
+       /* calculate number of Java characters */
+
+       len = utf8_safe_number_of_u2s(text, nbytes);
+
+       /* allocate the String object and the char array */
+
+       o = builtin_new(class_java_lang_String);
+       a = builtin_newarray_char(len);
+
+       /* javastring or character-array could not be created? */
+
+       if ((o == NULL) || (a == NULL))
+               return NULL;
+
+       /* decompress UTF-8 string */
+
+       utf8_safe_convert_to_u2s(text, nbytes, a->data);
+
+       /* set fields of the String object */
+
+       s = (java_lang_String *) o;
+
+       LLNI_field_set_ref(s, value , a);
+       LLNI_field_set_val(s, offset, 0);
+       LLNI_field_set_val(s, count , len);
+
+       return o;
 }
 
 
@@ -337,7 +271,7 @@ java_lang_String *javastring_new_from_utf_buffer(const char *buffer, u4 blength)
 
 *******************************************************************************/
 
-java_lang_String *javastring_new_from_utf_string(const char *utfstr)
+java_handle_t *javastring_new_from_utf_string(const char *utfstr)
 {
        assert(utfstr);
 
@@ -354,15 +288,16 @@ java_lang_String *javastring_new_from_utf_string(const char *utfstr)
 
 *******************************************************************************/
 
-java_lang_String *javastring_new(utf *u)
+java_handle_t *javastring_new(utf *u)
 {
        char *utf_ptr;                  /* current utf character in utf string    */
        u4 utflength;                   /* length of utf-string if uncompressed   */
-       java_lang_String *s;            /* result-string                          */
-       java_chararray *a;
+       java_handle_t           *o;
+       java_handle_chararray_t *a;
+       java_lang_String        *s;
        s4 i;
 
-       if (!u) {
+       if (u == NULL) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
@@ -370,25 +305,31 @@ java_lang_String *javastring_new(utf *u)
        utf_ptr = u->text;
        utflength = utf_get_number_of_u2s(u);
 
-       s = (java_lang_String *) builtin_new(class_java_lang_String);
+       o = builtin_new(class_java_lang_String);
        a = builtin_newarray_char(utflength);
 
        /* javastring or character-array could not be created */
-       if (!a || !s)
+
+       if ((o == NULL) || (a == NULL))
                return NULL;
 
        /* decompress utf-string */
+
        for (i = 0; i < utflength; i++)
-               a->data[i] = utf_nextu2(&utf_ptr);
+               LLNI_array_direct(a, i) = utf_nextu2(&utf_ptr);
        
        /* set fields of the javastring-object */
-       s->value  = a;
-       s->offset = 0;
-       s->count  = utflength;
 
-       return s;
+       s = (java_lang_String *) o;
+
+       LLNI_field_set_ref(s, value , a);
+       LLNI_field_set_val(s, offset, 0);
+       LLNI_field_set_val(s, count , utflength);
+
+       return o;
 }
 
+
 /* javastring_new_slash_to_dot *************************************************
 
    creates a new object of type java/lang/String with the text of 
@@ -398,16 +339,17 @@ java_lang_String *javastring_new(utf *u)
 
 *******************************************************************************/
 
-java_lang_String *javastring_new_slash_to_dot(utf *u)
+java_handle_t *javastring_new_slash_to_dot(utf *u)
 {
        char *utf_ptr;                  /* current utf character in utf string    */
        u4 utflength;                   /* length of utf-string if uncompressed   */
-       java_lang_String *s;            /* result-string                          */
-       java_chararray *a;
+       java_handle_t           *o;
+       java_handle_chararray_t *a;
+       java_lang_String        *s;
        s4 i;
        u2 ch;
 
-       if (!u) {
+       if (u == NULL) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
@@ -415,27 +357,31 @@ java_lang_String *javastring_new_slash_to_dot(utf *u)
        utf_ptr = u->text;
        utflength = utf_get_number_of_u2s(u);
 
-       s = (java_lang_String *) builtin_new(class_java_lang_String);
+       o = builtin_new(class_java_lang_String);
        a = builtin_newarray_char(utflength);
 
        /* javastring or character-array could not be created */
-       if (!a || !s)
+       if ((o == NULL) || (a == NULL))
                return NULL;
 
        /* decompress utf-string */
+
        for (i = 0; i < utflength; i++) {
                ch = utf_nextu2(&utf_ptr);
                if (ch == '/')
                        ch = '.';
-               a->data[i] = ch;
+               LLNI_array_direct(a, i) = ch;
        }
        
        /* set fields of the javastring-object */
-       s->value  = a;
-       s->offset = 0;
-       s->count  = utflength;
 
-       return s;
+       s = (java_lang_String *) o;
+
+       LLNI_field_set_ref(s, value , a);
+       LLNI_field_set_val(s, offset, 0);
+       LLNI_field_set_val(s, count , utflength);
+
+       return o;
 }
 
 
@@ -453,37 +399,43 @@ java_lang_String *javastring_new_slash_to_dot(utf *u)
 
 *******************************************************************************/
 
-java_lang_String *javastring_new_from_ascii(const char *text)
+java_handle_t *javastring_new_from_ascii(const char *text)
 {
        s4 i;
        s4 len;                             /* length of the string               */
-       java_lang_String *s;                /* result-string                      */
-       java_chararray *a;
+       java_handle_t           *o;
+       java_lang_String        *s;
+       java_handle_chararray_t *a;
 
-       if (!text) {
+       if (text == NULL) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
 
        len = strlen(text);
 
-       s = (java_lang_String *) builtin_new(class_java_lang_String);
+       o = builtin_new(class_java_lang_String);
        a = builtin_newarray_char(len);
 
        /* javastring or character-array could not be created */
-       if (!a || !s)
+
+       if ((o == NULL) || (a == NULL))
                return NULL;
 
        /* copy text */
+
        for (i = 0; i < len; i++)
-               a->data[i] = text[i];
+               LLNI_array_direct(a, i) = text[i];
        
        /* set fields of the javastring-object */
-       s->value  = a;
-       s->offset = 0;
-       s->count  = len;
 
-       return s;
+       s = (java_lang_String *) o;
+
+       LLNI_field_set_ref(s, value , a);
+       LLNI_field_set_val(s, offset, 0);
+       LLNI_field_set_val(s, count , len);
+
+       return o;
 }
 
 
@@ -497,25 +449,25 @@ java_lang_String *javastring_new_from_ascii(const char *text)
        
 *******************************************************************************/
 
-char *javastring_tochar(java_objectheader *so) 
+char *javastring_tochar(java_handle_t *so) 
 {
-       java_lang_String *s = (java_lang_String *) so;
-       java_chararray *a;
+       java_lang_String        *s = (java_lang_String *) so;
+       java_handle_chararray_t *a;
        char *buf;
        s4 i;
        
        if (!s)
                return "";
 
-       a = s->value;
+       LLNI_field_get_ref(s, value, a);
 
        if (!a)
                return "";
 
-       buf = MNEW(char, s->count + 1);
+       buf = MNEW(char, LLNI_field_direct(s, count) + 1);
 
-       for (i = 0; i < s->count; i++)
-               buf[i] = a->data[s->offset + i];
+       for (i = 0; i < LLNI_field_direct(s, count); i++)
+               buf[i] = a->data[LLNI_field_direct(s, offset) + i];
 
        buf[i] = '\0';
 
@@ -529,27 +481,16 @@ char *javastring_tochar(java_objectheader *so)
 
 *******************************************************************************/
 
-utf *javastring_toutf(java_lang_String *s, bool isclassname)
+utf *javastring_toutf(java_handle_t *string, bool isclassname)
 {
-       if (s == NULL)
-               return utf_null;
-
-       return utf_new_u2(s->value->data + s->offset, s->count, isclassname);
-}
-
-
-/* javastring_strlen ***********************************************************
+       java_lang_String *s;
 
-   Returns the length of the Java string.
-       
-*******************************************************************************/
+       s = (java_lang_String *) string;
 
-s4 javastring_strlen(java_lang_String *s)
-{
        if (s == NULL)
-               return 0;
+               return utf_null;
 
-       return s->count;
+       return utf_new_u2(LLNI_field_direct(s, value)->data + LLNI_field_direct(s, offset), LLNI_field_direct(s, count), isclassname);
 }
 
 
@@ -562,12 +503,12 @@ s4 javastring_strlen(java_lang_String *s)
 
 *******************************************************************************/
 
-java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
-                                                                       bool copymode)
+java_object_t *literalstring_u2(java_chararray_t *a, u4 length, u4 offset,
+                                                               bool copymode)
 {
     literalstring    *s;                /* hashtable element                  */
     java_lang_String *js;               /* u2-array wrapped in javastring     */
-    java_chararray   *stringdata;       /* copy of u2-array                   */
+    java_chararray_t *ca;               /* copy of u2-array                   */
     u4                key;
     u4                slot;
     u2                i;
@@ -593,11 +534,11 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
                        /* string already in hashtable, free memory */
 
                        if (!copymode)
-                               mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
+                               mem_free(a, sizeof(java_chararray_t) + sizeof(u2) * (length - 1) + 10);
 
                        LOCK_MONITOR_EXIT(lock_hashtable_string);
 
-                       return (java_objectheader *) js;
+                       return (java_object_t *) js;
                }
 
        nomatch:
@@ -607,48 +548,54 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 
     if (copymode) {
                /* create copy of u2-array for new javastring */
-               u4 arraysize = sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10;
-               stringdata = mem_alloc(arraysize);
-/*             memcpy(stringdata, a, arraysize); */
-               memcpy(&(stringdata->header), &(a->header), sizeof(java_arrayheader));
-               memcpy(&(stringdata->data), &(a->data) + offset, sizeof(u2) * (length - 1) + 10);
+               u4 arraysize = sizeof(java_chararray_t) + sizeof(u2) * (length - 1) + 10;
+               ca = 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);
 
     } else {
-               stringdata = a;
+               ca = a;
        }
 
     /* location in hashtable found, complete arrayheader */
 
-    stringdata->header.objheader.vftbl =
-               primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
-    stringdata->header.size = length;
+    ca->header.objheader.vftbl =
+               primitive_arrayclass_get_by_type(ARRAYTYPE_CHAR)->vftbl;
+    ca->header.size            = length;
 
        assert(class_java_lang_String);
        assert(class_java_lang_String->state & CLASS_LOADED);
 
-       /* if we use eager loading, we have to check loaded String class */
-
-       if (opt_eager)
-               list_add_first(&unlinkedclasses, class_java_lang_String);
-
        /* create new javastring */
 
        js = NEW(java_lang_String);
 
+#if defined(ENABLE_STATISTICS)
+       if (opt_stat)
+               size_string += sizeof(java_lang_String);
+#endif
+
 #if defined(ENABLE_THREADS)
        lock_init_object_lock(&js->header);
 #endif
 
        js->header.vftbl = class_java_lang_String->vftbl;
-       js->value  = stringdata;
+       js->value  = ca;
        js->offset = 0;
        js->count  = length;
 
        /* create new literalstring */
 
        s = NEW(literalstring);
+
+#if defined(ENABLE_STATISTICS)
+       if (opt_stat)
+               size_string += sizeof(literalstring);
+#endif
+
        s->hashlink = hashtable_string.ptr[slot];
-       s->string   = (java_objectheader *) js;
+       s->string   = (java_object_t *) js;
        hashtable_string.ptr[slot] = s;
 
        /* update number of hashtable entries */
@@ -698,7 +645,7 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 
        LOCK_MONITOR_EXIT(lock_hashtable_string);
 
-       return (java_objectheader *) js;
+       return (java_object_t *) js;
 }
 
 
@@ -709,19 +656,19 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 
 *******************************************************************************/
 
-java_objectheader *literalstring_new(utf *u)
+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 *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 = mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
+    a = mem_alloc(sizeof(java_chararray_t) + sizeof(u2) * (utflength - 1) + 10);
 
     /* convert utf-string to u2-array */
     for (i = 0; i < utflength; i++)
@@ -737,19 +684,19 @@ java_objectheader *literalstring_new(utf *u)
 
 *******************************************************************************/
 
-void literalstring_free(java_objectheader* sobj)
+void literalstring_free(java_object_t* string)
 {
        java_lang_String *s;
-       java_chararray *a;
+       java_chararray_t *a;
 
-       s = (java_lang_String *) sobj;
+       s = (java_lang_String *) string;
        a = s->value;
 
        /* dispose memory of java.lang.String object */
        FREE(s, java_lang_String);
 
        /* dispose memory of java-characterarray */
-       FREE(a, sizeof(java_chararray) + sizeof(u2) * (a->header.size - 1)); /* +10 ?? */
+       FREE(a, sizeof(java_chararray_t) + sizeof(u2) * (a->header.size - 1)); /* +10 ?? */
 }