X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fstring.c;h=b6b075175ed7987686ea870dbe702c09edf43712;hb=3cfa439ea243f2e8d9dcf8687cb5294d1170a515;hp=306c50bbc89399df0c971809f875d8b969e8e8fc;hpb=d8572646e8104542a3e010813242b450194ec160;p=cacao.git diff --git a/src/vm/string.c b/src/vm/string.c index 306c50bbc..b6b075175 100644 --- a/src/vm/string.c +++ b/src/vm/string.c @@ -1,9 +1,9 @@ /* src/vm/string.c - java.lang.String related functions - Copyright (C) 1996-2005 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 + Copyright (C) 1996-2005, 2006 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 This file is part of CACAO. @@ -19,31 +19,41 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - Contact: cacao@complang.tuwien.ac.at + Contact: cacao@cacaojvm.org Authors: Reinhard Grafl Roman Obermaisser Andreas Krall Changes: Christian Thalinger + Edwin Steiner - $Id: string.c 3832 2005-12-01 23:19:29Z twisti $ + $Id: string.c 5123 2006-07-12 21:45:34Z twisti $ */ +#include "config.h" + #include -#include "config.h" #include "vm/types.h" #include "vm/global.h" #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" @@ -59,7 +69,7 @@ hashtable hashtable_string; /* hashtable for javastrings */ -#if defined(USE_THREADS) +#if defined(ENABLE_THREADS) static java_objectheader *lock_hashtable_string; #endif @@ -131,6 +141,9 @@ const char *string_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"; @@ -201,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 */ @@ -263,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 @@ -281,12 +363,12 @@ java_lang_String *javastring_new(utf *u) s4 i; if (!u) { - *exceptionptr = new_nullpointerexception(); + exceptions_throw_nullpointerexception(); return NULL; } utf_ptr = u->text; - utflength = utf_strlen(u); + utflength = utf_get_number_of_u2s(u); s = (java_lang_String *) builtin_new(class_java_lang_String); a = builtin_newarray_char(utflength); @@ -326,12 +408,12 @@ java_lang_String *javastring_new_slash_to_dot(utf *u) u2 ch; if (!u) { - *exceptionptr = new_nullpointerexception(); + exceptions_throw_nullpointerexception(); return NULL; } utf_ptr = u->text; - utflength = utf_strlen(u); + utflength = utf_get_number_of_u2s(u); s = (java_lang_String *) builtin_new(class_java_lang_String); a = builtin_newarray_char(utflength); @@ -357,16 +439,21 @@ java_lang_String *javastring_new_slash_to_dot(utf *u) } -/* javastring_new_char ********************************************************* +/* javastring_new_from_ascii *************************************************** + + creates a new java/lang/String object which contains the given ASCII + C-string converted to UTF-16. - creates a new java/lang/String object which contains the convertet - C-string passed via text. + IN: + text.........string of ASCII characters - return: the object pointer or NULL if memory is exhausted. + RETURN VALUE: + the java.lang.String object, or + NULL if an exception has been thrown. *******************************************************************************/ -java_lang_String *javastring_new_char(const char *text) +java_lang_String *javastring_new_from_ascii(const char *text) { s4 i; s4 len; /* length of the string */ @@ -374,7 +461,7 @@ java_lang_String *javastring_new_char(const char *text) java_chararray *a; if (!text) { - *exceptionptr = new_nullpointerexception(); + exceptions_throw_nullpointerexception(); return NULL; } @@ -442,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); } @@ -456,11 +544,9 @@ utf *javastring_toutf(java_lang_String *string, bool isclassname) *******************************************************************************/ -s4 javastring_strlen(java_objectheader *so) +s4 javastring_strlen(java_lang_String *s) { - java_lang_String *s = (java_lang_String *) so; - - if (!s) + if (s == NULL) return 0; return s->count; @@ -486,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 */ @@ -511,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; } @@ -541,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->loaded); + 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; @@ -618,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; } @@ -642,7 +718,7 @@ java_objectheader *literalstring_new(utf *u) u4 i; utf_ptr = u->text; - utflength = utf_strlen(u); + utflength = utf_get_number_of_u2s(u); /* allocate memory */ a = mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10); @@ -688,4 +764,5 @@ void literalstring_free(java_objectheader* sobj) * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */