* src/vm/jit/x86_64/md.c (md_signal_handler_sigusr2): Fixed comment.
[cacao.git] / src / vm / string.c
index 9e230fb89842a2788006e416400899b373e3a7de..b6b075175ed7987686ea870dbe702c09edf43712 100644 (file)
@@ -29,8 +29,9 @@
             Andreas Krall
 
    Changes: Christian Thalinger
+                       Edwin Steiner
 
-   $Id: string.c 4874 2006-05-05 14:36:18Z edwin $
+   $Id: string.c 5123 2006-07-12 21:45:34Z twisti $
 
 */
 
 
 #include "mm/memory.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 "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/loader.h"
 #include "vm/options.h"
@@ -60,7 +69,7 @@
 
 hashtable hashtable_string;             /* hashtable for javastrings          */
 
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
 static java_objectheader *lock_hashtable_string;
 #endif
 
@@ -205,14 +214,12 @@ bool string_init(void)
 
        hashtable_create(&hashtable_string, HASHTABLE_STRING_SIZE);
 
-#if defined(USE_THREADS)
+#if defined(ENABLE_THREADS)
        /* create string hashtable lock object */
 
        lock_hashtable_string = NEW(java_objectheader);
 
-# if defined(NATIVE_THREADS)
-       initObjectLock(lock_hashtable_string);
-# endif
+       lock_init_object_lock(lock_hashtable_string);
 #endif
 
        /* everything's ok */
@@ -267,6 +274,77 @@ void stringtable_update(void)
 }
 
 
+/* javastring_new_from_utf_buffer **********************************************
+
+   Create a new object of type java/lang/String with the text from
+   the specified utf8 buffer.
+
+   IN:
+      buffer.......points to first char in the buffer
+         blength......number of bytes to read from the buffer
+
+   RETURN VALUE:
+      the java.lang.String object, or
+      NULL if an exception has been thrown
+
+*******************************************************************************/
+
+java_lang_String *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;
+       u4 i;
+
+       assert(buffer);
+
+       utflength = utf_get_number_of_u2s_for_buffer(buffer,blength);
+
+       s = (java_lang_String *) builtin_new(class_java_lang_String);
+       a = builtin_newarray_char(utflength);
+
+       /* javastring or character-array could not be created */
+       if (!a || !s)
+               return NULL;
+
+       /* decompress utf-string */
+       utf_ptr = buffer;
+       for (i = 0; i < utflength; i++)
+               a->data[i] = utf_nextu2((char **)&utf_ptr);
+       
+       /* set fields of the javastring-object */
+       s->value  = a;
+       s->offset = 0;
+       s->count  = utflength;
+
+       return s;
+}
+
+
+/* javastring_new_from_utf_string **********************************************
+
+   Create a new object of type java/lang/String with the text from
+   the specified zero-terminated utf8 string.
+
+   IN:
+      buffer.......points to first char in the buffer
+         blength......number of bytes to read from the buffer
+
+   RETURN VALUE:
+      the java.lang.String object, or
+      NULL if an exception has been thrown
+
+*******************************************************************************/
+
+java_lang_String *javastring_new_from_utf_string(const char *utfstr)
+{
+       assert(utfstr);
+
+       return javastring_new_from_utf_buffer(utfstr, strlen(utfstr));
+}
+
+
 /* javastring_new **************************************************************
 
    creates a new object of type java/lang/String with the text of 
@@ -451,11 +529,12 @@ char *javastring_tochar(java_objectheader *so)
 
 *******************************************************************************/
 
-utf *javastring_toutf(java_lang_String *string, bool isclassname)
+utf *javastring_toutf(java_lang_String *s, bool isclassname)
 {
-       java_lang_String *str = (java_lang_String *) string;
+       if (s == NULL)
+               return utf_null;
 
-       return utf_new_u2(str->value->data + str->offset, str->count, isclassname);
+       return utf_new_u2(s->value->data + s->offset, s->count, isclassname);
 }
 
 
@@ -467,7 +546,7 @@ utf *javastring_toutf(java_lang_String *string, bool isclassname)
 
 s4 javastring_strlen(java_lang_String *s)
 {
-       if (!s)
+       if (s == NULL)
                return 0;
 
        return s->count;
@@ -493,9 +572,7 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
     u4                slot;
     u2                i;
 
-#if defined(USE_THREADS)
-       builtin_monitorenter(lock_hashtable_string);
-#endif
+       LOCK_MONITOR_ENTER(lock_hashtable_string);
 
     /* find location in hashtable */
 
@@ -518,9 +595,7 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
                        if (!copymode)
                                mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
 
-#if defined(USE_THREADS)
-                       builtin_monitorexit(lock_hashtable_string);
-#endif
+                       LOCK_MONITOR_EXIT(lock_hashtable_string);
 
                        return (java_objectheader *) js;
                }
@@ -548,24 +623,20 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
                primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
     stringdata->header.size = length;
 
-       /* XXX TWISTI: is this necessary? */
-       if (!class_java_lang_String)
-               class_java_lang_String = load_class_bootstrap(utf_java_lang_String);
-
        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_addfirst(&unlinkedclasses, class_java_lang_String);
+               list_add_first(&unlinkedclasses, class_java_lang_String);
 
        /* create new javastring */
 
        js = NEW(java_lang_String);
 
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-       initObjectLock(&js->header);
+#if defined(ENABLE_THREADS)
+       lock_init_object_lock(&js->header);
 #endif
 
        js->header.vftbl = class_java_lang_String->vftbl;
@@ -625,9 +696,7 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
                hashtable_string = newhash;
        }
 
-#if defined(USE_THREADS)
-       builtin_monitorexit(lock_hashtable_string);
-#endif
+       LOCK_MONITOR_EXIT(lock_hashtable_string);
 
        return (java_objectheader *) js;
 }
@@ -695,4 +764,5 @@ void literalstring_free(java_objectheader* sobj)
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */