1 /* vm/exceptions.c - exception related functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
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 1845 2005-01-04 11:28:16Z twisti $
38 #include "mm/memory.h"
39 #include "native/native.h"
40 #include "native/include/java_lang_String.h"
41 #include "native/include/java_lang_Throwable.h"
42 #include "toolbox/logging.h"
43 #include "vm/global.h"
44 #include "vm/loader.h"
45 #include "vm/tables.h"
46 #include "vm/jit/asmpart.h"
47 #include "vm/jit/jit.h"
48 #include "vm/options.h"
51 /* system exception classes required in cacao */
53 classinfo *class_java_lang_Throwable;
54 classinfo *class_java_lang_Exception;
55 classinfo *class_java_lang_Error;
56 classinfo *class_java_lang_OutOfMemoryError;
59 /* exception/error super class */
61 const char *string_java_lang_Throwable =
62 "java/lang/Throwable";
64 const char *string_java_lang_VMThrowable =
65 "java/lang/VMThrowable";
68 /* specify some exception strings for code generation */
70 const char *string_java_lang_ArithmeticException =
71 "java/lang/ArithmeticException";
73 const char *string_java_lang_ArithmeticException_message =
76 const char *string_java_lang_ArrayIndexOutOfBoundsException =
77 "java/lang/ArrayIndexOutOfBoundsException";
79 const char *string_java_lang_ArrayStoreException =
80 "java/lang/ArrayStoreException";
82 const char *string_java_lang_ClassCastException =
83 "java/lang/ClassCastException";
85 const char *string_java_lang_ClassNotFoundException =
86 "java/lang/ClassNotFoundException";
88 const char *string_java_lang_CloneNotSupportedException =
89 "java/lang/CloneNotSupportedException";
91 const char *string_java_lang_Exception =
92 "java/lang/Exception";
94 const char *string_java_lang_IllegalAccessException =
95 "java/lang/IllegalAccessException";
97 const char *string_java_lang_IllegalArgumentException =
98 "java/lang/IllegalArgumentException";
100 const char *string_java_lang_IllegalMonitorStateException =
101 "java/lang/IllegalMonitorStateException";
103 const char *string_java_lang_IndexOutOfBoundsException =
104 "java/lang/IndexOutOfBoundsException";
106 const char *string_java_lang_InterruptedException =
107 "java/lang/InterruptedException";
109 const char *string_java_lang_NegativeArraySizeException =
110 "java/lang/NegativeArraySizeException";
112 const char *string_java_lang_NoSuchFieldException =
113 "java/lang/NoSuchFieldException";
115 const char *string_java_lang_NoSuchMethodException =
116 "java/lang/NoSuchMethodException";
118 const char *string_java_lang_NullPointerException =
119 "java/lang/NullPointerException";
122 /* specify some error strings for code generation */
124 const char *string_java_lang_AbstractMethodError =
125 "java/lang/AbstractMethodError";
127 const char *string_java_lang_ClassCircularityError =
128 "java/lang/ClassCircularityError";
130 const char *string_java_lang_ClassFormatError =
131 "java/lang/ClassFormatError";
133 const char *string_java_lang_Error =
136 const char *string_java_lang_ExceptionInInitializerError =
137 "java/lang/ExceptionInInitializerError";
139 const char *string_java_lang_IncompatibleClassChangeError =
140 "java/lang/IncompatibleClassChangeError";
142 const char *string_java_lang_InternalError =
143 "java/lang/InternalError";
145 const char *string_java_lang_LinkageError =
146 "java/lang/LinkageError";
148 const char *string_java_lang_NoClassDefFoundError =
149 "java/lang/NoClassDefFoundError";
151 const char *string_java_lang_NoSuchFieldError =
152 "java/lang/NoSuchFieldError";
154 const char *string_java_lang_NoSuchMethodError =
155 "java/lang/NoSuchMethodError";
157 const char *string_java_lang_OutOfMemoryError =
158 "java/lang/OutOfMemoryError";
160 const char *string_java_lang_UnsupportedClassVersionError =
161 "java/lang/UnsupportedClassVersionError";
163 const char *string_java_lang_VerifyError =
164 "java/lang/VerifyError";
166 const char *string_java_lang_VirtualMachineError =
167 "java/lang/VirtualMachineError";
170 /* init_system_exceptions *****************************************************
172 load, link and compile exceptions used in the system
174 *******************************************************************************/
176 bool init_system_exceptions(void)
178 /* java/lang/Throwable */
180 class_java_lang_Throwable =
181 class_new(utf_new_char(string_java_lang_Throwable));
183 if (!class_load(class_java_lang_Throwable))
186 if (!class_link(class_java_lang_Throwable))
190 /* java/lang/Exception */
192 class_java_lang_Exception =
193 class_new(utf_new_char(string_java_lang_Exception));
195 if (!class_load(class_java_lang_Exception))
198 if (!class_link(class_java_lang_Exception))
202 /* java/lang/Error */
204 class_java_lang_Error =
205 class_new(utf_new_char(string_java_lang_Error));
207 if (!class_load(class_java_lang_Error))
210 if (!class_link(class_java_lang_Error))
214 /* java/lang/OutOfMemoryError */
216 class_java_lang_OutOfMemoryError =
217 class_new(utf_new_char(string_java_lang_OutOfMemoryError));
219 if (!class_load(class_java_lang_OutOfMemoryError))
222 if (!class_link(class_java_lang_OutOfMemoryError))
229 static void throw_exception_exit_intern(bool doexit)
231 java_objectheader *xptr;
235 xptr = *exceptionptr;
238 /* clear exception, because we are calling jit code again */
239 *exceptionptr = NULL;
241 c = xptr->vftbl->class;
243 pss = class_resolveclassmethod(c,
244 utf_new_char("printStackTrace"),
246 class_java_lang_Object,
249 /* print the stacktrace */
251 asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
253 /* this normally means, we are EXTREMLY out of memory, but may be
254 any other exception */
256 utf_fprint_classname(stderr, c->name);
257 fprintf(stderr, "\n");
261 utf_fprint_classname(stderr, c->name);
262 fprintf(stderr, ": printStackTrace()V not found!\n");
275 void throw_exception()
277 throw_exception_exit_intern(false);
281 void throw_exception_exit()
283 throw_exception_exit_intern(true);
287 void throw_main_exception()
289 fprintf(stderr, "Exception in thread \"main\" ");
292 throw_exception_exit_intern(false);
296 void throw_main_exception_exit()
298 fprintf(stderr, "Exception in thread \"main\" ");
301 throw_exception_exit_intern(true);
305 void throw_cacao_exception_exit(const char *exception, const char *message, ...)
312 len = strlen(exception);
313 tmp = MNEW(char, len + 1);
314 strncpy(tmp, exception, len);
317 /* convert to classname */
319 for (i = len - 1; i >= 0; i--) {
320 if (tmp[i] == '/') tmp[i] = '.';
323 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
325 MFREE(tmp, char, len);
327 if (strlen(message) > 0) {
328 fprintf(stderr, ": ");
330 va_start(ap, message);
331 vfprintf(stderr, message, ap);
335 fprintf(stderr, "\n");
343 java_objectheader *new_exception(const char *classname)
345 classinfo *c = class_new(utf_new_char(classname));
347 return native_new_and_init(c);
350 java_objectheader *new_exception_message(const char *classname, const char *message)
352 classinfo *c = class_new(utf_new_char(classname));
354 return native_new_and_init_string(c, javastring_new_char(message));
358 java_objectheader *new_exception_throwable(const char *classname, java_lang_Throwable *throwable)
360 classinfo *c = class_new(utf_new_char(classname));
362 return native_new_and_init_throwable(c, throwable);
366 java_objectheader *new_exception_utfmessage(const char *classname, utf *message)
368 classinfo *c = class_new(utf_new_char(classname));
370 return native_new_and_init_string(c, javastring_new(message));
374 java_objectheader *new_exception_javastring(const char *classname, java_lang_String *message)
376 classinfo *c = class_new(utf_new_char(classname));
378 return native_new_and_init_string(c, message);
382 java_objectheader *new_exception_int(const char *classname, s4 i)
386 c = class_new(utf_new_char(classname));
388 return native_new_and_init_int(c, i);
392 /* new_classformaterror ********************************************************
394 generates a java.lang.ClassFormatError for the classloader
396 *******************************************************************************/
398 java_objectheader *new_classformaterror(classinfo *c, const char *message, ...)
400 char msg[MAXLOGTEXT];
403 utf_sprint_classname(msg, c->name);
404 sprintf(msg + strlen(msg), " (");
406 va_start(ap, message);
407 vsprintf(msg + strlen(msg), message, ap);
410 sprintf(msg + strlen(msg), ")");
412 return new_exception_message(string_java_lang_ClassFormatError, msg);
416 /* new_unsupportedclassversionerror ********************************************
418 generates a java.lang.UnsupportedClassVersionError for the classloader
420 *******************************************************************************/
422 java_objectheader *new_unsupportedclassversionerror(classinfo *c, const char *message, ...)
424 char msg[MAXLOGTEXT];
427 utf_sprint_classname(msg, c->name);
428 sprintf(msg + strlen(msg), " (");
430 va_start(ap, message);
431 vsprintf(msg + strlen(msg), message, ap);
434 sprintf(msg + strlen(msg), ")");
436 return new_exception_message(string_java_lang_UnsupportedClassVersionError,
441 /* new_verifyerror *************************************************************
443 generates a java.lang.VerifyError for the jit compiler
445 *******************************************************************************/
447 java_objectheader *new_verifyerror(methodinfo *m, const char *message)
449 java_objectheader *o;
453 useinlining = false; /* at least until sure inlining works with exceptions*/
454 len = 8 + utf_strlen(m->class->name) +
455 10 + utf_strlen(m->name) +
456 13 + utf_strlen(m->descriptor) +
457 2 + strlen(message) + 1;
459 msg = MNEW(char, len);
461 sprintf(msg, "(class: ");
462 utf_sprint(msg + strlen(msg), m->class->name);
463 sprintf(msg + strlen(msg), ", method: ");
464 utf_sprint(msg + strlen(msg), m->name);
465 sprintf(msg + strlen(msg), ", signature: ");
466 utf_sprint(msg + strlen(msg), m->descriptor);
467 sprintf(msg + strlen(msg), ") %s", message);
469 o = new_exception_message(string_java_lang_VerifyError, msg);
477 /* new_arithmeticexception *****************************************************
479 generates a java.lang.ArithmeticException for the jit compiler
481 *******************************************************************************/
483 java_objectheader *new_arithmeticexception()
485 java_objectheader *e;
487 e = new_exception_message(string_java_lang_ArithmeticException,
488 string_java_lang_ArithmeticException_message);
491 return *exceptionptr;
497 /* new_arrayindexoutofboundsexception ******************************************
499 generates a java.lang.ArrayIndexOutOfBoundsException for the jit compiler
501 *******************************************************************************/
503 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
505 java_objectheader *e;
509 /* convert the index into a String, like Sun does */
511 m = class_resolveclassmethod(class_java_lang_String,
512 utf_new_char("valueOf"),
513 utf_new_char("(I)Ljava/lang/String;"),
514 class_java_lang_Object,
518 return *exceptionptr;
520 s = (java_lang_String *) asm_calljavafunction(m,
531 return *exceptionptr;
533 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
537 return *exceptionptr;
543 /* new_arraystoreexception *****************************************************
545 generates a java.lang.ArrayStoreException for the jit compiler
547 *******************************************************************************/
549 java_objectheader *new_arraystoreexception()
551 java_objectheader *e;
553 e = new_exception(string_java_lang_ArrayStoreException);
556 return *exceptionptr;
562 /* new_classcastexception ******************************************************
564 generates a java.lang.ClassCastException for the jit compiler
566 *******************************************************************************/
568 java_objectheader *new_classcastexception()
570 java_objectheader *e;
572 e = new_exception(string_java_lang_ClassCastException);
575 return *exceptionptr;
581 /* new_negativearraysizeexception **********************************************
583 generates a java.lang.NegativeArraySizeException for the jit compiler
585 *******************************************************************************/
587 java_objectheader *new_negativearraysizeexception()
589 java_objectheader *e;
591 e = new_exception(string_java_lang_NegativeArraySizeException);
594 return *exceptionptr;
600 /* new_nullpointerexception ****************************************************
602 generates a java.lang.NullPointerException for the jit compiler
604 *******************************************************************************/
606 java_objectheader *new_nullpointerexception()
608 java_objectheader *e;
610 e = new_exception(string_java_lang_NullPointerException);
613 return *exceptionptr;
620 * These are local overrides for various environment variables in Emacs.
621 * Please do not remove this and leave it at the end of the file, where
622 * Emacs will automagically detect them.
623 * ---------------------------------------------------------------------
626 * indent-tabs-mode: t