GNU header update.
[cacao.git] / src / vm / exceptions.c
index a518bf63cf7f0b168f40febc87934089fc284e8a..bfc8ce68752c11129d106bcd6c9b453b207893d7 100644 (file)
@@ -1,9 +1,9 @@
-/* exceptions.c - exception related functions
+/* vm/exceptions.c - exception related functions
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
-   M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
-   P. Tomsich, J. Wenninger
+   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
 
    This file is part of CACAO.
 
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: exceptions.c 1370 2004-08-01 21:54:20Z stefan $
+   $Id: exceptions.c 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 #include <string.h>
 #include <stdarg.h>
 #include <stdlib.h>
-#include "asmpart.h"
-#include "global.h"
-#include "loader.h"
-#include "native.h"
-#include "tables.h"
-#include "jit/jit.h"
+
+#include "mm/memory.h"
+#include "native/native.h"
+#include "native/include/java_lang_String.h"
+#include "native/include/java_lang_Throwable.h"
 #include "toolbox/logging.h"
-#include "toolbox/memory.h"
-#include "nat/java_lang_String.h"
-#include "nat/java_lang_Throwable.h"
+#include "vm/global.h"
+#include "vm/loader.h"
+#include "vm/tables.h"
+#include "vm/jit/asmpart.h"
+#include "vm/jit/jit.h"
+#include "vm/options.h"
 
 
 /* system exception classes required in cacao */
@@ -95,6 +97,9 @@ char *string_java_lang_IllegalArgumentException =
 char *string_java_lang_IllegalMonitorStateException =
     "java/lang/IllegalMonitorStateException";
 
+char *string_java_lang_IndexOutOfBoundsException =
+    "java/lang/IndexOutOfBoundsException";
+
 char *string_java_lang_InterruptedException =
     "java/lang/InterruptedException";
 
@@ -149,6 +154,9 @@ char *string_java_lang_NoSuchMethodError =
 char *string_java_lang_OutOfMemoryError =
     "java/lang/OutOfMemoryError";
 
+char *string_java_lang_UnsupportedClassVersionError =
+    "java/lang/UnsupportedClassVersionError";
+
 char *string_java_lang_VerifyError =
     "java/lang/VerifyError";
 
@@ -162,35 +170,56 @@ char *string_java_lang_VirtualMachineError =
 
 *******************************************************************************/
 
-void init_system_exceptions()
+bool init_system_exceptions(void)
 {
        /* java/lang/Throwable */
 
        class_java_lang_Throwable =
                class_new(utf_new_char(string_java_lang_Throwable));
-       class_load(class_java_lang_Throwable);
-       class_link(class_java_lang_Throwable);
+
+       if (!class_load(class_java_lang_Throwable))
+               return false;
+
+       if (!class_link(class_java_lang_Throwable))
+               return false;
+
 
        /* java/lang/Exception */
 
        class_java_lang_Exception =
                class_new(utf_new_char(string_java_lang_Exception));
-       class_load(class_java_lang_Exception);
-       class_link(class_java_lang_Exception);
+
+       if (!class_load(class_java_lang_Exception))
+               return false;
+
+       if (!class_link(class_java_lang_Exception))
+               return false;
+
 
        /* java/lang/Error */
 
        class_java_lang_Error =
                class_new(utf_new_char(string_java_lang_Error));
-       class_load(class_java_lang_Error);
-       class_link(class_java_lang_Error);
+
+       if (!class_load(class_java_lang_Error))
+               return false;
+
+       if (!class_link(class_java_lang_Error))
+               return false;
+
 
        /* java/lang/OutOfMemoryError */
 
        class_java_lang_OutOfMemoryError =
                class_new(utf_new_char(string_java_lang_OutOfMemoryError));
-       class_load(class_java_lang_OutOfMemoryError);
-       class_link(class_java_lang_OutOfMemoryError);
+
+       if (!class_load(class_java_lang_OutOfMemoryError))
+               return false;
+
+       if (!class_link(class_java_lang_OutOfMemoryError))
+               return false;
+
+       return true;
 }
 
 
@@ -200,9 +229,9 @@ static void throw_exception_exit_intern(bool doexit)
        classinfo *c;
        methodinfo *pss;
 
-       if (*exceptionptr) {
-               xptr = *exceptionptr;
+       xptr = *exceptionptr;
 
+       if (xptr) {
                /* clear exception, because we are calling jit code again */
                *exceptionptr = NULL;
 
@@ -270,15 +299,17 @@ void throw_main_exception_exit()
 }
 
 
-void throw_cacao_exception_exit(char *exception, char *message)
+void throw_cacao_exception_exit(const char *exception, const char *message, ...)
 {
        s4 i;
        char *tmp;
        s4 len;
+       va_list ap;
 
        len = strlen(exception);
-       tmp = MNEW(char, len);
+       tmp = MNEW(char, len + 1);
        strncpy(tmp, exception, len);
+       tmp[len] = '\0';
 
        /* convert to classname */
 
@@ -290,8 +321,13 @@ void throw_cacao_exception_exit(char *exception, char *message)
 
        MFREE(tmp, char, len);
 
-       if (strlen(message) > 0)
-               fprintf(stderr, ": %s", message);
+       if (strlen(message) > 0) {
+               fprintf(stderr, ": ");
+
+               va_start(ap, message);
+               vfprintf(stderr, message, ap);
+               va_end(ap);
+       }
 
        fprintf(stderr, "\n");
        fflush(stderr);
@@ -301,6 +337,10 @@ void throw_cacao_exception_exit(char *exception, char *message)
 }
 
 
+#if 1
+#define CREATENEW_EXCEPTION(ex) \
+    return ex;
+#else
 #define CREATENEW_EXCEPTION(ex) \
        java_objectheader *newEx; \
        java_objectheader *oldexception=*exceptionptr;\
@@ -308,6 +348,7 @@ void throw_cacao_exception_exit(char *exception, char *message)
        newEx=ex;\
        *exceptionptr=oldexception;\
        return newEx;
+#endif
 
 java_objectheader *new_exception(char *classname)
 {
@@ -350,7 +391,9 @@ java_objectheader *new_exception_javastring(char *classname, java_lang_String *m
 
 java_objectheader *new_exception_int(char *classname, s4 i)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+
+       c = class_new(utf_new_char(classname));
 
        CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
 }
@@ -358,7 +401,7 @@ java_objectheader *new_exception_int(char *classname, s4 i)
 
 /* new_classformaterror ********************************************************
 
-   generates an java.lang.ClassFormatError for the classloader
+   generates a java.lang.ClassFormatError for the classloader
 
 *******************************************************************************/
 
@@ -380,9 +423,34 @@ java_objectheader *new_classformaterror(classinfo *c, char *message, ...)
 }
 
 
+/* new_unsupportedclassversionerror ********************************************
+
+   generates a java.lang.UnsupportedClassVersionError for the classloader
+
+*******************************************************************************/
+
+java_objectheader *new_unsupportedclassversionerror(classinfo *c, char *message, ...)
+{
+       char msg[MAXLOGTEXT];
+       va_list ap;
+
+       utf_sprint_classname(msg, c->name);
+       sprintf(msg + strlen(msg), " (");
+
+       va_start(ap, message);
+       vsprintf(msg + strlen(msg), message, ap);
+       va_end(ap);
+
+       sprintf(msg + strlen(msg), ")");
+
+       return new_exception_message(string_java_lang_UnsupportedClassVersionError,
+                                                                msg);
+}
+
+
 /* new_verifyerror *************************************************************
 
-   generates an java.lang.VerifyError for the jit compiler
+   generates a java.lang.VerifyError for the jit compiler
 
 *******************************************************************************/
 
@@ -392,6 +460,7 @@ java_objectheader *new_verifyerror(methodinfo *m, char *message)
        char *msg;
        s4 len;
 
+       useinlining = false; /* at least until sure inlining works with exceptions*/
        len = 8 + utf_strlen(m->class->name) +
                10 + utf_strlen(m->name) +
                13 + utf_strlen(m->descriptor) +
@@ -415,6 +484,148 @@ java_objectheader *new_verifyerror(methodinfo *m, char *message)
 }
 
 
+/* new_arithmeticexception *****************************************************
+
+   generates a java.lang.ArithmeticException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_arithmeticexception()
+{
+       java_objectheader *e;
+
+       e = new_exception_message(string_java_lang_ArithmeticException,
+                                                         string_java_lang_ArithmeticException_message);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* new_arrayindexoutofboundsexception ******************************************
+
+   generates a java.lang.ArrayIndexOutOfBoundsException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_arrayindexoutofboundsexception(s4 index)
+{
+       java_objectheader *e;
+       methodinfo *m;
+       java_lang_String *s;
+
+       /* convert the index into a String, like Sun does */
+
+       m = class_resolveclassmethod(class_java_lang_String,
+                                                                utf_new_char("valueOf"),
+                                                                utf_new_char("(I)Ljava/lang/String;"),
+                                                                class_java_lang_Object,
+                                                                true);
+
+       if (!m)
+               return *exceptionptr;
+
+       s = (java_lang_String *) asm_calljavafunction(m,
+#if POINTERSIZE == 8
+                                                                                                 (void *) (s8) index,
+#else
+                                                                                                 (void *) index,
+#endif
+                                                                                                 NULL,
+                                                                                                 NULL,
+                                                                                                 NULL);
+
+       if (!s)
+               return *exceptionptr;
+
+       e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
+                                                                s);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* new_arraystoreexception *****************************************************
+
+   generates a java.lang.ArrayStoreException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_arraystoreexception()
+{
+       java_objectheader *e;
+
+       e = new_exception(string_java_lang_ArrayStoreException);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* new_classcastexception ******************************************************
+
+   generates a java.lang.ClassCastException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_classcastexception()
+{
+       java_objectheader *e;
+
+       e = new_exception(string_java_lang_ClassCastException);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* new_negativearraysizeexception **********************************************
+
+   generates a java.lang.NegativeArraySizeException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_negativearraysizeexception()
+{
+       java_objectheader *e;
+
+       e = new_exception(string_java_lang_NegativeArraySizeException);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* new_nullpointerexception ****************************************************
+
+   generates a java.lang.NullPointerException for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_nullpointerexception()
+{
+       java_objectheader *e;
+
+       e = new_exception(string_java_lang_NullPointerException);
+
+       if (!e)
+               return *exceptionptr;
+
+       return e;
+}
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where