- mostly stuff from native.[ch]
authortwisti <none@none>
Wed, 21 Jul 2004 15:48:08 +0000 (15:48 +0000)
committertwisti <none@none>
Wed, 21 Jul 2004 15:48:08 +0000 (15:48 +0000)
- added some exception generating functions to create standard vm
  exceptions like ClassFormatError or VerifyError

exceptions.c [new file with mode: 0644]
exceptions.h [new file with mode: 0644]
src/vm/exceptions.c [new file with mode: 0644]
src/vm/exceptions.h [new file with mode: 0644]

diff --git a/exceptions.c b/exceptions.c
new file mode 100644 (file)
index 0000000..539063d
--- /dev/null
@@ -0,0 +1,426 @@
+/* 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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   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.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Christian Thalinger
+
+   $Id: exceptions.c 1332 2004-07-21 15:48:08Z 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 "toolbox/logging.h"
+#include "toolbox/memory.h"
+#include "nat/java_lang_String.h"
+#include "nat/java_lang_Throwable.h"
+
+
+/* system exception classes required in cacao */
+
+classinfo *class_java_lang_Throwable;
+classinfo *class_java_lang_Exception;
+classinfo *class_java_lang_Error;
+classinfo *class_java_lang_OutOfMemoryError;
+
+
+/* exception/error super class */
+
+char *string_java_lang_Throwable =
+    "java/lang/Throwable";
+
+char *string_java_lang_VMThrowable =
+    "java/lang/VMThrowable";
+
+
+/* specify some exception strings for code generation */
+
+char *string_java_lang_ArithmeticException =
+    "java/lang/ArithmeticException";
+
+char *string_java_lang_ArithmeticException_message =
+    "/ by zero";
+
+char *string_java_lang_ArrayIndexOutOfBoundsException =
+    "java/lang/ArrayIndexOutOfBoundsException";
+
+char *string_java_lang_ArrayStoreException =
+    "java/lang/ArrayStoreException";
+
+char *string_java_lang_ClassCastException =
+    "java/lang/ClassCastException";
+
+char *string_java_lang_ClassNotFoundException =
+       "java/lang/ClassNotFoundException";
+
+char *string_java_lang_CloneNotSupportedException =
+    "java/lang/CloneNotSupportedException";
+
+char *string_java_lang_Exception =
+    "java/lang/Exception";
+
+char *string_java_lang_IllegalArgumentException =
+    "java/lang/IllegalArgumentException";
+
+char *string_java_lang_IllegalMonitorStateException =
+    "java/lang/IllegalMonitorStateException";
+
+char *string_java_lang_NegativeArraySizeException =
+    "java/lang/NegativeArraySizeException";
+
+char *string_java_lang_NoSuchFieldException =
+       "java/lang/NoSuchFieldException";
+
+char *string_java_lang_NoSuchMethodException =
+       "java/lang/NoSuchMethodException";
+
+char *string_java_lang_NullPointerException =
+    "java/lang/NullPointerException";
+
+
+/* specify some error strings for code generation */
+
+char *string_java_lang_AbstractMethodError =
+    "java/lang/AbstractMethodError";
+
+char *string_java_lang_ClassCircularityError =
+    "java/lang/ClassCircularityError";
+
+char *string_java_lang_ClassFormatError =
+    "java/lang/ClassFormatError";
+
+char *string_java_lang_Error =
+    "java/lang/Error";
+
+char *string_java_lang_ExceptionInInitializerError =
+    "java/lang/ExceptionInInitializerError";
+
+char *string_java_lang_IncompatibleClassChangeError =
+    "java/lang/IncompatibleClassChangeError";
+
+char *string_java_lang_InternalError =
+    "java/lang/InternalError";
+
+char *string_java_lang_LinkageError =
+    "java/lang/LinkageError";
+
+char *string_java_lang_NoClassDefFoundError =
+    "java/lang/NoClassDefFoundError";
+
+char *string_java_lang_NoSuchFieldError =
+       "java/lang/NoSuchFieldError";
+
+char *string_java_lang_NoSuchMethodError =
+       "java/lang/NoSuchMethodError";
+
+char *string_java_lang_OutOfMemoryError =
+    "java/lang/OutOfMemoryError";
+
+char *string_java_lang_VerifyError =
+    "java/lang/VerifyError";
+
+char *string_java_lang_VirtualMachineError =
+    "java/lang/VirtualMachineError";
+
+
+/* init_system_exceptions *****************************************************
+
+   load, link and compile exceptions used in the system
+
+*******************************************************************************/
+
+void init_system_exceptions()
+{
+       /* 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);
+
+       /* 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);
+
+       /* 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);
+
+       /* 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);
+}
+
+
+static void throw_exception_exit_intern(bool doexit)
+{
+       java_objectheader *xptr;
+       classinfo *c;
+       methodinfo *pss;
+
+       if (*exceptionptr) {
+               xptr = *exceptionptr;
+
+               /* clear exception, because we are calling jit code again */
+               *exceptionptr = NULL;
+
+               c = xptr->vftbl->class;
+
+               pss = class_resolveclassmethod(c,
+                                                                          utf_new_char("printStackTrace"),
+                                                                          utf_new_char("()V"),
+                                                                          class_java_lang_Object,
+                                                                          false);
+
+               /* print the stacktrace */
+               if (pss) {
+                       asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
+
+                       /* this normally means, we are EXTREMLY out of memory, but may be
+                          any other exception */
+                       if (*exceptionptr) {
+                               utf_fprint_classname(stderr, c->name);
+                               fprintf(stderr, "\n");
+                       }
+
+               } else {
+                       utf_fprint_classname(stderr, c->name);
+                       fprintf(stderr, ": printStackTrace()V not found!\n");
+               }
+
+               fflush(stderr);
+
+               /* good bye! */
+               if (doexit) {
+                       exit(1);
+               }
+       }
+}
+
+
+void throw_exception()
+{
+       throw_exception_exit_intern(false);
+}
+
+
+void throw_exception_exit()
+{
+       throw_exception_exit_intern(true);
+}
+
+
+void throw_main_exception()
+{
+       fprintf(stderr, "Exception in thread \"main\" ");
+       fflush(stderr);
+
+       throw_exception_exit_intern(false);
+}
+
+
+void throw_main_exception_exit()
+{
+       fprintf(stderr, "Exception in thread \"main\" ");
+       fflush(stderr);
+
+       throw_exception_exit_intern(true);
+}
+
+
+void throw_cacao_exception_exit(char *exception, char *message)
+{
+       s4 i;
+       char *tmp;
+       s4 len;
+
+       len = strlen(exception);
+       tmp = MNEW(char, len);
+       strncpy(tmp, exception, len);
+
+       /* convert to classname */
+
+       for (i = len - 1; i >= 0; i--) {
+               if (tmp[i] == '/') tmp[i] = '.';
+       }
+
+       fprintf(stderr, "Exception in thread \"main\" %s", tmp);
+
+       MFREE(tmp, char, len);
+
+       if (strlen(message) > 0)
+               fprintf(stderr, ": %s", message);
+
+       fprintf(stderr, "\n");
+       fflush(stderr);
+
+       /* good bye! */
+       exit(1);
+}
+
+
+#define CREATENEW_EXCEPTION(ex) \
+       java_objectheader *newEx; \
+       java_objectheader *oldexception=*exceptionptr;\
+       *exceptionptr=0;\
+       newEx=ex;\
+       *exceptionptr=oldexception;\
+       return newEx;
+
+java_objectheader *new_exception(char *classname)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init(c));
+}
+
+java_objectheader *new_exception_message(char *classname, char *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
+}
+
+
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
+}
+
+
+java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
+}
+
+
+java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
+}
+
+
+java_objectheader *new_exception_int(char *classname, s4 i)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
+}
+
+
+/* new_classformaterror ********************************************************
+
+   generates an java.lang.ClassFormatError for the classloader
+
+*******************************************************************************/
+
+java_objectheader *new_classformaterror(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_ClassFormatError, msg);
+}
+
+
+/* new_verifyerror *************************************************************
+
+   generates an java.lang.VerifyError for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_verifyerror(methodinfo *m, char *message)
+{
+       java_objectheader *o;
+       char *msg;
+       s4 len;
+
+       len = 8 + utf_strlen(m->class->name) +
+               10 + utf_strlen(m->name) +
+               13 + utf_strlen(m->descriptor) +
+               2 + strlen(message) + 1;
+               
+       msg = MNEW(char, len);
+
+       sprintf(msg, "(class: ");
+       utf_sprint(msg + strlen(msg), m->class->name);
+       sprintf(msg + strlen(msg), ", method: ");
+       utf_sprint(msg + strlen(msg), m->name);
+       sprintf(msg + strlen(msg), ", signature: ");
+       utf_sprint(msg + strlen(msg), m->descriptor);
+       sprintf(msg + strlen(msg), ") %s", message);
+
+       o = new_exception_message(string_java_lang_VerifyError, msg);
+
+       MFREE(msg, u1, len);
+
+       return o;
+}
+
+
+/*
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
diff --git a/exceptions.h b/exceptions.h
new file mode 100644 (file)
index 0000000..4031e13
--- /dev/null
@@ -0,0 +1,130 @@
+/* exceptions.h - exception related functions prototypes
+
+   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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   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.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Christian Thalinger
+
+   $Id: exceptions.h 1332 2004-07-21 15:48:08Z twisti $
+
+*/
+
+
+#ifndef _EXCEPTIONS_H
+#define _EXCEPTIONS_H
+
+
+#include "global.h"
+#include "nat/java_lang_String.h"
+#include "nat/java_lang_Throwable.h"
+
+
+/* system exception classes required in cacao */
+
+extern classinfo *class_java_lang_Throwable;
+extern classinfo *class_java_lang_Exception;
+extern classinfo *class_java_lang_Error;
+extern classinfo *class_java_lang_OutOfMemoryError;
+
+
+/* exception/error super class */
+
+extern char *string_java_lang_Throwable;
+
+
+/* specify some exception strings for code generation */
+
+extern char *string_java_lang_ArithmeticException;
+extern char *string_java_lang_ArithmeticException_message;
+extern char *string_java_lang_ArrayIndexOutOfBoundsException;
+extern char *string_java_lang_ArrayStoreException;
+extern char *string_java_lang_ClassCastException;
+extern char *string_java_lang_ClassNotFoundException;
+extern char *string_java_lang_CloneNotSupportedException;
+extern char *string_java_lang_Exception;
+extern char *string_java_lang_IllegalArgumentException;
+extern char *string_java_lang_IllegalMonitorStateException;
+extern char *string_java_lang_NegativeArraySizeException;
+extern char *string_java_lang_NoSuchFieldException;
+extern char *string_java_lang_NoSuchMethodException;
+extern char *string_java_lang_NullPointerException;
+
+
+/* specify some error strings for code generation */
+
+extern char *string_java_lang_AbstractMethodError;
+extern char *string_java_lang_ClassCircularityError;
+extern char *string_java_lang_ClassFormatError;
+extern char *string_java_lang_Error;
+extern char *string_java_lang_ExceptionInInitializerError;
+extern char *string_java_lang_IncompatibleClassChangeError;
+extern char *string_java_lang_InternalError;
+extern char *string_java_lang_LinkageError;
+extern char *string_java_lang_NoClassDefFoundError;
+extern char *string_java_lang_NoSuchFieldError;
+extern char *string_java_lang_NoSuchMethodError;
+extern char *string_java_lang_OutOfMemoryError;
+extern char *string_java_lang_VerifyError;
+
+
+/* function prototypes */
+
+/* load, link and compile exceptions used in the system */
+void init_system_exceptions();
+
+/* exception throwing functions */
+void throw_exception();
+void throw_exception_exit();
+
+void throw_main_exception();
+void throw_main_exception_exit();
+
+void throw_cacao_exception_exit(char *exception, char *message);
+
+/* initialize new exceptions */
+java_objectheader *new_exception(char *classname);
+java_objectheader *new_exception_message(char *classname, char *message);
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *cause);
+java_objectheader *new_exception_utfmessage(char *classname, utf *message);
+java_objectheader *new_exception_javastring(char *classname, java_lang_String *message);
+java_objectheader *new_exception_int(char *classname, s4 i);
+
+java_objectheader *new_classformaterror(classinfo *c, char *message, ...);
+java_objectheader *new_verifyerror(methodinfo *m, char *message);
+
+#endif /* _EXCEPTIONS_H */
+
+
+/*
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
diff --git a/src/vm/exceptions.c b/src/vm/exceptions.c
new file mode 100644 (file)
index 0000000..539063d
--- /dev/null
@@ -0,0 +1,426 @@
+/* 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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   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.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Christian Thalinger
+
+   $Id: exceptions.c 1332 2004-07-21 15:48:08Z 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 "toolbox/logging.h"
+#include "toolbox/memory.h"
+#include "nat/java_lang_String.h"
+#include "nat/java_lang_Throwable.h"
+
+
+/* system exception classes required in cacao */
+
+classinfo *class_java_lang_Throwable;
+classinfo *class_java_lang_Exception;
+classinfo *class_java_lang_Error;
+classinfo *class_java_lang_OutOfMemoryError;
+
+
+/* exception/error super class */
+
+char *string_java_lang_Throwable =
+    "java/lang/Throwable";
+
+char *string_java_lang_VMThrowable =
+    "java/lang/VMThrowable";
+
+
+/* specify some exception strings for code generation */
+
+char *string_java_lang_ArithmeticException =
+    "java/lang/ArithmeticException";
+
+char *string_java_lang_ArithmeticException_message =
+    "/ by zero";
+
+char *string_java_lang_ArrayIndexOutOfBoundsException =
+    "java/lang/ArrayIndexOutOfBoundsException";
+
+char *string_java_lang_ArrayStoreException =
+    "java/lang/ArrayStoreException";
+
+char *string_java_lang_ClassCastException =
+    "java/lang/ClassCastException";
+
+char *string_java_lang_ClassNotFoundException =
+       "java/lang/ClassNotFoundException";
+
+char *string_java_lang_CloneNotSupportedException =
+    "java/lang/CloneNotSupportedException";
+
+char *string_java_lang_Exception =
+    "java/lang/Exception";
+
+char *string_java_lang_IllegalArgumentException =
+    "java/lang/IllegalArgumentException";
+
+char *string_java_lang_IllegalMonitorStateException =
+    "java/lang/IllegalMonitorStateException";
+
+char *string_java_lang_NegativeArraySizeException =
+    "java/lang/NegativeArraySizeException";
+
+char *string_java_lang_NoSuchFieldException =
+       "java/lang/NoSuchFieldException";
+
+char *string_java_lang_NoSuchMethodException =
+       "java/lang/NoSuchMethodException";
+
+char *string_java_lang_NullPointerException =
+    "java/lang/NullPointerException";
+
+
+/* specify some error strings for code generation */
+
+char *string_java_lang_AbstractMethodError =
+    "java/lang/AbstractMethodError";
+
+char *string_java_lang_ClassCircularityError =
+    "java/lang/ClassCircularityError";
+
+char *string_java_lang_ClassFormatError =
+    "java/lang/ClassFormatError";
+
+char *string_java_lang_Error =
+    "java/lang/Error";
+
+char *string_java_lang_ExceptionInInitializerError =
+    "java/lang/ExceptionInInitializerError";
+
+char *string_java_lang_IncompatibleClassChangeError =
+    "java/lang/IncompatibleClassChangeError";
+
+char *string_java_lang_InternalError =
+    "java/lang/InternalError";
+
+char *string_java_lang_LinkageError =
+    "java/lang/LinkageError";
+
+char *string_java_lang_NoClassDefFoundError =
+    "java/lang/NoClassDefFoundError";
+
+char *string_java_lang_NoSuchFieldError =
+       "java/lang/NoSuchFieldError";
+
+char *string_java_lang_NoSuchMethodError =
+       "java/lang/NoSuchMethodError";
+
+char *string_java_lang_OutOfMemoryError =
+    "java/lang/OutOfMemoryError";
+
+char *string_java_lang_VerifyError =
+    "java/lang/VerifyError";
+
+char *string_java_lang_VirtualMachineError =
+    "java/lang/VirtualMachineError";
+
+
+/* init_system_exceptions *****************************************************
+
+   load, link and compile exceptions used in the system
+
+*******************************************************************************/
+
+void init_system_exceptions()
+{
+       /* 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);
+
+       /* 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);
+
+       /* 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);
+
+       /* 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);
+}
+
+
+static void throw_exception_exit_intern(bool doexit)
+{
+       java_objectheader *xptr;
+       classinfo *c;
+       methodinfo *pss;
+
+       if (*exceptionptr) {
+               xptr = *exceptionptr;
+
+               /* clear exception, because we are calling jit code again */
+               *exceptionptr = NULL;
+
+               c = xptr->vftbl->class;
+
+               pss = class_resolveclassmethod(c,
+                                                                          utf_new_char("printStackTrace"),
+                                                                          utf_new_char("()V"),
+                                                                          class_java_lang_Object,
+                                                                          false);
+
+               /* print the stacktrace */
+               if (pss) {
+                       asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
+
+                       /* this normally means, we are EXTREMLY out of memory, but may be
+                          any other exception */
+                       if (*exceptionptr) {
+                               utf_fprint_classname(stderr, c->name);
+                               fprintf(stderr, "\n");
+                       }
+
+               } else {
+                       utf_fprint_classname(stderr, c->name);
+                       fprintf(stderr, ": printStackTrace()V not found!\n");
+               }
+
+               fflush(stderr);
+
+               /* good bye! */
+               if (doexit) {
+                       exit(1);
+               }
+       }
+}
+
+
+void throw_exception()
+{
+       throw_exception_exit_intern(false);
+}
+
+
+void throw_exception_exit()
+{
+       throw_exception_exit_intern(true);
+}
+
+
+void throw_main_exception()
+{
+       fprintf(stderr, "Exception in thread \"main\" ");
+       fflush(stderr);
+
+       throw_exception_exit_intern(false);
+}
+
+
+void throw_main_exception_exit()
+{
+       fprintf(stderr, "Exception in thread \"main\" ");
+       fflush(stderr);
+
+       throw_exception_exit_intern(true);
+}
+
+
+void throw_cacao_exception_exit(char *exception, char *message)
+{
+       s4 i;
+       char *tmp;
+       s4 len;
+
+       len = strlen(exception);
+       tmp = MNEW(char, len);
+       strncpy(tmp, exception, len);
+
+       /* convert to classname */
+
+       for (i = len - 1; i >= 0; i--) {
+               if (tmp[i] == '/') tmp[i] = '.';
+       }
+
+       fprintf(stderr, "Exception in thread \"main\" %s", tmp);
+
+       MFREE(tmp, char, len);
+
+       if (strlen(message) > 0)
+               fprintf(stderr, ": %s", message);
+
+       fprintf(stderr, "\n");
+       fflush(stderr);
+
+       /* good bye! */
+       exit(1);
+}
+
+
+#define CREATENEW_EXCEPTION(ex) \
+       java_objectheader *newEx; \
+       java_objectheader *oldexception=*exceptionptr;\
+       *exceptionptr=0;\
+       newEx=ex;\
+       *exceptionptr=oldexception;\
+       return newEx;
+
+java_objectheader *new_exception(char *classname)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init(c));
+}
+
+java_objectheader *new_exception_message(char *classname, char *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
+}
+
+
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
+}
+
+
+java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
+}
+
+
+java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
+}
+
+
+java_objectheader *new_exception_int(char *classname, s4 i)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
+}
+
+
+/* new_classformaterror ********************************************************
+
+   generates an java.lang.ClassFormatError for the classloader
+
+*******************************************************************************/
+
+java_objectheader *new_classformaterror(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_ClassFormatError, msg);
+}
+
+
+/* new_verifyerror *************************************************************
+
+   generates an java.lang.VerifyError for the jit compiler
+
+*******************************************************************************/
+
+java_objectheader *new_verifyerror(methodinfo *m, char *message)
+{
+       java_objectheader *o;
+       char *msg;
+       s4 len;
+
+       len = 8 + utf_strlen(m->class->name) +
+               10 + utf_strlen(m->name) +
+               13 + utf_strlen(m->descriptor) +
+               2 + strlen(message) + 1;
+               
+       msg = MNEW(char, len);
+
+       sprintf(msg, "(class: ");
+       utf_sprint(msg + strlen(msg), m->class->name);
+       sprintf(msg + strlen(msg), ", method: ");
+       utf_sprint(msg + strlen(msg), m->name);
+       sprintf(msg + strlen(msg), ", signature: ");
+       utf_sprint(msg + strlen(msg), m->descriptor);
+       sprintf(msg + strlen(msg), ") %s", message);
+
+       o = new_exception_message(string_java_lang_VerifyError, msg);
+
+       MFREE(msg, u1, len);
+
+       return o;
+}
+
+
+/*
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
diff --git a/src/vm/exceptions.h b/src/vm/exceptions.h
new file mode 100644 (file)
index 0000000..4031e13
--- /dev/null
@@ -0,0 +1,130 @@
+/* exceptions.h - exception related functions prototypes
+
+   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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   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.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Christian Thalinger
+
+   $Id: exceptions.h 1332 2004-07-21 15:48:08Z twisti $
+
+*/
+
+
+#ifndef _EXCEPTIONS_H
+#define _EXCEPTIONS_H
+
+
+#include "global.h"
+#include "nat/java_lang_String.h"
+#include "nat/java_lang_Throwable.h"
+
+
+/* system exception classes required in cacao */
+
+extern classinfo *class_java_lang_Throwable;
+extern classinfo *class_java_lang_Exception;
+extern classinfo *class_java_lang_Error;
+extern classinfo *class_java_lang_OutOfMemoryError;
+
+
+/* exception/error super class */
+
+extern char *string_java_lang_Throwable;
+
+
+/* specify some exception strings for code generation */
+
+extern char *string_java_lang_ArithmeticException;
+extern char *string_java_lang_ArithmeticException_message;
+extern char *string_java_lang_ArrayIndexOutOfBoundsException;
+extern char *string_java_lang_ArrayStoreException;
+extern char *string_java_lang_ClassCastException;
+extern char *string_java_lang_ClassNotFoundException;
+extern char *string_java_lang_CloneNotSupportedException;
+extern char *string_java_lang_Exception;
+extern char *string_java_lang_IllegalArgumentException;
+extern char *string_java_lang_IllegalMonitorStateException;
+extern char *string_java_lang_NegativeArraySizeException;
+extern char *string_java_lang_NoSuchFieldException;
+extern char *string_java_lang_NoSuchMethodException;
+extern char *string_java_lang_NullPointerException;
+
+
+/* specify some error strings for code generation */
+
+extern char *string_java_lang_AbstractMethodError;
+extern char *string_java_lang_ClassCircularityError;
+extern char *string_java_lang_ClassFormatError;
+extern char *string_java_lang_Error;
+extern char *string_java_lang_ExceptionInInitializerError;
+extern char *string_java_lang_IncompatibleClassChangeError;
+extern char *string_java_lang_InternalError;
+extern char *string_java_lang_LinkageError;
+extern char *string_java_lang_NoClassDefFoundError;
+extern char *string_java_lang_NoSuchFieldError;
+extern char *string_java_lang_NoSuchMethodError;
+extern char *string_java_lang_OutOfMemoryError;
+extern char *string_java_lang_VerifyError;
+
+
+/* function prototypes */
+
+/* load, link and compile exceptions used in the system */
+void init_system_exceptions();
+
+/* exception throwing functions */
+void throw_exception();
+void throw_exception_exit();
+
+void throw_main_exception();
+void throw_main_exception_exit();
+
+void throw_cacao_exception_exit(char *exception, char *message);
+
+/* initialize new exceptions */
+java_objectheader *new_exception(char *classname);
+java_objectheader *new_exception_message(char *classname, char *message);
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *cause);
+java_objectheader *new_exception_utfmessage(char *classname, utf *message);
+java_objectheader *new_exception_javastring(char *classname, java_lang_String *message);
+java_objectheader *new_exception_int(char *classname, s4 i);
+
+java_objectheader *new_classformaterror(classinfo *c, char *message, ...);
+java_objectheader *new_verifyerror(methodinfo *m, char *message);
+
+#endif /* _EXCEPTIONS_H */
+
+
+/*
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */