-/* 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.
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 */
char *string_java_lang_IllegalMonitorStateException =
"java/lang/IllegalMonitorStateException";
+char *string_java_lang_IndexOutOfBoundsException =
+ "java/lang/IndexOutOfBoundsException";
+
char *string_java_lang_InterruptedException =
"java/lang/InterruptedException";
char *string_java_lang_OutOfMemoryError =
"java/lang/OutOfMemoryError";
+char *string_java_lang_UnsupportedClassVersionError =
+ "java/lang/UnsupportedClassVersionError";
+
char *string_java_lang_VerifyError =
"java/lang/VerifyError";
*******************************************************************************/
-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;
}
classinfo *c;
methodinfo *pss;
- if (*exceptionptr) {
- xptr = *exceptionptr;
+ xptr = *exceptionptr;
+ if (xptr) {
/* clear exception, because we are calling jit code again */
*exceptionptr = NULL;
}
-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 */
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);
}
+#if 1
+#define CREATENEW_EXCEPTION(ex) \
+ return ex;
+#else
#define CREATENEW_EXCEPTION(ex) \
java_objectheader *newEx; \
java_objectheader *oldexception=*exceptionptr;\
newEx=ex;\
*exceptionptr=oldexception;\
return newEx;
+#endif
java_objectheader *new_exception(char *classname)
{
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));
}
/* new_classformaterror ********************************************************
- generates an java.lang.ClassFormatError for the classloader
+ generates a java.lang.ClassFormatError for the classloader
*******************************************************************************/
}
+/* 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
*******************************************************************************/
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) +
}
+/* 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