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 1628 2004-11-30 19:14:41Z carolyn $
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 char *string_java_lang_Throwable =
62 "java/lang/Throwable";
64 char *string_java_lang_VMThrowable =
65 "java/lang/VMThrowable";
68 /* specify some exception strings for code generation */
70 char *string_java_lang_ArithmeticException =
71 "java/lang/ArithmeticException";
73 char *string_java_lang_ArithmeticException_message =
76 char *string_java_lang_ArrayIndexOutOfBoundsException =
77 "java/lang/ArrayIndexOutOfBoundsException";
79 char *string_java_lang_ArrayStoreException =
80 "java/lang/ArrayStoreException";
82 char *string_java_lang_ClassCastException =
83 "java/lang/ClassCastException";
85 char *string_java_lang_ClassNotFoundException =
86 "java/lang/ClassNotFoundException";
88 char *string_java_lang_CloneNotSupportedException =
89 "java/lang/CloneNotSupportedException";
91 char *string_java_lang_Exception =
92 "java/lang/Exception";
94 char *string_java_lang_IllegalArgumentException =
95 "java/lang/IllegalArgumentException";
97 char *string_java_lang_IllegalMonitorStateException =
98 "java/lang/IllegalMonitorStateException";
100 char *string_java_lang_IndexOutOfBoundsException =
101 "java/lang/IndexOutOfBoundsException";
103 char *string_java_lang_InterruptedException =
104 "java/lang/InterruptedException";
106 char *string_java_lang_NegativeArraySizeException =
107 "java/lang/NegativeArraySizeException";
109 char *string_java_lang_NoSuchFieldException =
110 "java/lang/NoSuchFieldException";
112 char *string_java_lang_NoSuchMethodException =
113 "java/lang/NoSuchMethodException";
115 char *string_java_lang_NullPointerException =
116 "java/lang/NullPointerException";
119 /* specify some error strings for code generation */
121 char *string_java_lang_AbstractMethodError =
122 "java/lang/AbstractMethodError";
124 char *string_java_lang_ClassCircularityError =
125 "java/lang/ClassCircularityError";
127 char *string_java_lang_ClassFormatError =
128 "java/lang/ClassFormatError";
130 char *string_java_lang_Error =
133 char *string_java_lang_ExceptionInInitializerError =
134 "java/lang/ExceptionInInitializerError";
136 char *string_java_lang_IncompatibleClassChangeError =
137 "java/lang/IncompatibleClassChangeError";
139 char *string_java_lang_InternalError =
140 "java/lang/InternalError";
142 char *string_java_lang_LinkageError =
143 "java/lang/LinkageError";
145 char *string_java_lang_NoClassDefFoundError =
146 "java/lang/NoClassDefFoundError";
148 char *string_java_lang_NoSuchFieldError =
149 "java/lang/NoSuchFieldError";
151 char *string_java_lang_NoSuchMethodError =
152 "java/lang/NoSuchMethodError";
154 char *string_java_lang_OutOfMemoryError =
155 "java/lang/OutOfMemoryError";
157 char *string_java_lang_UnsupportedClassVersionError =
158 "java/lang/UnsupportedClassVersionError";
160 char *string_java_lang_VerifyError =
161 "java/lang/VerifyError";
163 char *string_java_lang_VirtualMachineError =
164 "java/lang/VirtualMachineError";
167 /* init_system_exceptions *****************************************************
169 load, link and compile exceptions used in the system
171 *******************************************************************************/
173 bool init_system_exceptions(void)
175 /* java/lang/Throwable */
177 class_java_lang_Throwable =
178 class_new(utf_new_char(string_java_lang_Throwable));
180 if (!class_load(class_java_lang_Throwable))
183 if (!class_link(class_java_lang_Throwable))
187 /* java/lang/Exception */
189 class_java_lang_Exception =
190 class_new(utf_new_char(string_java_lang_Exception));
192 if (!class_load(class_java_lang_Exception))
195 if (!class_link(class_java_lang_Exception))
199 /* java/lang/Error */
201 class_java_lang_Error =
202 class_new(utf_new_char(string_java_lang_Error));
204 if (!class_load(class_java_lang_Error))
207 if (!class_link(class_java_lang_Error))
211 /* java/lang/OutOfMemoryError */
213 class_java_lang_OutOfMemoryError =
214 class_new(utf_new_char(string_java_lang_OutOfMemoryError));
216 if (!class_load(class_java_lang_OutOfMemoryError))
219 if (!class_link(class_java_lang_OutOfMemoryError))
226 static void throw_exception_exit_intern(bool doexit)
228 java_objectheader *xptr;
232 xptr = *exceptionptr;
235 /* clear exception, because we are calling jit code again */
236 *exceptionptr = NULL;
238 c = xptr->vftbl->class;
240 pss = class_resolveclassmethod(c,
241 utf_new_char("printStackTrace"),
243 class_java_lang_Object,
246 /* print the stacktrace */
248 asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
250 /* this normally means, we are EXTREMLY out of memory, but may be
251 any other exception */
253 utf_fprint_classname(stderr, c->name);
254 fprintf(stderr, "\n");
258 utf_fprint_classname(stderr, c->name);
259 fprintf(stderr, ": printStackTrace()V not found!\n");
272 void throw_exception()
274 throw_exception_exit_intern(false);
278 void throw_exception_exit()
280 throw_exception_exit_intern(true);
284 void throw_main_exception()
286 fprintf(stderr, "Exception in thread \"main\" ");
289 throw_exception_exit_intern(false);
293 void throw_main_exception_exit()
295 fprintf(stderr, "Exception in thread \"main\" ");
298 throw_exception_exit_intern(true);
302 void throw_cacao_exception_exit(const char *exception, const char *message, ...)
309 len = strlen(exception);
310 tmp = MNEW(char, len + 1);
311 strncpy(tmp, exception, len);
314 /* convert to classname */
316 for (i = len - 1; i >= 0; i--) {
317 if (tmp[i] == '/') tmp[i] = '.';
320 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
322 MFREE(tmp, char, len);
324 if (strlen(message) > 0) {
325 fprintf(stderr, ": ");
327 va_start(ap, message);
328 vfprintf(stderr, message, ap);
332 fprintf(stderr, "\n");
341 #define CREATENEW_EXCEPTION(ex) \
344 #define CREATENEW_EXCEPTION(ex) \
345 java_objectheader *newEx; \
346 java_objectheader *oldexception=*exceptionptr;\
349 *exceptionptr=oldexception;\
353 java_objectheader *new_exception(char *classname)
355 classinfo *c = class_new(utf_new_char(classname));
357 CREATENEW_EXCEPTION(native_new_and_init(c));
360 java_objectheader *new_exception_message(char *classname, char *message)
362 classinfo *c = class_new(utf_new_char(classname));
364 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
368 java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
370 classinfo *c = class_new(utf_new_char(classname));
372 CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
376 java_objectheader *new_exception_utfmessage(char *classname, utf *message)
378 classinfo *c = class_new(utf_new_char(classname));
380 CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
384 java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
386 classinfo *c = class_new(utf_new_char(classname));
388 CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
392 java_objectheader *new_exception_int(char *classname, s4 i)
396 c = class_new(utf_new_char(classname));
398 CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
402 /* new_classformaterror ********************************************************
404 generates a java.lang.ClassFormatError for the classloader
406 *******************************************************************************/
408 java_objectheader *new_classformaterror(classinfo *c, char *message, ...)
410 char msg[MAXLOGTEXT];
413 utf_sprint_classname(msg, c->name);
414 sprintf(msg + strlen(msg), " (");
416 va_start(ap, message);
417 vsprintf(msg + strlen(msg), message, ap);
420 sprintf(msg + strlen(msg), ")");
422 return new_exception_message(string_java_lang_ClassFormatError, msg);
426 /* new_unsupportedclassversionerror ********************************************
428 generates a java.lang.UnsupportedClassVersionError for the classloader
430 *******************************************************************************/
432 java_objectheader *new_unsupportedclassversionerror(classinfo *c, char *message, ...)
434 char msg[MAXLOGTEXT];
437 utf_sprint_classname(msg, c->name);
438 sprintf(msg + strlen(msg), " (");
440 va_start(ap, message);
441 vsprintf(msg + strlen(msg), message, ap);
444 sprintf(msg + strlen(msg), ")");
446 return new_exception_message(string_java_lang_UnsupportedClassVersionError,
451 /* new_verifyerror *************************************************************
453 generates a java.lang.VerifyError for the jit compiler
455 *******************************************************************************/
457 java_objectheader *new_verifyerror(methodinfo *m, char *message)
459 java_objectheader *o;
463 len = 8 + utf_strlen(m->class->name) +
464 10 + utf_strlen(m->name) +
465 13 + utf_strlen(m->descriptor) +
466 2 + strlen(message) + 1;
468 msg = MNEW(char, len);
470 sprintf(msg, "(class: ");
471 utf_sprint(msg + strlen(msg), m->class->name);
472 sprintf(msg + strlen(msg), ", method: ");
473 utf_sprint(msg + strlen(msg), m->name);
474 sprintf(msg + strlen(msg), ", signature: ");
475 utf_sprint(msg + strlen(msg), m->descriptor);
476 sprintf(msg + strlen(msg), ") %s", message);
478 o = new_exception_message(string_java_lang_VerifyError, msg);
486 /* new_arithmeticexception *****************************************************
488 generates a java.lang.ArithmeticException for the jit compiler
490 *******************************************************************************/
492 java_objectheader *new_arithmeticexception()
494 java_objectheader *e;
496 e = new_exception_message(string_java_lang_ArithmeticException,
497 string_java_lang_ArithmeticException_message);
500 return *exceptionptr;
506 /* new_arrayindexoutofboundsexception ******************************************
508 generates a java.lang.ArrayIndexOutOfBoundsException for the jit compiler
510 *******************************************************************************/
512 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
514 java_objectheader *e;
518 /* convert the index into a String, like Sun does */
520 m = class_resolveclassmethod(class_java_lang_String,
521 utf_new_char("valueOf"),
522 utf_new_char("(I)Ljava/lang/String;"),
523 class_java_lang_Object,
527 return *exceptionptr;
529 s = (java_lang_String *) asm_calljavafunction(m,
540 return *exceptionptr;
542 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
546 return *exceptionptr;
552 /* new_arraystoreexception *****************************************************
554 generates a java.lang.ArrayStoreException for the jit compiler
556 *******************************************************************************/
558 java_objectheader *new_arraystoreexception()
560 java_objectheader *e;
562 e = new_exception(string_java_lang_ArrayStoreException);
565 return *exceptionptr;
571 /* new_classcastexception ******************************************************
573 generates a java.lang.ClassCastException for the jit compiler
575 *******************************************************************************/
577 java_objectheader *new_classcastexception()
579 java_objectheader *e;
581 e = new_exception(string_java_lang_ClassCastException);
584 return *exceptionptr;
590 /* new_negativearraysizeexception **********************************************
592 generates a java.lang.NegativeArraySizeException for the jit compiler
594 *******************************************************************************/
596 java_objectheader *new_negativearraysizeexception()
598 java_objectheader *e;
600 e = new_exception(string_java_lang_NegativeArraySizeException);
603 return *exceptionptr;
609 /* new_nullpointerexception ****************************************************
611 generates a java.lang.NullPointerException for the jit compiler
613 *******************************************************************************/
615 java_objectheader *new_nullpointerexception()
617 java_objectheader *e;
619 e = new_exception(string_java_lang_NullPointerException);
622 return *exceptionptr;
629 * These are local overrides for various environment variables in Emacs.
630 * Please do not remove this and leave it at the end of the file, where
631 * Emacs will automagically detect them.
632 * ---------------------------------------------------------------------
635 * indent-tabs-mode: t