1 /* exceptions.c - exception related functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5 M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6 P. Tomsich, J. Wenninger
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Thalinger
29 $Id: exceptions.c 1491 2004-11-12 13:25:02Z twisti $
43 #include "toolbox/logging.h"
44 #include "toolbox/memory.h"
45 #include "nat/java_lang_String.h"
46 #include "nat/java_lang_Throwable.h"
49 /* system exception classes required in cacao */
51 classinfo *class_java_lang_Throwable;
52 classinfo *class_java_lang_Exception;
53 classinfo *class_java_lang_Error;
54 classinfo *class_java_lang_OutOfMemoryError;
57 /* exception/error super class */
59 char *string_java_lang_Throwable =
60 "java/lang/Throwable";
62 char *string_java_lang_VMThrowable =
63 "java/lang/VMThrowable";
66 /* specify some exception strings for code generation */
68 char *string_java_lang_ArithmeticException =
69 "java/lang/ArithmeticException";
71 char *string_java_lang_ArithmeticException_message =
74 char *string_java_lang_ArrayIndexOutOfBoundsException =
75 "java/lang/ArrayIndexOutOfBoundsException";
77 char *string_java_lang_ArrayStoreException =
78 "java/lang/ArrayStoreException";
80 char *string_java_lang_ClassCastException =
81 "java/lang/ClassCastException";
83 char *string_java_lang_ClassNotFoundException =
84 "java/lang/ClassNotFoundException";
86 char *string_java_lang_CloneNotSupportedException =
87 "java/lang/CloneNotSupportedException";
89 char *string_java_lang_Exception =
90 "java/lang/Exception";
92 char *string_java_lang_IllegalArgumentException =
93 "java/lang/IllegalArgumentException";
95 char *string_java_lang_IllegalMonitorStateException =
96 "java/lang/IllegalMonitorStateException";
98 char *string_java_lang_IndexOutOfBoundsException =
99 "java/lang/IndexOutOfBoundsException";
101 char *string_java_lang_InterruptedException =
102 "java/lang/InterruptedException";
104 char *string_java_lang_NegativeArraySizeException =
105 "java/lang/NegativeArraySizeException";
107 char *string_java_lang_NoSuchFieldException =
108 "java/lang/NoSuchFieldException";
110 char *string_java_lang_NoSuchMethodException =
111 "java/lang/NoSuchMethodException";
113 char *string_java_lang_NullPointerException =
114 "java/lang/NullPointerException";
117 /* specify some error strings for code generation */
119 char *string_java_lang_AbstractMethodError =
120 "java/lang/AbstractMethodError";
122 char *string_java_lang_ClassCircularityError =
123 "java/lang/ClassCircularityError";
125 char *string_java_lang_ClassFormatError =
126 "java/lang/ClassFormatError";
128 char *string_java_lang_Error =
131 char *string_java_lang_ExceptionInInitializerError =
132 "java/lang/ExceptionInInitializerError";
134 char *string_java_lang_IncompatibleClassChangeError =
135 "java/lang/IncompatibleClassChangeError";
137 char *string_java_lang_InternalError =
138 "java/lang/InternalError";
140 char *string_java_lang_LinkageError =
141 "java/lang/LinkageError";
143 char *string_java_lang_NoClassDefFoundError =
144 "java/lang/NoClassDefFoundError";
146 char *string_java_lang_NoSuchFieldError =
147 "java/lang/NoSuchFieldError";
149 char *string_java_lang_NoSuchMethodError =
150 "java/lang/NoSuchMethodError";
152 char *string_java_lang_OutOfMemoryError =
153 "java/lang/OutOfMemoryError";
155 char *string_java_lang_UnsupportedClassVersionError =
156 "java/lang/UnsupportedClassVersionError";
158 char *string_java_lang_VerifyError =
159 "java/lang/VerifyError";
161 char *string_java_lang_VirtualMachineError =
162 "java/lang/VirtualMachineError";
165 /* init_system_exceptions *****************************************************
167 load, link and compile exceptions used in the system
169 *******************************************************************************/
171 bool init_system_exceptions(void)
173 /* java/lang/Throwable */
175 class_java_lang_Throwable =
176 class_new(utf_new_char(string_java_lang_Throwable));
178 if (!class_load(class_java_lang_Throwable))
181 if (!class_link(class_java_lang_Throwable))
185 /* java/lang/Exception */
187 class_java_lang_Exception =
188 class_new(utf_new_char(string_java_lang_Exception));
190 if (!class_load(class_java_lang_Exception))
193 if (!class_link(class_java_lang_Exception))
197 /* java/lang/Error */
199 class_java_lang_Error =
200 class_new(utf_new_char(string_java_lang_Error));
202 if (!class_load(class_java_lang_Error))
205 if (!class_link(class_java_lang_Error))
209 /* java/lang/OutOfMemoryError */
211 class_java_lang_OutOfMemoryError =
212 class_new(utf_new_char(string_java_lang_OutOfMemoryError));
214 if (!class_load(class_java_lang_OutOfMemoryError))
217 if (!class_link(class_java_lang_OutOfMemoryError))
224 static void throw_exception_exit_intern(bool doexit)
226 java_objectheader *xptr;
230 xptr = *exceptionptr;
233 /* clear exception, because we are calling jit code again */
234 *exceptionptr = NULL;
236 c = xptr->vftbl->class;
238 pss = class_resolveclassmethod(c,
239 utf_new_char("printStackTrace"),
241 class_java_lang_Object,
244 /* print the stacktrace */
246 asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
248 /* this normally means, we are EXTREMLY out of memory, but may be
249 any other exception */
251 utf_fprint_classname(stderr, c->name);
252 fprintf(stderr, "\n");
256 utf_fprint_classname(stderr, c->name);
257 fprintf(stderr, ": printStackTrace()V not found!\n");
270 void throw_exception()
272 throw_exception_exit_intern(false);
276 void throw_exception_exit()
278 throw_exception_exit_intern(true);
282 void throw_main_exception()
284 fprintf(stderr, "Exception in thread \"main\" ");
287 throw_exception_exit_intern(false);
291 void throw_main_exception_exit()
293 fprintf(stderr, "Exception in thread \"main\" ");
296 throw_exception_exit_intern(true);
300 void throw_cacao_exception_exit(char *exception, char *message, ...)
307 len = strlen(exception);
308 tmp = MNEW(char, len+1);
309 strncpy(tmp, exception, len);
312 /* convert to classname */
314 for (i = len - 1; i >= 0; i--) {
315 if (tmp[i] == '/') tmp[i] = '.';
318 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
320 MFREE(tmp, char, len);
322 if (strlen(message) > 0) {
323 fprintf(stderr, ": ");
325 va_start(ap, message);
326 fprintf(stderr, message, ap);
330 fprintf(stderr, "\n");
339 #define CREATENEW_EXCEPTION(ex) \
342 #define CREATENEW_EXCEPTION(ex) \
343 java_objectheader *newEx; \
344 java_objectheader *oldexception=*exceptionptr;\
347 *exceptionptr=oldexception;\
351 java_objectheader *new_exception(char *classname)
353 classinfo *c = class_new(utf_new_char(classname));
355 CREATENEW_EXCEPTION(native_new_and_init(c));
358 java_objectheader *new_exception_message(char *classname, char *message)
360 classinfo *c = class_new(utf_new_char(classname));
362 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
366 java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
368 classinfo *c = class_new(utf_new_char(classname));
370 CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
374 java_objectheader *new_exception_utfmessage(char *classname, utf *message)
376 classinfo *c = class_new(utf_new_char(classname));
378 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
382 java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
384 classinfo *c = class_new(utf_new_char(classname));
386 CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
390 java_objectheader *new_exception_int(char *classname, s4 i)
394 c = class_new(utf_new_char(classname));
396 CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
400 /* new_classformaterror ********************************************************
402 generates a java.lang.ClassFormatError for the classloader
404 *******************************************************************************/
406 java_objectheader *new_classformaterror(classinfo *c, char *message, ...)
408 char msg[MAXLOGTEXT];
411 utf_sprint_classname(msg, c->name);
412 sprintf(msg + strlen(msg), " (");
414 va_start(ap, message);
415 vsprintf(msg + strlen(msg), message, ap);
418 sprintf(msg + strlen(msg), ")");
420 return new_exception_message(string_java_lang_ClassFormatError, msg);
424 /* new_unsupportedclassversionerror ********************************************
426 generates a java.lang.UnsupportedClassVersionError for the classloader
428 *******************************************************************************/
430 java_objectheader *new_unsupportedclassversionerror(classinfo *c, char *message, ...)
432 char msg[MAXLOGTEXT];
435 utf_sprint_classname(msg, c->name);
436 sprintf(msg + strlen(msg), " (");
438 va_start(ap, message);
439 vsprintf(msg + strlen(msg), message, ap);
442 sprintf(msg + strlen(msg), ")");
444 return new_exception_message(string_java_lang_UnsupportedClassVersionError,
449 /* new_verifyerror *************************************************************
451 generates a java.lang.VerifyError for the jit compiler
453 *******************************************************************************/
455 java_objectheader *new_verifyerror(methodinfo *m, char *message)
457 java_objectheader *o;
461 len = 8 + utf_strlen(m->class->name) +
462 10 + utf_strlen(m->name) +
463 13 + utf_strlen(m->descriptor) +
464 2 + strlen(message) + 1;
466 msg = MNEW(char, len);
468 sprintf(msg, "(class: ");
469 utf_sprint(msg + strlen(msg), m->class->name);
470 sprintf(msg + strlen(msg), ", method: ");
471 utf_sprint(msg + strlen(msg), m->name);
472 sprintf(msg + strlen(msg), ", signature: ");
473 utf_sprint(msg + strlen(msg), m->descriptor);
474 sprintf(msg + strlen(msg), ") %s", message);
476 o = new_exception_message(string_java_lang_VerifyError, msg);
484 /* new_arithmeticexception *****************************************************
486 generates a java.lang.ArithmeticException for the jit compiler
488 *******************************************************************************/
490 java_objectheader *new_arithmeticexception()
492 java_objectheader *e;
494 e = new_exception_message(string_java_lang_ArithmeticException,
495 string_java_lang_ArithmeticException_message);
498 return *exceptionptr;
504 /* new_arrayindexoutofboundsexception ******************************************
506 generates a java.lang.ArrayIndexOutOfBoundsException for the jit compiler
508 *******************************************************************************/
510 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
512 java_objectheader *e;
516 /* convert the index into a String, like Sun does */
518 m = class_resolveclassmethod(class_java_lang_String,
519 utf_new_char("valueOf"),
520 utf_new_char("(I)Ljava/lang/String;"),
521 class_java_lang_Object,
525 return *exceptionptr;
527 s = (java_lang_String *) asm_calljavafunction(m,
538 return *exceptionptr;
540 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
544 return *exceptionptr;
550 /* new_arraystoreexception *****************************************************
552 generates a java.lang.ArrayStoreException for the jit compiler
554 *******************************************************************************/
556 java_objectheader *new_arraystoreexception()
558 java_objectheader *e;
560 e = new_exception(string_java_lang_ArrayStoreException);
563 return *exceptionptr;
569 /* new_classcastexception ******************************************************
571 generates a java.lang.ClassCastException for the jit compiler
573 *******************************************************************************/
575 java_objectheader *new_classcastexception()
577 java_objectheader *e;
579 e = new_exception(string_java_lang_ClassCastException);
582 return *exceptionptr;
588 /* new_negativearraysizeexception **********************************************
590 generates a java.lang.NegativeArraySizeException for the jit compiler
592 *******************************************************************************/
594 java_objectheader *new_negativearraysizeexception()
596 java_objectheader *e;
598 e = new_exception(string_java_lang_NegativeArraySizeException);
601 return *exceptionptr;
607 /* new_nullpointerexception ****************************************************
609 generates a java.lang.NullPointerException for the jit compiler
611 *******************************************************************************/
613 java_objectheader *new_nullpointerexception()
615 java_objectheader *e;
617 e = new_exception(string_java_lang_NullPointerException);
620 return *exceptionptr;
627 * These are local overrides for various environment variables in Emacs.
628 * Please do not remove this and leave it at the end of the file, where
629 * Emacs will automagically detect them.
630 * ---------------------------------------------------------------------
633 * indent-tabs-mode: t