1 /* src/vm/exceptions.c - exception related functions
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, 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., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Christian Thalinger
29 Changes: Edwin Steiner
31 $Id: exceptions.c 4566 2006-03-07 10:36:42Z twisti $
45 #include "mm/memory.h"
46 #include "native/native.h"
47 #include "native/include/java_lang_String.h"
48 #include "native/include/java_lang_Throwable.h"
49 #include "toolbox/logging.h"
50 #include "toolbox/util.h"
52 #include "vm/exceptions.h"
53 #include "vm/global.h"
54 #include "vm/loader.h"
55 #include "vm/options.h"
56 #include "vm/stringlocal.h"
58 #include "vm/jit/asmpart.h"
59 #include "vm/jit/jit.h"
60 #include "vm/jit/methodheader.h"
63 /* for raising exceptions from native methods *********************************/
65 #if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
66 java_objectheader *_no_threads_exceptionptr = NULL;
70 /* init_system_exceptions ******************************************************
72 Load and link exceptions used in the system.
74 *******************************************************************************/
76 bool exceptions_init(void)
78 /* java/lang/Throwable */
80 if (!(class_java_lang_Throwable =
81 load_class_bootstrap(utf_java_lang_Throwable)) ||
82 !link_class(class_java_lang_Throwable))
86 /* java/lang/VMThrowable */
88 if (!(class_java_lang_VMThrowable =
89 load_class_bootstrap(utf_java_lang_VMThrowable)) ||
90 !link_class(class_java_lang_VMThrowable))
96 if (!(class_java_lang_Error = load_class_bootstrap(utf_java_lang_Error)) ||
97 !link_class(class_java_lang_Error))
100 /* java/lang/NoClassDefFoundError */
102 if (!(class_java_lang_NoClassDefFoundError =
103 load_class_bootstrap(utf_java_lang_NoClassDefFoundError)) ||
104 !link_class(class_java_lang_NoClassDefFoundError))
107 /* java/lang/LinkageError */
109 if (!(class_java_lang_LinkageError =
110 load_class_bootstrap(utf_java_lang_LinkageError)) ||
111 !link_class(class_java_lang_LinkageError))
114 /* java/lang/NoSuchMethodError */
116 if (!(class_java_lang_NoSuchMethodError =
117 load_class_bootstrap(utf_java_lang_NoSuchMethodError)) ||
118 !link_class(class_java_lang_NoSuchMethodError))
121 /* java/lang/OutOfMemoryError */
123 if (!(class_java_lang_OutOfMemoryError =
124 load_class_bootstrap(utf_java_lang_OutOfMemoryError)) ||
125 !link_class(class_java_lang_OutOfMemoryError))
129 /* java/lang/Exception */
131 if (!(class_java_lang_Exception =
132 load_class_bootstrap(utf_java_lang_Exception)) ||
133 !link_class(class_java_lang_Exception))
136 /* java/lang/ClassNotFoundException */
138 if (!(class_java_lang_ClassNotFoundException =
139 load_class_bootstrap(utf_java_lang_ClassNotFoundException)) ||
140 !link_class(class_java_lang_ClassNotFoundException))
143 /* java/lang/IllegalArgumentException */
145 if (!(class_java_lang_IllegalArgumentException =
146 load_class_bootstrap(utf_java_lang_IllegalArgumentException)) ||
147 !link_class(class_java_lang_IllegalArgumentException))
150 /* java/lang/IllegalMonitorStateException */
152 if (!(class_java_lang_IllegalMonitorStateException =
153 load_class_bootstrap(utf_java_lang_IllegalMonitorStateException)) ||
154 !link_class(class_java_lang_IllegalMonitorStateException))
157 /* java/lang/NullPointerException */
159 if (!(class_java_lang_NullPointerException =
160 load_class_bootstrap(utf_java_lang_NullPointerException)) ||
161 !link_class(class_java_lang_NullPointerException))
169 static void throw_exception_exit_intern(bool doexit)
171 java_objectheader *xptr;
175 xptr = *exceptionptr;
178 /* clear exception, because we are calling jit code again */
179 *exceptionptr = NULL;
181 c = xptr->vftbl->class;
183 pss = class_resolveclassmethod(c,
186 class_java_lang_Object,
189 /* print the stacktrace */
192 (void) vm_call_method(pss, xptr);
194 /* This normally means, we are EXTREMLY out of memory or have a */
195 /* serious problem while printStackTrace. But may be another */
196 /* exception, so print it. */
199 java_lang_Throwable *t;
201 t = (java_lang_Throwable *) *exceptionptr;
203 fprintf(stderr, "Exception while printStackTrace(): ");
204 utf_fprint_classname(stderr, t->header.vftbl->class->name);
206 if (t->detailMessage) {
209 buf = javastring_tochar((java_objectheader *) t->detailMessage);
210 fprintf(stderr, ": %s", buf);
211 MFREE(buf, char, strlen(buf));
214 fprintf(stderr, "\n");
218 utf_fprint_classname(stderr, c->name);
219 fprintf(stderr, ": printStackTrace()V not found!\n");
232 void throw_exception(void)
234 throw_exception_exit_intern(false);
238 void throw_exception_exit(void)
240 throw_exception_exit_intern(true);
244 void throw_main_exception(void)
246 fprintf(stderr, "Exception in thread \"main\" ");
249 throw_exception_exit_intern(false);
253 void throw_main_exception_exit(void)
255 fprintf(stderr, "Exception in thread \"main\" ");
258 throw_exception_exit_intern(true);
262 void throw_cacao_exception_exit(const char *exception, const char *message, ...)
269 len = strlen(exception);
270 tmp = MNEW(char, len + 1);
271 strncpy(tmp, exception, len);
274 /* convert to classname */
276 for (i = len - 1; i >= 0; i--)
277 if (tmp[i] == '/') tmp[i] = '.';
279 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
281 MFREE(tmp, char, len);
283 if (strlen(message) > 0) {
284 fprintf(stderr, ": ");
286 va_start(ap, message);
287 vfprintf(stderr, message, ap);
291 fprintf(stderr, "\n");
300 /* exceptions_throw_outofmemory_exit *******************************************
302 Just print an: java.lang.InternalError: Out of memory
304 *******************************************************************************/
306 void exceptions_throw_outofmemory_exit(void)
308 throw_cacao_exception_exit(string_java_lang_InternalError,
313 /* new_exception ***************************************************************
315 Creates an exception object with the given name and initalizes it.
317 *******************************************************************************/
319 java_objectheader *new_exception(const char *classname)
321 java_objectheader *o;
324 if (!(c = load_class_bootstrap(utf_new_char(classname))))
325 return *exceptionptr;
327 o = native_new_and_init(c);
330 return *exceptionptr;
336 /* new_exception_message *******************************************************
338 Creates an exception object with the given name and initalizes it
339 with the given char message.
341 *******************************************************************************/
343 java_objectheader *new_exception_message(const char *classname,
346 java_objectheader *o;
349 if (!(c = load_class_bootstrap(utf_new_char(classname))))
350 return *exceptionptr;
352 o = native_new_and_init_string(c, javastring_new_char(message));
355 return *exceptionptr;
361 /* new_exception_throwable *****************************************************
363 Creates an exception object with the given name and initalizes it
364 with the given java/lang/Throwable exception.
366 *******************************************************************************/
368 java_objectheader *new_exception_throwable(const char *classname,
369 java_lang_Throwable *throwable)
371 java_objectheader *o;
374 if (!(c = load_class_bootstrap(utf_new_char(classname))))
375 return *exceptionptr;
377 o = native_new_and_init_throwable(c, throwable);
380 return *exceptionptr;
386 /* new_exception_utfmessage ****************************************************
388 Creates an exception object with the given name and initalizes it
389 with the given utf message.
391 *******************************************************************************/
393 java_objectheader *new_exception_utfmessage(const char *classname, utf *message)
395 java_objectheader *o;
398 if (!(c = load_class_bootstrap(utf_new_char(classname))))
399 return *exceptionptr;
401 o = native_new_and_init_string(c, javastring_new(message));
404 return *exceptionptr;
410 /* new_exception_javastring ****************************************************
412 Creates an exception object with the given name and initalizes it
413 with the given java/lang/String message.
415 *******************************************************************************/
417 java_objectheader *new_exception_javastring(const char *classname,
418 java_lang_String *message)
420 java_objectheader *o;
423 if (!(c = load_class_bootstrap(utf_new_char(classname))))
424 return *exceptionptr;
426 o = native_new_and_init_string(c, message);
429 return *exceptionptr;
435 /* new_exception_int ***********************************************************
437 Creates an exception object with the given name and initalizes it
438 with the given int value.
440 *******************************************************************************/
442 java_objectheader *new_exception_int(const char *classname, s4 i)
444 java_objectheader *o;
447 if (!(c = load_class_bootstrap(utf_new_char(classname))))
448 return *exceptionptr;
450 o = native_new_and_init_int(c, i);
453 return *exceptionptr;
459 /* new_classformaterror ********************************************************
461 generates a java.lang.ClassFormatError for the classloader
463 *******************************************************************************/
465 java_objectheader *new_classformaterror(classinfo *c, const char *message, ...)
467 java_objectheader *o;
472 /* calculate message length */
477 msglen += utf_strlen(c->name) + strlen(" (");
479 va_start(ap, message);
480 msglen += get_variable_message_length(message, ap);
484 msglen += strlen(")");
486 msglen += strlen("0");
488 /* allocate a buffer */
490 msg = MNEW(char, msglen);
492 /* print message into allocated buffer */
495 utf_sprint_classname(msg, c->name);
499 va_start(ap, message);
500 vsprintf(msg + strlen(msg), message, ap);
506 o = new_exception_message(string_java_lang_ClassFormatError, msg);
508 MFREE(msg, char, msglen);
514 /* exceptions_throw_classformaterror *******************************************
516 Generates a java.lang.ClassFormatError for the VM system throw it
519 *******************************************************************************/
521 void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
525 va_start(ap, message);
526 *exceptionptr = new_classformaterror(c, message, ap);
531 /* new_classnotfoundexception **************************************************
533 Generates a java.lang.ClassNotFoundException for the classloader.
535 *******************************************************************************/
537 java_objectheader *new_classnotfoundexception(utf *name)
539 java_objectheader *o;
541 o = native_new_and_init_string(class_java_lang_ClassNotFoundException,
542 javastring_new(name));
545 return *exceptionptr;
551 /* new_noclassdeffounderror ****************************************************
553 Generates a java.lang.NoClassDefFoundError
555 *******************************************************************************/
557 java_objectheader *new_noclassdeffounderror(utf *name)
559 java_objectheader *o;
561 o = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
562 javastring_new(name));
565 return *exceptionptr;
571 /* classnotfoundexception_to_noclassdeffounderror ******************************
573 Check the *exceptionptr for a ClassNotFoundException. If it is one,
574 convert it to a NoClassDefFoundError.
576 *******************************************************************************/
578 void classnotfoundexception_to_noclassdeffounderror(void)
580 java_objectheader *xptr;
581 java_objectheader *cause;
585 cause = *exceptionptr;
587 /* convert ClassNotFoundException's to NoClassDefFoundError's */
589 if (builtin_instanceof(cause, class_java_lang_ClassNotFoundException)) {
590 /* clear exception, because we are calling jit code again */
592 *exceptionptr = NULL;
594 /* create new error */
597 new_exception_javastring(string_java_lang_NoClassDefFoundError,
598 ((java_lang_Throwable *) cause)->detailMessage);
600 /* we had an exception while creating the error */
605 /* set new exception */
607 *exceptionptr = xptr;
612 /* new_internalerror ***********************************************************
614 Generates a java.lang.InternalError for the VM.
616 *******************************************************************************/
618 java_objectheader *new_internalerror(const char *message, ...)
620 java_objectheader *o;
625 /* calculate exception message length */
627 va_start(ap, message);
628 msglen = get_variable_message_length(message, ap);
631 /* allocate memory */
633 msg = MNEW(char, msglen);
635 /* generate message */
637 va_start(ap, message);
638 vsprintf(msg, message, ap);
641 /* create exception object */
643 o = new_exception_message(string_java_lang_InternalError, msg);
647 MFREE(msg, char, msglen);
653 /* exceptions_new_linkageerror *************************************************
655 Generates a java.lang.LinkageError with an error message.
656 If c != NULL, the name of c is appended to the error message.
658 *******************************************************************************/
660 java_objectheader *exceptions_new_linkageerror(const char *message,
663 java_objectheader *o;
667 /* calculate exception message length */
669 msglen = strlen(message) + 1;
671 msglen += utf_strlen(c->name);
674 /* allocate memory */
676 msg = MNEW(char, msglen);
678 /* generate message */
682 utf_strcat(msg, c->name);
685 o = native_new_and_init_string(class_java_lang_LinkageError,
686 javastring_new_char(msg));
690 MFREE(msg, char, msglen);
696 /* exceptions_new_nosuchmethoderror ********************************************
698 Generates a java.lang.NoSuchMethodError with an error message.
700 *******************************************************************************/
702 java_objectheader *exceptions_new_nosuchmethoderror(classinfo *c,
703 utf *name, utf *desc)
705 java_objectheader *o;
709 /* calculate exception message length */
711 msglen = utf_strlen(c->name) + strlen(".") + utf_strlen(name) +
712 utf_strlen(desc) + strlen("0");
714 /* allocate memory */
716 msg = MNEW(char, msglen);
718 /* generate message */
720 utf_sprint(msg, c->name);
722 utf_strcat(msg, name);
723 utf_strcat(msg, desc);
725 o = native_new_and_init_string(class_java_lang_NoSuchMethodError,
726 javastring_new_char(msg));
730 MFREE(msg, char, msglen);
736 /* exceptions_throw_nosuchmethoderror ******************************************
738 Generates a java.lang.NoSuchMethodError with an error message.
740 *******************************************************************************/
742 void exceptions_throw_nosuchmethoderror(classinfo *c, utf *name, utf *desc)
744 *exceptionptr = exceptions_new_nosuchmethoderror(c, name, desc);
748 /* new_unsupportedclassversionerror ********************************************
750 generates a java.lang.UnsupportedClassVersionError for the classloader
752 *******************************************************************************/
754 java_objectheader *new_unsupportedclassversionerror(classinfo *c, const char *message, ...)
756 java_objectheader *o;
761 /* calculate exception message length */
763 msglen = utf_strlen(c->name) + strlen(" (") + strlen(")") + strlen("0");
765 va_start(ap, message);
766 msglen += get_variable_message_length(message, ap);
769 /* allocate memory */
771 msg = MNEW(char, msglen);
773 /* generate message */
775 utf_sprint_classname(msg, c->name);
778 va_start(ap, message);
779 vsprintf(msg + strlen(msg), message, ap);
784 /* create exception object */
786 o = new_exception_message(string_java_lang_UnsupportedClassVersionError,
791 MFREE(msg, char, msglen);
797 /* new_verifyerror *************************************************************
799 generates a java.lang.VerifyError for the jit compiler
801 *******************************************************************************/
803 java_objectheader *new_verifyerror(methodinfo *m, const char *message, ...)
805 java_objectheader *o;
810 useinlining = false; /* at least until sure inlining works with exceptions*/
812 /* calculate exception message length */
817 msglen = strlen("(class: ") + utf_strlen(m->class->name) +
818 strlen(", method: ") + utf_strlen(m->name) +
819 strlen(" signature: ") + utf_strlen(m->descriptor) +
820 strlen(") ") + strlen("0");
822 va_start(ap, message);
823 msglen += get_variable_message_length(message, ap);
826 /* allocate memory */
828 msg = MNEW(char, msglen);
830 /* generate message */
833 strcpy(msg, "(class: ");
834 utf_strcat(msg, m->class->name);
835 strcat(msg, ", method: ");
836 utf_strcat(msg, m->name);
837 strcat(msg, " signature: ");
838 utf_strcat(msg, m->descriptor);
842 va_start(ap, message);
843 vsprintf(msg + strlen(msg), message, ap);
846 /* create exception object */
848 o = new_exception_message(string_java_lang_VerifyError, msg);
852 MFREE(msg, char, msglen);
858 /* exceptions_throw_verifyerror_for_stack **************************************
860 throws a java.lang.VerifyError for an invalid stack slot type
862 *******************************************************************************/
864 void exceptions_throw_verifyerror_for_stack(methodinfo *m,int type)
866 java_objectheader *o;
871 /* calculate exception message length */
876 msglen = strlen("(class: ") + utf_strlen(m->class->name) +
877 strlen(", method: ") + utf_strlen(m->name) +
878 strlen(" signature: ") + utf_strlen(m->descriptor) +
879 strlen(") Expecting to find longest-------typename on stack")
882 /* allocate memory */
884 msg = MNEW(char, msglen);
886 /* generate message */
889 strcpy(msg, "(class: ");
890 utf_strcat(msg, m->class->name);
891 strcat(msg, ", method: ");
892 utf_strcat(msg, m->name);
893 strcat(msg, " signature: ");
894 utf_strcat(msg, m->descriptor);
901 strcat(msg,"Expecting to find ");
903 case TYPE_INT: typename = "integer"; break;
904 case TYPE_LNG: typename = "long"; break;
905 case TYPE_FLT: typename = "float"; break;
906 case TYPE_DBL: typename = "double"; break;
907 case TYPE_ADR: typename = "object/array"; break;
910 strcat(msg, typename);
911 strcat(msg, " on stack");
913 /* create exception object */
915 o = new_exception_message(string_java_lang_VerifyError, msg);
919 MFREE(msg, char, msglen);
924 /* new_arithmeticexception *****************************************************
926 Generates a java.lang.ArithmeticException for the jit compiler.
928 *******************************************************************************/
930 java_objectheader *new_arithmeticexception(void)
932 java_objectheader *e;
934 e = new_exception_message(string_java_lang_ArithmeticException,
935 string_java_lang_ArithmeticException_message);
938 return *exceptionptr;
944 /* exceptions_new_arrayindexoutofboundsexception *******************************
946 Generates a java.lang.ArrayIndexOutOfBoundsException for the VM
949 *******************************************************************************/
951 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
953 java_objectheader *e;
955 java_objectheader *o;
958 /* convert the index into a String, like Sun does */
960 m = class_resolveclassmethod(class_java_lang_String,
961 utf_new_char("valueOf"),
962 utf_new_char("(I)Ljava/lang/String;"),
963 class_java_lang_Object,
967 return *exceptionptr;
969 o = vm_call_method(m, NULL, index);
971 s = (java_lang_String *) o;
974 return *exceptionptr;
976 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
980 return *exceptionptr;
986 /* exceptions_throw_arrayindexoutofboundsexception *****************************
988 Generates a java.lang.ArrayIndexOutOfBoundsException for the VM
991 *******************************************************************************/
993 void exceptions_throw_arrayindexoutofboundsexception(void)
995 java_objectheader *e;
997 e = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
1006 /* new_arraystoreexception *****************************************************
1008 generates a java.lang.ArrayStoreException for the jit compiler
1010 *******************************************************************************/
1012 java_objectheader *new_arraystoreexception(void)
1014 java_objectheader *e;
1016 e = new_exception(string_java_lang_ArrayStoreException);
1017 /* e = native_new_and_init(class_java_lang_ArrayStoreException); */
1020 return *exceptionptr;
1026 /* new_classcastexception ******************************************************
1028 generates a java.lang.ClassCastException for the jit compiler
1030 *******************************************************************************/
1032 java_objectheader *new_classcastexception(void)
1034 java_objectheader *e;
1036 e = new_exception(string_java_lang_ClassCastException);
1039 return *exceptionptr;
1045 /* exceptions_new_illegalargumentexception *************************************
1047 Generates a java.lang.IllegalArgumentException for the VM system.
1049 *******************************************************************************/
1051 java_objectheader *new_illegalargumentexception(void)
1053 java_objectheader *e;
1055 e = native_new_and_init(class_java_lang_IllegalArgumentException);
1058 return *exceptionptr;
1064 /* exceptions_throw_illegalargumentexception ***********************************
1066 Generates a java.lang.IllegalArgumentException for the VM system
1067 and throw it in the VM system.
1069 *******************************************************************************/
1071 void exceptions_throw_illegalargumentexception(void)
1073 *exceptionptr = new_illegalargumentexception();
1077 /* new_illegalmonitorstateexception ********************************************
1079 Generates a java.lang.IllegalMonitorStateException for the VM
1082 *******************************************************************************/
1084 java_objectheader *new_illegalmonitorstateexception(void)
1086 java_objectheader *e;
1088 e = native_new_and_init(class_java_lang_IllegalMonitorStateException);
1091 return *exceptionptr;
1097 /* exceptions_new_negativearraysizeexception ***********************************
1099 Generates a java.lang.NegativeArraySizeException for the VM system.
1101 *******************************************************************************/
1103 java_objectheader *new_negativearraysizeexception(void)
1105 java_objectheader *e;
1107 e = new_exception(string_java_lang_NegativeArraySizeException);
1110 return *exceptionptr;
1116 /* exceptions_throw_negativearraysizeexception *********************************
1118 Generates a java.lang.NegativeArraySizeException for the VM system.
1120 *******************************************************************************/
1122 void exceptions_throw_negativearraysizeexception(void)
1124 *exceptionptr = new_negativearraysizeexception();
1128 /* new_nullpointerexception ****************************************************
1130 generates a java.lang.NullPointerException for the jit compiler
1132 *******************************************************************************/
1134 java_objectheader *new_nullpointerexception(void)
1136 java_objectheader *e;
1138 e = native_new_and_init(class_java_lang_NullPointerException);
1141 return *exceptionptr;
1147 /* exceptions_throw_nullpointerexception ***************************************
1149 Generates a java.lang.NullPointerException for the VM system and
1150 throw it in the VM system.
1152 *******************************************************************************/
1154 void exceptions_throw_nullpointerexception(void)
1156 *exceptionptr = new_nullpointerexception();
1160 /* exceptions_new_stringindexoutofboundsexception ******************************
1162 Generates a java.lang.StringIndexOutOfBoundsException for the VM
1165 *******************************************************************************/
1167 java_objectheader *exceptions_new_stringindexoutofboundsexception(void)
1169 java_objectheader *e;
1171 e = new_exception(string_java_lang_StringIndexOutOfBoundsException);
1174 return *exceptionptr;
1180 /* exceptions_throw_stringindexoutofboundsexception ****************************
1182 Throws a java.lang.StringIndexOutOfBoundsException for the VM
1185 *******************************************************************************/
1187 void exceptions_throw_stringindexoutofboundsexception(void)
1189 *exceptionptr = exceptions_new_stringindexoutofboundsexception();
1193 /* exceptions_handle_exception *************************************************
1197 *******************************************************************************/
1199 u1 *exceptions_handle_exception(java_objectheader *xptr, u1 *xpc, u1 *pv, u1 *sp)
1205 s4 exceptiontablelength;
1207 classref_or_classinfo cr;
1209 #if defined(USE_THREADS)
1210 java_objectheader *o;
1213 /* get methodinfo pointer from method header */
1215 m = *((methodinfo **) (pv + MethodPointer));
1216 framesize = *((s4 *) (pv + FrameSize));
1217 issync = *((s4 *) (pv + IsSync));
1218 ex = (exceptionentry *) (pv + ExTableStart);
1219 exceptiontablelength = *((s4 *) (pv + ExTableSize));
1221 /* print exception trace */
1223 if (opt_verbose || opt_verbosecall || opt_verboseexception)
1224 builtin_trace_exception(xptr, m, xpc, 1);
1226 for (i = 0; i < exceptiontablelength; i++) {
1227 /* ATTENTION: keep this here, as we need to decrement the
1228 pointer before the loop executes! */
1232 /* is the xpc is the current catch range */
1234 if ((ex->startpc <= xpc) && (xpc < ex->endpc)) {
1237 /* NULL catches everything */
1239 if (cr.any == NULL) {
1240 #if !defined(NDEBUG)
1241 /* Print stacktrace of exception when caught. */
1243 if (opt_verboseexception) {
1244 exceptions_print_exception(xptr);
1245 stacktrace_print_trace(xptr);
1249 return ex->handlerpc;
1252 /* resolve or load/link the exception class */
1254 if (IS_CLASSREF(cr)) {
1255 c = resolve_classref_eager(cr.ref);
1260 if (!(c->state & CLASS_LOADED))
1261 /* use the methods' classloader */
1262 if (!load_class_from_classloader(c->name,
1263 m->class->classloader))
1266 if (!(c->state & CLASS_LINKED))
1271 /* is the thrown exception an instance of the catch class? */
1273 if (builtin_instanceof(xptr, c)) {
1274 #if !defined(NDEBUG)
1275 /* Print stacktrace of exception when caught. */
1277 if (opt_verboseexception) {
1278 exceptions_print_exception(xptr);
1279 stacktrace_print_trace(xptr);
1283 return ex->handlerpc;
1288 #if defined(USE_THREADS)
1289 /* is this method synchronized? */
1292 /* get synchronization object */
1294 # if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
1295 /* XXX change this if we ever want to use 4-byte stackslots */
1296 o = *((java_objectheader **) (sp + issync - 8));
1298 o = *((java_objectheader **) (sp + issync - SIZEOF_VOID_P));
1303 builtin_monitorexit(o);
1307 /* none of the exceptions catch this one */
1313 /* exceptions_print_exception **************************************************
1315 Prints an exception, the detail message and the cause, if
1316 available, with CACAO internal functions to stdout.
1318 *******************************************************************************/
1320 #if !defined(NDEBUG)
1321 void exceptions_print_exception(java_objectheader *xptr)
1323 java_lang_Throwable *t;
1324 java_lang_Throwable *cause;
1327 t = (java_lang_Throwable *) xptr;
1336 /* print the root exception */
1338 utf_display_classname(t->header.vftbl->class->name);
1340 if (t->detailMessage) {
1341 u = javastring_toutf(t->detailMessage, false);
1349 /* print the cause if available */
1351 if (cause && (cause != t)) {
1352 printf("Caused by: ");
1353 utf_display_classname(cause->header.vftbl->class->name);
1355 if (cause->detailMessage) {
1356 u = javastring_toutf(cause->detailMessage, false);
1365 #endif /* !defined(NDEBUG) */
1369 * These are local overrides for various environment variables in Emacs.
1370 * Please do not remove this and leave it at the end of the file, where
1371 * Emacs will automagically detect them.
1372 * ---------------------------------------------------------------------
1375 * indent-tabs-mode: t
1379 * vim:noexpandtab:sw=4:ts=4: