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 4484 2006-02-12 00:25:12Z 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"
57 #include "vm/jit/asmpart.h"
58 #include "vm/jit/jit.h"
59 #include "vm/jit/methodheader.h"
62 /* for raising exceptions from native methods *********************************/
64 #if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
65 java_objectheader *_no_threads_exceptionptr = NULL;
69 /* init_system_exceptions ******************************************************
71 Load and link exceptions used in the system.
73 *******************************************************************************/
75 bool exceptions_init(void)
77 /* java/lang/Throwable */
79 if (!(class_java_lang_Throwable =
80 load_class_bootstrap(utf_java_lang_Throwable)) ||
81 !link_class(class_java_lang_Throwable))
85 /* java/lang/VMThrowable */
87 if (!(class_java_lang_VMThrowable =
88 load_class_bootstrap(utf_java_lang_VMThrowable)) ||
89 !link_class(class_java_lang_VMThrowable))
95 if (!(class_java_lang_Error = load_class_bootstrap(utf_java_lang_Error)) ||
96 !link_class(class_java_lang_Error))
99 /* java/lang/NoClassDefFoundError */
101 if (!(class_java_lang_NoClassDefFoundError =
102 load_class_bootstrap(utf_java_lang_NoClassDefFoundError)) ||
103 !link_class(class_java_lang_NoClassDefFoundError))
106 /* java/lang/LinkageError */
108 if (!(class_java_lang_LinkageError =
109 load_class_bootstrap(utf_java_lang_LinkageError)) ||
110 !link_class(class_java_lang_LinkageError))
113 /* java/lang/NoSuchMethodError */
115 if (!(class_java_lang_NoSuchMethodError =
116 load_class_bootstrap(utf_java_lang_NoSuchMethodError)) ||
117 !link_class(class_java_lang_NoSuchMethodError))
120 /* java/lang/OutOfMemoryError */
122 if (!(class_java_lang_OutOfMemoryError =
123 load_class_bootstrap(utf_java_lang_OutOfMemoryError)) ||
124 !link_class(class_java_lang_OutOfMemoryError))
128 /* java/lang/Exception */
130 if (!(class_java_lang_Exception =
131 load_class_bootstrap(utf_java_lang_Exception)) ||
132 !link_class(class_java_lang_Exception))
135 /* java/lang/ClassNotFoundException */
137 if (!(class_java_lang_ClassNotFoundException =
138 load_class_bootstrap(utf_java_lang_ClassNotFoundException)) ||
139 !link_class(class_java_lang_ClassNotFoundException))
142 /* java/lang/IllegalArgumentException */
144 if (!(class_java_lang_IllegalArgumentException =
145 load_class_bootstrap(utf_java_lang_IllegalArgumentException)) ||
146 !link_class(class_java_lang_IllegalArgumentException))
149 /* java/lang/IllegalMonitorStateException */
151 if (!(class_java_lang_IllegalMonitorStateException =
152 load_class_bootstrap(utf_java_lang_IllegalMonitorStateException)) ||
153 !link_class(class_java_lang_IllegalMonitorStateException))
156 /* java/lang/NullPointerException */
158 if (!(class_java_lang_NullPointerException =
159 load_class_bootstrap(utf_java_lang_NullPointerException)) ||
160 !link_class(class_java_lang_NullPointerException))
168 static void throw_exception_exit_intern(bool doexit)
170 java_objectheader *xptr;
174 xptr = *exceptionptr;
177 /* clear exception, because we are calling jit code again */
178 *exceptionptr = NULL;
180 c = xptr->vftbl->class;
182 pss = class_resolveclassmethod(c,
185 class_java_lang_Object,
188 /* print the stacktrace */
191 ASM_CALLJAVAFUNCTION(pss, xptr, NULL, NULL, NULL);
193 /* This normally means, we are EXTREMLY out of memory or have a */
194 /* serious problem while printStackTrace. But may be another */
195 /* exception, so print it. */
198 java_lang_Throwable *t;
200 t = (java_lang_Throwable *) *exceptionptr;
202 fprintf(stderr, "Exception while printStackTrace(): ");
203 utf_fprint_classname(stderr, t->header.vftbl->class->name);
205 if (t->detailMessage) {
208 buf = javastring_tochar((java_objectheader *) t->detailMessage);
209 fprintf(stderr, ": %s", buf);
210 MFREE(buf, char, strlen(buf));
213 fprintf(stderr, "\n");
217 utf_fprint_classname(stderr, c->name);
218 fprintf(stderr, ": printStackTrace()V not found!\n");
231 void throw_exception(void)
233 throw_exception_exit_intern(false);
237 void throw_exception_exit(void)
239 throw_exception_exit_intern(true);
243 void throw_main_exception(void)
245 fprintf(stderr, "Exception in thread \"main\" ");
248 throw_exception_exit_intern(false);
252 void throw_main_exception_exit(void)
254 fprintf(stderr, "Exception in thread \"main\" ");
257 throw_exception_exit_intern(true);
261 void throw_cacao_exception_exit(const char *exception, const char *message, ...)
268 len = strlen(exception);
269 tmp = MNEW(char, len + 1);
270 strncpy(tmp, exception, len);
273 /* convert to classname */
275 for (i = len - 1; i >= 0; i--)
276 if (tmp[i] == '/') tmp[i] = '.';
278 fprintf(stderr, "Exception in thread \"main\" %s", tmp);
280 MFREE(tmp, char, len);
282 if (strlen(message) > 0) {
283 fprintf(stderr, ": ");
285 va_start(ap, message);
286 vfprintf(stderr, message, ap);
290 fprintf(stderr, "\n");
299 /* exceptions_throw_outofmemory_exit *******************************************
301 Just print an: java.lang.InternalError: Out of memory
303 *******************************************************************************/
305 void exceptions_throw_outofmemory_exit(void)
307 throw_cacao_exception_exit(string_java_lang_InternalError,
312 /* new_exception ***************************************************************
314 Creates an exception object with the given name and initalizes it.
316 *******************************************************************************/
318 java_objectheader *new_exception(const char *classname)
320 java_objectheader *o;
323 if (!(c = load_class_bootstrap(utf_new_char(classname))))
324 return *exceptionptr;
326 o = native_new_and_init(c);
329 return *exceptionptr;
335 /* new_exception_message *******************************************************
337 Creates an exception object with the given name and initalizes it
338 with the given char message.
340 *******************************************************************************/
342 java_objectheader *new_exception_message(const char *classname,
345 java_objectheader *o;
348 if (!(c = load_class_bootstrap(utf_new_char(classname))))
349 return *exceptionptr;
351 o = native_new_and_init_string(c, javastring_new_char(message));
354 return *exceptionptr;
360 /* new_exception_throwable *****************************************************
362 Creates an exception object with the given name and initalizes it
363 with the given java/lang/Throwable exception.
365 *******************************************************************************/
367 java_objectheader *new_exception_throwable(const char *classname,
368 java_lang_Throwable *throwable)
370 java_objectheader *o;
373 if (!(c = load_class_bootstrap(utf_new_char(classname))))
374 return *exceptionptr;
376 o = native_new_and_init_throwable(c, throwable);
379 return *exceptionptr;
385 /* new_exception_utfmessage ****************************************************
387 Creates an exception object with the given name and initalizes it
388 with the given utf message.
390 *******************************************************************************/
392 java_objectheader *new_exception_utfmessage(const char *classname, utf *message)
394 java_objectheader *o;
397 if (!(c = load_class_bootstrap(utf_new_char(classname))))
398 return *exceptionptr;
400 o = native_new_and_init_string(c, javastring_new(message));
403 return *exceptionptr;
409 /* new_exception_javastring ****************************************************
411 Creates an exception object with the given name and initalizes it
412 with the given java/lang/String message.
414 *******************************************************************************/
416 java_objectheader *new_exception_javastring(const char *classname,
417 java_lang_String *message)
419 java_objectheader *o;
422 if (!(c = load_class_bootstrap(utf_new_char(classname))))
423 return *exceptionptr;
425 o = native_new_and_init_string(c, message);
428 return *exceptionptr;
434 /* new_exception_int ***********************************************************
436 Creates an exception object with the given name and initalizes it
437 with the given int value.
439 *******************************************************************************/
441 java_objectheader *new_exception_int(const char *classname, s4 i)
443 java_objectheader *o;
446 if (!(c = load_class_bootstrap(utf_new_char(classname))))
447 return *exceptionptr;
449 o = native_new_and_init_int(c, i);
452 return *exceptionptr;
458 /* new_classformaterror ********************************************************
460 generates a java.lang.ClassFormatError for the classloader
462 *******************************************************************************/
464 java_objectheader *new_classformaterror(classinfo *c, const char *message, ...)
466 java_objectheader *o;
471 /* calculate message length */
476 msglen += utf_strlen(c->name) + strlen(" (");
478 va_start(ap, message);
479 msglen += get_variable_message_length(message, ap);
483 msglen += strlen(")");
485 msglen += strlen("0");
487 /* allocate a buffer */
489 msg = MNEW(char, msglen);
491 /* print message into allocated buffer */
494 utf_sprint_classname(msg, c->name);
498 va_start(ap, message);
499 vsprintf(msg + strlen(msg), message, ap);
505 o = new_exception_message(string_java_lang_ClassFormatError, msg);
507 MFREE(msg, char, msglen);
513 /* exceptions_throw_classformaterror *******************************************
515 Generates a java.lang.ClassFormatError for the VM system throw it
518 *******************************************************************************/
520 void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
524 va_start(ap, message);
525 *exceptionptr = new_classformaterror(c, message, ap);
530 /* new_classnotfoundexception **************************************************
532 Generates a java.lang.ClassNotFoundException for the classloader.
534 *******************************************************************************/
536 java_objectheader *new_classnotfoundexception(utf *name)
538 java_objectheader *o;
540 o = native_new_and_init_string(class_java_lang_ClassNotFoundException,
541 javastring_new(name));
544 return *exceptionptr;
550 /* new_noclassdeffounderror ****************************************************
552 Generates a java.lang.NoClassDefFoundError
554 *******************************************************************************/
556 java_objectheader *new_noclassdeffounderror(utf *name)
558 java_objectheader *o;
560 o = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
561 javastring_new(name));
564 return *exceptionptr;
570 /* classnotfoundexception_to_noclassdeffounderror ******************************
572 Check the *exceptionptr for a ClassNotFoundException. If it is one,
573 convert it to a NoClassDefFoundError.
575 *******************************************************************************/
577 void classnotfoundexception_to_noclassdeffounderror(void)
579 java_objectheader *xptr;
580 java_objectheader *cause;
584 cause = *exceptionptr;
586 /* convert ClassNotFoundException's to NoClassDefFoundError's */
588 if (builtin_instanceof(cause, class_java_lang_ClassNotFoundException)) {
589 /* clear exception, because we are calling jit code again */
591 *exceptionptr = NULL;
593 /* create new error */
596 new_exception_javastring(string_java_lang_NoClassDefFoundError,
597 ((java_lang_Throwable *) cause)->detailMessage);
599 /* we had an exception while creating the error */
604 /* set new exception */
606 *exceptionptr = xptr;
611 /* new_internalerror ***********************************************************
613 Generates a java.lang.InternalError for the VM.
615 *******************************************************************************/
617 java_objectheader *new_internalerror(const char *message, ...)
619 java_objectheader *o;
624 /* calculate exception message length */
626 va_start(ap, message);
627 msglen = get_variable_message_length(message, ap);
630 /* allocate memory */
632 msg = MNEW(char, msglen);
634 /* generate message */
636 va_start(ap, message);
637 vsprintf(msg, message, ap);
640 /* create exception object */
642 o = new_exception_message(string_java_lang_InternalError, msg);
646 MFREE(msg, char, msglen);
652 /* exceptions_new_linkageerror *************************************************
654 Generates a java.lang.LinkageError with an error message.
655 If c != NULL, the name of c is appended to the error message.
657 *******************************************************************************/
659 java_objectheader *exceptions_new_linkageerror(const char *message,
662 java_objectheader *o;
666 /* calculate exception message length */
668 msglen = strlen(message) + 1;
670 msglen += utf_strlen(c->name);
673 /* allocate memory */
675 msg = MNEW(char, msglen);
677 /* generate message */
681 utf_strcat(msg, c->name);
684 o = native_new_and_init_string(class_java_lang_LinkageError,
685 javastring_new_char(msg));
689 MFREE(msg, char, msglen);
695 /* exceptions_new_nosuchmethoderror ********************************************
697 Generates a java.lang.NoSuchMethodError with an error message.
699 *******************************************************************************/
701 java_objectheader *exceptions_new_nosuchmethoderror(classinfo *c,
702 utf *name, utf *desc)
704 java_objectheader *o;
708 /* calculate exception message length */
710 msglen = utf_strlen(c->name) + strlen(".") + utf_strlen(name) +
711 utf_strlen(desc) + strlen("0");
713 /* allocate memory */
715 msg = MNEW(char, msglen);
717 /* generate message */
719 utf_sprint(msg, c->name);
721 utf_strcat(msg, name);
722 utf_strcat(msg, desc);
724 o = native_new_and_init_string(class_java_lang_NoSuchMethodError,
725 javastring_new_char(msg));
729 MFREE(msg, char, msglen);
735 /* exceptions_throw_nosuchmethoderror ******************************************
737 Generates a java.lang.NoSuchMethodError with an error message.
739 *******************************************************************************/
741 void exceptions_throw_nosuchmethoderror(classinfo *c, utf *name, utf *desc)
743 *exceptionptr = exceptions_new_nosuchmethoderror(c, name, desc);
747 /* new_unsupportedclassversionerror ********************************************
749 generates a java.lang.UnsupportedClassVersionError for the classloader
751 *******************************************************************************/
753 java_objectheader *new_unsupportedclassversionerror(classinfo *c, const char *message, ...)
755 java_objectheader *o;
760 /* calculate exception message length */
762 msglen = utf_strlen(c->name) + strlen(" (") + strlen(")") + strlen("0");
764 va_start(ap, message);
765 msglen += get_variable_message_length(message, ap);
768 /* allocate memory */
770 msg = MNEW(char, msglen);
772 /* generate message */
774 utf_sprint_classname(msg, c->name);
777 va_start(ap, message);
778 vsprintf(msg + strlen(msg), message, ap);
783 /* create exception object */
785 o = new_exception_message(string_java_lang_UnsupportedClassVersionError,
790 MFREE(msg, char, msglen);
796 /* new_verifyerror *************************************************************
798 generates a java.lang.VerifyError for the jit compiler
800 *******************************************************************************/
802 java_objectheader *new_verifyerror(methodinfo *m, const char *message, ...)
804 java_objectheader *o;
809 useinlining = false; /* at least until sure inlining works with exceptions*/
811 /* calculate exception message length */
816 msglen = strlen("(class: ") + utf_strlen(m->class->name) +
817 strlen(", method: ") + utf_strlen(m->name) +
818 strlen(" signature: ") + utf_strlen(m->descriptor) +
819 strlen(") ") + strlen("0");
821 va_start(ap, message);
822 msglen += get_variable_message_length(message, ap);
825 /* allocate memory */
827 msg = MNEW(char, msglen);
829 /* generate message */
832 strcpy(msg, "(class: ");
833 utf_strcat(msg, m->class->name);
834 strcat(msg, ", method: ");
835 utf_strcat(msg, m->name);
836 strcat(msg, " signature: ");
837 utf_strcat(msg, m->descriptor);
841 va_start(ap, message);
842 vsprintf(msg + strlen(msg), message, ap);
845 /* create exception object */
847 o = new_exception_message(string_java_lang_VerifyError, msg);
851 MFREE(msg, char, msglen);
857 /* exceptions_throw_verifyerror_for_stack **************************************
859 throws a java.lang.VerifyError for an invalid stack slot type
861 *******************************************************************************/
863 void exceptions_throw_verifyerror_for_stack(methodinfo *m,int type)
865 java_objectheader *o;
870 /* calculate exception message length */
875 msglen = strlen("(class: ") + utf_strlen(m->class->name) +
876 strlen(", method: ") + utf_strlen(m->name) +
877 strlen(" signature: ") + utf_strlen(m->descriptor) +
878 strlen(") Expecting to find longest-------typename on stack")
881 /* allocate memory */
883 msg = MNEW(char, msglen);
885 /* generate message */
888 strcpy(msg, "(class: ");
889 utf_strcat(msg, m->class->name);
890 strcat(msg, ", method: ");
891 utf_strcat(msg, m->name);
892 strcat(msg, " signature: ");
893 utf_strcat(msg, m->descriptor);
900 strcat(msg,"Expecting to find ");
902 case TYPE_INT: typename = "integer"; break;
903 case TYPE_LNG: typename = "long"; break;
904 case TYPE_FLT: typename = "float"; break;
905 case TYPE_DBL: typename = "double"; break;
906 case TYPE_ADR: typename = "object/array"; break;
909 strcat(msg, typename);
910 strcat(msg, " on stack");
912 /* create exception object */
914 o = new_exception_message(string_java_lang_VerifyError, msg);
918 MFREE(msg, char, msglen);
923 /* new_arithmeticexception *****************************************************
925 Generates a java.lang.ArithmeticException for the jit compiler.
927 *******************************************************************************/
929 java_objectheader *new_arithmeticexception(void)
931 java_objectheader *e;
933 e = new_exception_message(string_java_lang_ArithmeticException,
934 string_java_lang_ArithmeticException_message);
937 return *exceptionptr;
943 /* exceptions_new_arrayindexoutofboundsexception *******************************
945 Generates a java.lang.ArrayIndexOutOfBoundsException for the VM
948 *******************************************************************************/
950 java_objectheader *new_arrayindexoutofboundsexception(s4 index)
952 java_objectheader *e;
954 java_objectheader *o;
957 /* convert the index into a String, like Sun does */
959 m = class_resolveclassmethod(class_java_lang_String,
960 utf_new_char("valueOf"),
961 utf_new_char("(I)Ljava/lang/String;"),
962 class_java_lang_Object,
966 return *exceptionptr;
968 ASM_CALLJAVAFUNCTION_ADR(o, m, (void *) (ptrint) index, NULL, NULL, NULL);
970 s = (java_lang_String *) o;
973 return *exceptionptr;
975 e = new_exception_javastring(string_java_lang_ArrayIndexOutOfBoundsException,
979 return *exceptionptr;
985 /* exceptions_throw_arrayindexoutofboundsexception *****************************
987 Generates a java.lang.ArrayIndexOutOfBoundsException for the VM
990 *******************************************************************************/
992 void exceptions_throw_arrayindexoutofboundsexception(void)
994 java_objectheader *e;
996 e = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
1005 /* new_arraystoreexception *****************************************************
1007 generates a java.lang.ArrayStoreException for the jit compiler
1009 *******************************************************************************/
1011 java_objectheader *new_arraystoreexception(void)
1013 java_objectheader *e;
1015 e = new_exception(string_java_lang_ArrayStoreException);
1016 /* e = native_new_and_init(class_java_lang_ArrayStoreException); */
1019 return *exceptionptr;
1025 /* new_classcastexception ******************************************************
1027 generates a java.lang.ClassCastException for the jit compiler
1029 *******************************************************************************/
1031 java_objectheader *new_classcastexception(void)
1033 java_objectheader *e;
1035 e = new_exception(string_java_lang_ClassCastException);
1038 return *exceptionptr;
1044 /* exceptions_new_illegalargumentexception *************************************
1046 Generates a java.lang.IllegalArgumentException for the VM system.
1048 *******************************************************************************/
1050 java_objectheader *new_illegalargumentexception(void)
1052 java_objectheader *e;
1054 e = native_new_and_init(class_java_lang_IllegalArgumentException);
1057 return *exceptionptr;
1063 /* exceptions_throw_illegalargumentexception ***********************************
1065 Generates a java.lang.IllegalArgumentException for the VM system
1066 and throw it in the VM system.
1068 *******************************************************************************/
1070 void exceptions_throw_illegalargumentexception(void)
1072 *exceptionptr = new_illegalargumentexception();
1076 /* new_illegalmonitorstateexception ********************************************
1078 Generates a java.lang.IllegalMonitorStateException for the VM
1081 *******************************************************************************/
1083 java_objectheader *new_illegalmonitorstateexception(void)
1085 java_objectheader *e;
1087 e = native_new_and_init(class_java_lang_IllegalMonitorStateException);
1090 return *exceptionptr;
1096 /* exceptions_new_negativearraysizeexception ***********************************
1098 Generates a java.lang.NegativeArraySizeException for the VM system.
1100 *******************************************************************************/
1102 java_objectheader *new_negativearraysizeexception(void)
1104 java_objectheader *e;
1106 e = new_exception(string_java_lang_NegativeArraySizeException);
1109 return *exceptionptr;
1115 /* exceptions_throw_negativearraysizeexception *********************************
1117 Generates a java.lang.NegativeArraySizeException for the VM system.
1119 *******************************************************************************/
1121 void exceptions_throw_negativearraysizeexception(void)
1123 *exceptionptr = new_negativearraysizeexception();
1127 /* new_nullpointerexception ****************************************************
1129 generates a java.lang.NullPointerException for the jit compiler
1131 *******************************************************************************/
1133 java_objectheader *new_nullpointerexception(void)
1135 java_objectheader *e;
1137 e = native_new_and_init(class_java_lang_NullPointerException);
1140 return *exceptionptr;
1146 /* exceptions_throw_nullpointerexception ***************************************
1148 Generates a java.lang.NullPointerException for the VM system and
1149 throw it in the VM system.
1151 *******************************************************************************/
1153 void exceptions_throw_nullpointerexception(void)
1155 *exceptionptr = new_nullpointerexception();
1159 /* exceptions_handle_exception *************************************************
1163 *******************************************************************************/
1165 u1 *exceptions_handle_exception(java_objectheader *xptr, u1 *xpc, u1 *pv, u1 *sp)
1171 s4 exceptiontablelength;
1173 classref_or_classinfo cr;
1175 #if defined(USE_THREADS)
1176 java_objectheader *o;
1179 /* get methodinfo pointer from method header */
1181 m = *((methodinfo **) (pv + MethodPointer));
1182 framesize = *((s4 *) (pv + FrameSize));
1183 issync = *((s4 *) (pv + IsSync));
1184 ex = (exceptionentry *) (pv + ExTableStart);
1185 exceptiontablelength = *((s4 *) (pv + ExTableSize));
1189 printf("exceptions_handle_exception(%p, %p, %p, %p): ", xptr, xpc, pv, sp);
1190 utf_display(m->class->name);
1192 utf_display(m->name);
1193 utf_display(m->descriptor);
1194 printf(", %d\n", exceptiontablelength);
1198 /* print exception trace */
1200 if (opt_verbose || runverbose || opt_verboseexception)
1201 builtin_trace_exception(xptr, m, xpc, 1);
1203 for (i = 0; i < exceptiontablelength; i++) {
1204 /* ATTENTION: keep this here, as we need to decrement the
1205 pointer before the loop executes! */
1209 /* is the xpc is the current catch range */
1211 if (ex->startpc <= xpc && xpc < ex->endpc) {
1214 /* NULL catches everything */
1217 return ex->handlerpc;
1219 /* resolve or load/link the exception class */
1221 if (IS_CLASSREF(cr)) {
1222 c = resolve_classref_eager(cr.ref);
1227 if (!(c->state & CLASS_LOADED))
1228 /* use the methods' classloader */
1229 if (!load_class_from_classloader(c->name,
1230 m->class->classloader))
1233 if (!(c->state & CLASS_LINKED))
1238 /* is the thrown exception an instance of the catch class? */
1240 if (builtin_instanceof(xptr, c))
1241 return ex->handlerpc;
1245 #if defined(USE_THREADS)
1246 /* is this method synchronized? */
1249 /* get synchronization object */
1251 # if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
1252 /* XXX change this if we ever want to use 4-byte stackslots */
1253 o = *((java_objectheader **) (sp + issync - 8));
1255 o = *((java_objectheader **) (sp + issync - SIZEOF_VOID_P));
1260 builtin_monitorexit(o);
1264 /* none of the exceptions catch this one */
1270 /* exceptions_print_exception **************************************************
1272 Prints an exception, the detail message and the cause, if
1273 available, with CACAO internal functions to stdout.
1275 *******************************************************************************/
1277 #if !defined(NDEBUG)
1278 void exceptions_print_exception(java_objectheader *xptr)
1280 java_lang_Throwable *t;
1281 java_lang_Throwable *cause;
1284 t = (java_lang_Throwable *) xptr;
1293 /* print the root exception */
1295 utf_display_classname(t->header.vftbl->class->name);
1297 if (t->detailMessage) {
1298 u = javastring_toutf(t->detailMessage, false);
1306 /* print the cause if available */
1308 if (cause && (cause != t)) {
1309 printf("Caused by: ");
1310 utf_display_classname(cause->header.vftbl->class->name);
1312 if (cause->detailMessage) {
1313 u = javastring_toutf(cause->detailMessage, false);
1322 #endif /* !defined(NDEBUG) */
1326 * These are local overrides for various environment variables in Emacs.
1327 * Please do not remove this and leave it at the end of the file, where
1328 * Emacs will automagically detect them.
1329 * ---------------------------------------------------------------------
1332 * indent-tabs-mode: t
1336 * vim:noexpandtab:sw=4:ts=4: