* src/vm/jit/i386/codegen.cn (codegen): Use the new functions for
[cacao.git] / src / vm / class.c
index 93be8377ffc395bb3a28dfc16a8778d8c2c018fa..50b6fd24fa48fa450de1c7f49fc705b732a53e83 100644 (file)
@@ -31,7 +31,7 @@
             Christian Thalinger
                        Edwin Steiner
 
-   $Id: class.c 4957 2006-05-26 11:48:10Z edwin $
+   $Id: class.c 6033 2006-11-21 16:56:56Z michi $
 
 */
 
 #include "vm/utf8.h"
 
 
-/******************************************************************************/
-/* DEBUG HELPERS                                                              */
-/******************************************************************************/
-
-#ifndef NDEBUG
-#define CLASS_DEBUG
-#endif
-
-#ifdef CLASS_DEBUG
-#define CLASS_ASSERT(cond)  assert(cond)
-#else
-#define CLASS_ASSERT(cond)
-#endif
-
-
 /* global variables ***********************************************************/
 
 list unlinkedclasses;                   /* this is only used for eager class  */
@@ -97,6 +82,7 @@ classinfo *class_java_lang_String;
 classinfo *class_java_lang_System;
 classinfo *class_java_lang_Thread;
 classinfo *class_java_lang_ThreadGroup;
+classinfo *class_java_lang_VMSystem;
 classinfo *class_java_lang_VMThread;
 classinfo *class_java_io_Serializable;
 
@@ -106,12 +92,14 @@ classinfo *class_java_io_Serializable;
 classinfo *class_java_lang_Throwable;
 classinfo *class_java_lang_VMThrowable;
 classinfo *class_java_lang_Error;
-classinfo *class_java_lang_NoClassDefFoundError;
+classinfo *class_java_lang_AbstractMethodError;
 classinfo *class_java_lang_LinkageError;
+classinfo *class_java_lang_NoClassDefFoundError;
 classinfo *class_java_lang_NoSuchMethodError;
 classinfo *class_java_lang_OutOfMemoryError;
 
 classinfo *class_java_lang_Exception;
+classinfo *class_java_lang_ClassCastException;
 classinfo *class_java_lang_ClassNotFoundException;
 classinfo *class_java_lang_IllegalArgumentException;
 classinfo *class_java_lang_IllegalMonitorStateException;
@@ -203,7 +191,7 @@ classinfo *class_create_classinfo(utf *classname)
 
 #if defined(ENABLE_STATISTICS)
        if (opt_stat)
-               count_class_infos += sizeof(classinfo);
+               size_classinfo += sizeof(classinfo);
 #endif
 
        /* we use a safe name for temporarily unnamed classes */
@@ -396,7 +384,9 @@ void class_free(classinfo *c)
        if (c->fields) {
                for (i = 0; i < c->fieldscount; i++)
                        field_free(&(c->fields[i]));
-/*     MFREE(c->fields, fieldinfo, c->fieldscount); */
+#if defined(ENABLE_CACAO_GC)
+               MFREE(c->fields, fieldinfo, c->fieldscount);
+#endif
        }
        
        if (c->methods) {
@@ -459,15 +449,15 @@ static classinfo *get_array_class(utf *name,java_objectheader *initloader,
                        return NULL;
        }
 
-       CLASS_ASSERT(c);
-       CLASS_ASSERT(c->state & CLASS_LOADED);
-       CLASS_ASSERT(c->classloader == defloader);
+       assert(c);
+       assert(c->state & CLASS_LOADED);
+       assert(c->classloader == defloader);
 
        if (link && !(c->state & CLASS_LINKED))
                if (!link_class(c))
                        return NULL;
 
-       CLASS_ASSERT(!link || (c->state & CLASS_LINKED));
+       assert(!link || (c->state & CLASS_LINKED));
 
        return c;
 }
@@ -484,6 +474,10 @@ classinfo *class_array_of(classinfo *component, bool link)
 {
     s4 namelen;
     char *namebuf;
+       s4 dumpsize;
+       classinfo *c;
+
+       dumpsize = dump_size();
 
     /* Assemble the array class name */
     namelen = component->name->blength;
@@ -505,10 +499,14 @@ classinfo *class_array_of(classinfo *component, bool link)
         namelen += 3;
     }
 
-       return get_array_class(utf_new(namebuf, namelen),
-                                                  component->classloader,
-                                                  component->classloader,
-                                                  link);
+       c = get_array_class(utf_new(namebuf, namelen),
+                                               component->classloader,
+                                               component->classloader,
+                                               link);
+
+       dump_release(dumpsize);
+
+       return c;
 }
 
 
@@ -523,6 +521,10 @@ classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
 {
     s4 namelen;
     char *namebuf;
+       s4 dumpsize;
+       classinfo *c;
+
+       dumpsize = dump_size();
 
        if (dim < 1) {
                log_text("Invalid array dimension requested");
@@ -548,10 +550,14 @@ classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
     }
        memset(namebuf, '[', dim);
 
-       return get_array_class(utf_new(namebuf, namelen),
-                                                  element->classloader,
-                                                  element->classloader,
-                                                  link);
+       c = get_array_class(utf_new(namebuf, namelen),
+                                               element->classloader,
+                                               element->classloader,
+                                               link);
+
+       dump_release(dumpsize);
+
+       return c;
 }
 
 
@@ -576,9 +582,9 @@ constant_classref *class_lookup_classref(classinfo *cls, utf *name)
        extra_classref *xref;
        int count;
 
-       CLASS_ASSERT(cls);
-       CLASS_ASSERT(name);
-       CLASS_ASSERT(!cls->classrefcount || cls->classrefs);
+       assert(cls);
+       assert(name);
+       assert(!cls->classrefcount || cls->classrefs);
        
        /* first search the main classref table */
        count = cls->classrefcount;
@@ -619,8 +625,8 @@ constant_classref *class_get_classref(classinfo *cls, utf *name)
        constant_classref *ref;
        extra_classref *xref;
 
-       CLASS_ASSERT(cls);
-       CLASS_ASSERT(name);
+       assert(cls);
+       assert(name);
 
        ref = class_lookup_classref(cls,name);
        if (ref)
@@ -677,9 +683,13 @@ constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *r
 {
     s4 namelen;
     char *namebuf;
+       s4 dumpsize;
+       constant_classref *cr;
+
+       assert(ref);
+       assert(dim >= 1 && dim <= 255);
 
-       CLASS_ASSERT(ref);
-       CLASS_ASSERT(dim >= 1 && dim <= 255);
+       dumpsize = dump_size();
 
     /* Assemble the array class name */
     namelen = ref->name->blength;
@@ -700,7 +710,11 @@ constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *r
     }
        memset(namebuf, '[', dim);
 
-    return class_get_classref(ref->referer,utf_new(namebuf, namelen));
+    cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
+
+       dump_release(dumpsize);
+
+       return cr;
 }
 
 
@@ -725,7 +739,7 @@ constant_classref *class_get_classref_component_of(constant_classref *ref)
        s4 namelen;
        char *name;
        
-       CLASS_ASSERT(ref);
+       assert(ref);
 
        name = ref->name->text;
        if (*name++ != '[')
@@ -813,22 +827,26 @@ static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
 {
        methodinfo *m;
        s4          i;
-       
+
+       /* try to find the method in the class */
+
        m = class_findmethod(c, name, desc);
 
-       if (m)
+       if (m != NULL)
                return m;
 
-       /* try the superinterfaces */
+       /* no method found? try the superinterfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
                m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
-                                                                                               name, desc);
+                                                                                                       name, desc);
 
-               if (m)
+               if (m != NULL)
                        return m;
        }
-       
+
+       /* no method found */
+
        return NULL;
 }
 
@@ -863,28 +881,28 @@ methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
 
        m = class_resolvemethod(cls, name, desc);
 
-       if (m)
+       if (m != NULL)
                goto found;
 
        /* try the superinterfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
                m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
-                                                                                                name, desc);
+                                                                                               name, desc);
 
-               if (m)
+               if (m != NULL)
                        goto found;
        }
        
        if (throwexception)
-               *exceptionptr = exceptions_new_nosuchmethoderror(c, name, desc);
+               exceptions_throw_nosuchmethoderror(c, name, desc);
 
        return NULL;
 
  found:
        if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
                if (throwexception)
-                       *exceptionptr = new_exception(string_java_lang_AbstractMethodError);
+                       exceptions_throw_abstractmethoderror();
 
                return NULL;
        }
@@ -1201,6 +1219,40 @@ void class_classref_println(constant_classref *cr)
 #endif
 
 
+/* class_classref_or_classinfo_print *******************************************
+
+   Prints classname plus referer class.
+
+*******************************************************************************/
+
+#if !defined(NDEBUG)
+void class_classref_or_classinfo_print(classref_or_classinfo c)
+{
+       if (c.any == NULL) {
+               printf("(classref_or_classinfo) NULL");
+               return;
+       }
+       if (IS_CLASSREF(c))
+               class_classref_print(c.ref);
+       else
+               class_print(c.cls);
+}
+#endif
+
+
+/* class_classref_or_classinfo_println *****************************************
+
+   Prints classname plus referer class and a newline.
+
+*******************************************************************************/
+
+void class_classref_or_classinfo_println(classref_or_classinfo c)
+{
+       class_classref_or_classinfo_println(c);
+       printf("\n");
+}
+
+
 /* class_showconstantpool ******************************************************
 
    Dump the constant pool of the given class to stdout.