* literalstring_u2: Bugfix when reorganizing the string hashtable, the
[cacao.git] / src / vm / class.c
index c5114f615773f64dccaed884082acdb17ed32009..394da80f6b44157e0046e3590feb2fd8d8ba7029 100644 (file)
@@ -30,7 +30,7 @@
             Andreas Krall
             Christian Thalinger
 
-   $Id: class.c 2523 2005-05-23 18:13:52Z edwin $
+   $Id: class.c 3292 2005-09-28 10:36:34Z twisti $
 
 */
 
@@ -93,7 +93,9 @@ classinfo *class_java_lang_Cloneable = NULL;
 classinfo *class_java_lang_SecurityManager = NULL;
 classinfo *class_java_lang_String = NULL;
 classinfo *class_java_lang_System = NULL;
+classinfo *class_java_lang_Thread = NULL;
 classinfo *class_java_lang_ThreadGroup = NULL;
+classinfo *class_java_lang_VMThread = NULL;
 classinfo *class_java_io_Serializable = NULL;
 
 
@@ -118,12 +120,18 @@ classinfo *class_java_lang_Long = NULL;
 classinfo *class_java_lang_Float = NULL;
 classinfo *class_java_lang_Double = NULL;
 
+
 /* some classes which may be used more often */
 
-classinfo *class_java_util_Vector = NULL;
+classinfo *class_java_lang_StackTraceElement = NULL;
 classinfo *class_java_lang_reflect_Constructor = NULL;
+classinfo *class_java_lang_reflect_Field = NULL;
 classinfo *class_java_lang_reflect_Method = NULL;
-classinfo *arrayclass_java_lang_Object=NULL;
+classinfo *class_java_security_PrivilegedAction = NULL;
+classinfo *class_java_util_Vector = NULL;
+
+classinfo *arrayclass_java_lang_Object = NULL;
+
 
 /* pseudo classes for the typechecker */
 
@@ -131,6 +139,7 @@ classinfo *pseudo_class_Arraystub = NULL;
 classinfo *pseudo_class_Null = NULL;
 classinfo *pseudo_class_New = NULL;
 
+
 /* class_set_packagename *******************************************************
 
    Derive the package name from the class name and store it in the struct.
@@ -139,24 +148,33 @@ classinfo *pseudo_class_New = NULL;
 
 void class_set_packagename(classinfo *c)
 {
+       char *p = UTF_END(c->name) - 1;
+       char *start = c->name->text;
+
+       /* set the package name */
+       /* classes in the unnamed package keep packagename == NULL */
+
        if (c->name->text[0] == '[') {
-               /* Array classes are not loaded from classfiles. */
-               c->packagename = array_packagename;
-       } 
-       else {
-               /* Find the package name */
-               /* Classes in the unnamed package keep packagename == NULL. */
-               char *p = utf_end(c->name) - 1;
-               char *start = c->name->text;
-               for (;p > start; --p) {
-                       if (*p == '/') {
-                               c->packagename = utf_new(start, p - start);
-                               break;
-                       }
-               }
+               /* set packagename of arrays to the element's package */
+
+               for (; *start == '['; start++);
+
+               /* skip the 'L' in arrays of references */
+               if (*start == 'L')
+                       start++;
+
+               for (; (p > start) && (*p != '/'); --p);
+
+               c->packagename = utf_new(start, p - start);
+
+       } else {
+               for (; (p > start) && (*p != '/'); --p);
+
+               c->packagename = utf_new(start, p - start);
        }
 }
 
+
 /* class_create_classinfo ******************************************************
 
    Create a new classinfo struct. The class name is set to the given utf *,
@@ -413,7 +431,8 @@ static classinfo *get_array_class(utf *name,java_objectheader *initloader,
        if (!c) {
                /* we have to create it */
                c = class_create_classinfo(name);
-               if (!load_newly_created_array(c,initloader))
+               c = load_newly_created_array(c,initloader);
+               if (c == NULL)
                        return NULL;
        }
 
@@ -594,6 +613,25 @@ constant_classref *class_get_classref(classinfo *cls, utf *name)
 }
 
 
+/* class_get_self_classref *****************************************************
+
+   Returns the constant_classref to the class itself.
+
+   IN:
+       cls..............the class containing the reference
+
+   RETURN VALUE:
+       a pointer to a constant_classref (never NULL)
+
+*******************************************************************************/
+
+constant_classref *class_get_self_classref(classinfo *cls)
+{
+       /* XXX this should be done in a faster way. Maybe always make */
+       /* the classref of index 0 a self reference.                  */
+       return class_get_classref(cls,cls->name);
+}
+
 /* class_get_classref_multiarray_of ********************************************
 
    Returns an array type reference with the given dimension and element class