1 /* vm/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 1621 2004-11-30 13:06:55Z 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"
50 /* system exception classes required in cacao */
52 classinfo *class_java_lang_Throwable;
53 classinfo *class_java_lang_Exception;
54 classinfo *class_java_lang_Error;
55 classinfo *class_java_lang_OutOfMemoryError;
58 /* exception/error super class */
60 char *string_java_lang_Throwable =
61 "java/lang/Throwable";
63 char *string_java_lang_VMThrowable =
64 "java/lang/VMThrowable";
67 /* specify some exception strings for code generation */
69 char *string_java_lang_ArithmeticException =
70 "java/lang/ArithmeticException";
72 char *string_java_lang_ArithmeticException_message =
75 char *string_java_lang_ArrayIndexOutOfBoundsException =
76 "java/lang/ArrayIndexOutOfBoundsException";
78 char *string_java_lang_ArrayStoreException =
79 "java/lang/ArrayStoreException";
81 char *string_java_lang_ClassCastException =
82 "java/lang/ClassCastException";
84 char *string_java_lang_ClassNotFoundException =
85 "java/lang/ClassNotFoundException";
87 char *string_java_lang_CloneNotSupportedException =
88 "java/lang/CloneNotSupportedException";
90 char *string_java_lang_Exception =
91 "java/lang/Exception";
93 char *string_java_lang_IllegalArgumentException =
94 "java/lang/IllegalArgumentException";
96 char *string_java_lang_IllegalMonitorStateException =
97 "java/lang/IllegalMonitorStateException";
99 char *string_java_lang_IndexOutOfBoundsException =
100 "java/lang/IndexOutOfBoundsException";
102 char *string_java_lang_InterruptedException =
103 "java/lang/InterruptedException";
105 char *string_java_lang_NegativeArraySizeException =
106 "java/lang/NegativeArraySizeException";
108 char *string_java_lang_NoSuchFieldException =
109 "java/lang/NoSuchFieldException";
111 char *string_java_lang_NoSuchMethodException =
112 "java/lang/NoSuchMethodException";
114 char *string_java_lang_NullPointerException =
115 "java/lang/NullPointerException";
118 /* specify some error strings for code generation */
120 char *string_java_lang_AbstractMethodError =
121 "java/lang/AbstractMethodError";
123 char *string_java_lang_ClassCircularityError =
124 "java/lang/ClassCircularityError";
126 char *string_java_lang_ClassFormatError =
127 "java/lang/ClassFormatError";
129 char *string_java_lang_Error =
132 char *string_java_lang_ExceptionInInitializerError =
133 "java/lang/ExceptionInInitializerError";
135 char *string_java_lang_IncompatibleClassChangeError =
136 "java/lang/IncompatibleClassChangeError";
138 char *string_java_lang_InternalError =
139 "java/lang/InternalError";
141 char *string_java_lang_LinkageError =
142 "java/lang/LinkageError";
144 char *string_java_lang_NoClassDefFoundError =
145 "java/lang/NoClassDefFoundError";
147 char *string_java_lang_NoSuchFieldError =
148 "java/lang/NoSuchFieldError";
150 char *string_java_lang_NoSuchMethodError =
151 "java/lang/NoSuchMethodError";
153 char *string_java_lang_OutOfMemoryError =
154 "java/lang/OutOfMemoryError";
156 char *string_java_lang_UnsupportedClassVersionError =
157 "java/lang/UnsupportedClassVersionError";
159 char *string_java_lang_VerifyError =
160 "java/lang/VerifyError";
162 char *string_java_lang_VirtualMachineError =
163 "java/lang/VirtualMachineError";
166 /* init_system_exceptions *****************************************************
168 load, link and compile exceptions used in the system
170 *******************************************************************************/
172 bool init_system_exceptions(void)
174 /* java/lang/Throwable */
176 class_java_lang_Throwable =
177 class_new(utf_new_char(string_java_lang_Throwable));
179 if (!class_load(class_java_lang_Throwable))
182 if (!class_link(class_java_lang_Throwable))
186 /* java/lang/Exception */
188 class_java_lang_Exception =
189 class_new(utf_new_char(string_java_lang_Exception));
191 if (!class_load(class_java_lang_Exception))
194 if (!class_link(class_java_lang_Exception))
198 /* java/lang/Error */
200 class_java_lang_Error =
201 class_new(utf_new_char(string_java_lang_Error));
203 if (!class_load(class_java_lang_Error))
206 if (!class_link(class_java_lang_Error))
210 /* java/lang/OutOfMemoryError */
212 class_java_lang_OutOfMemoryError =
213 class_new(utf_new_char(string_java_lang_OutOfMemoryError));
215 if (!class_load(class_java_lang_OutOfMemoryError))
218 if (!class_link(class_java_lang_OutOfMemoryError))
225 static void throw_exception_exit_intern(bool doexit)
227 java_objectheader *xptr;
231 xptr = *exceptionptr;
234 /* clear exception, because we are calling jit code again */
235 *exceptionptr = NULL;
237 c = xptr->vftbl->class;
239 pss = class_resolveclassmethod(c,
240 utf_new_char("printStackTrace"),
242 class_java_lang_Object,
245 /* print the stacktrace */
247 asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
249 /* this normally means, we are EXTREMLY out of memory, but may be
250 any other exception */
252 utf_fprint_classname(stderr, c->name);
253 fprintf(stderr, "\n");
257 utf_fprint_classname(stderr, c->name);
258 fprintf(stderr, ": printStackTrace()V not found!\n");
271 void throw_exception()
273 throw_exception_exit_intern(false);
277 void throw_exception_exit()
279 throw_exception_exit_intern(true);
283 void throw_main_exception()
285 fprintf(stderr, "Exception in thread \"main\" ");
288 throw_exception_exit_intern(false);
292 void throw_main_exception_exit()
294 fprintf(stderr, "Exception in thread \"main\" ");
297 throw_exception_exit_intern(true);
301 void throw_cacao_exception_exit(const char *exception, const char *message, ...)
308 len = strlen(exception);
309 tmp = MNEW(char, len + 1);
310 strncpy(tmp, exception, len);
313 /* convert to classname */
315 for (i = len - 1; i >= 0; i--) {
316 if (tmp[i] == '/') tmp[i] = '.';
319 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
321 MFREE(tmp, char, len);
323 if (strlen(message) > 0) {
324 fprintf(stderr, ": ");
326 va_start(ap, message);
327 vfprintf(stderr, message, ap);
331 fprintf(stderr, "\n");
340 #define CREATENEW_EXCEPTION(ex) \
343 #define CREATENEW_EXCEPTION(ex) \
344 java_objectheader *newEx; \
345 java_objectheader *oldexception=*exceptionptr;\
348 *exceptionptr=oldexception;\
352 java_objectheader *new_exception(char *classname)
354 classinfo *c = class_new(utf_new_char(classname));
356 CREATENEW_EXCEPTION(native_new_and_init(c));
359 java_objectheader *new_exception_message(char *classname, char *message)
361 classinfo *c = class_new(utf_new_char(classname));
363 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
367 java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
369 classinfo *c = class_new(utf_new_char(classname));
371 CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
375 java_objectheader *new_exception_utfmessage(char *classname, utf *message)
377 classinfo *c = class_new(utf_new_char(classname));
379 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
383 java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
385 classinfo *c = class_new(utf_new_char(classname));
387 CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
391 java_objectheader *new_exception_int(char *classname, s4 i)
395 c = class_new(utf_new_char(classname));
397 CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
401 /* new_classformaterror ********************************************************
403 generates a java.lang.ClassFormatError for the classloader
405 *******************************************************************************/
407 java_objectheader *new_classformaterror(classinfo *c, char *message, ...)
409 char msg[MAXLOGTEXT];
412 utf_sprint_classname(msg, c->name);
413 sprintf(msg + strlen(msg), " (");
415 va_start(ap, message);
416 vsprintf(msg + strlen(msg), message, ap);
419 sprintf(msg + strlen(msg), ")");
421 return new_exception_message(string_java_lang_ClassFormatError, msg);
425 /* new_unsupportedclassversionerror ********************************************
427 generates a java.lang.UnsupportedClassVersionError for the classloader
429 *******************************************************************************/
431 java_objectheader *new_unsupportedclassversionerror(classinfo *c, char *message, ...)
433 char msg[MAXLOGTEXT];
436 utf_sprint_classname(msg, c->name);
437 sprintf(msg + strlen(msg), " (");
439 va_start(ap, message);
440 vsprintf(msg + strlen(msg), message, ap);
443 sprintf(msg + strlen(msg), ")");
445 return new_exception_message(string_java_lang_UnsupportedClassVersionError,
450 /* new_verifyerror *************************************************************
452 generates a java.lang.VerifyError for the jit compiler
454 *******************************************************************************/
456 java_objectheader *new_verifyerror(methodinfo *m, char *message)
458 java_objectheader *o;
462 len = 8 + utf_strlen(m->class->name) +
463 10 + utf_strlen(m->name) +
464 13 + utf_strlen(m->descriptor) +
465 2 + strlen(message) + 1;
467 msg = MNEW(char, len);
469 sprintf(msg, "(class: ");
470 utf_sprint(msg + strlen(msg), m->class->name);
471 sprintf(msg + strlen(msg), ", method: ");
472 utf_sprint(msg + strlen(msg), m->name);
473 sprintf(msg + strlen(msg), ", signature: ");
474 utf_sprint(msg + strlen(msg), m->descriptor);
475 sprintf(msg + strlen(msg), ") %s", message);
477 o = new_exception_message(string_java_lang_VerifyError, msg);
485 /* new_arithmeticexception *****************************************************
487 generates a java.lang.ArithmeticException for the jit compiler
489 *******************************************************************************/
491 java_objectheader *new_arithmeticexception()
493 java_objectheader *e;
495 e = new_exception_message(string_java_lang_ArithmeticException,
496 string_java_lang_ArithmeticException_message);
499 return *exceptionptr;
505 /* new_arrayindexoutofboundsexception ******************************************
507 generates a java.lang.ArrayIndexOutOfBoundsException for the jit compiler
509 *******************************************************************************/
511 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
513 java_objectheader *e;
517 /* convert the index into a String, like Sun does */
519 m = class_resolveclassmethod(class_java_lang_String,
520 utf_new_char("valueOf"),
521 utf_new_char("(I)Ljava/lang/String;"),
522 class_java_lang_Object,
526 return *exceptionptr;
528 s = (java_lang_String *) asm_calljavafunction(m,
539 return *exceptionptr;
541 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
545 return *exceptionptr;
551 /* new_arraystoreexception *****************************************************
553 generates a java.lang.ArrayStoreException for the jit compiler
555 *******************************************************************************/
557 java_objectheader *new_arraystoreexception()
559 java_objectheader *e;
561 e = new_exception(string_java_lang_ArrayStoreException);
564 return *exceptionptr;
570 /* new_classcastexception ******************************************************
572 generates a java.lang.ClassCastException for the jit compiler
574 *******************************************************************************/
576 java_objectheader *new_classcastexception()
578 java_objectheader *e;
580 e = new_exception(string_java_lang_ClassCastException);
583 return *exceptionptr;
589 /* new_negativearraysizeexception **********************************************
591 generates a java.lang.NegativeArraySizeException for the jit compiler
593 *******************************************************************************/
595 java_objectheader *new_negativearraysizeexception()
597 java_objectheader *e;
599 e = new_exception(string_java_lang_NegativeArraySizeException);
602 return *exceptionptr;
608 /* new_nullpointerexception ****************************************************
610 generates a java.lang.NullPointerException for the jit compiler
612 *******************************************************************************/
614 java_objectheader *new_nullpointerexception()
616 java_objectheader *e;
618 e = new_exception(string_java_lang_NullPointerException);
621 return *exceptionptr;
628 * These are local overrides for various environment variables in Emacs.
629 * Please do not remove this and leave it at the end of the file, where
630 * Emacs will automagically detect them.
631 * ---------------------------------------------------------------------
634 * indent-tabs-mode: t