Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: exceptions.c 7941 2007-05-23 11:59:51Z twisti $
+ $Id: exceptions.c 7942 2007-05-23 12:40:31Z twisti $
*/
#include "native/include/java_lang_String.h"
#include "native/include/java_lang_Throwable.h"
-#if defined(ENABLE_THREADS)
-# include "threads/native/threads.h"
-#else
-# include "threads/none/threads.h"
-#endif
+#include "threads/lock-common.h"
+#include "threads/threads-common.h"
#include "toolbox/logging.h"
#include "toolbox/util.h"
}
-/* new_exception_message *******************************************************
-
- Creates an exception object with the given name and initalizes it
- with the given char message.
-
- IN:
- classname....class name in UTF-8
- message......message in UTF-8
-
- RETURN VALUE:
- an exception pointer (in any case -- either it is the newly created
- exception, or an exception thrown while trying to create it).
-
-*******************************************************************************/
-
-static java_objectheader *new_exception_message(const char *classname,
- const char *message)
-{
- java_objectheader *o;
- java_objectheader *s;
-
- s = javastring_new_from_utf_string(message);
-
- if (s == NULL)
- return *exceptionptr;
-
- o = exceptions_new_utf_javastring(classname, s);
-
- return o;
-}
-
-
/* exceptions_throw_class_utf **************************************************
Creates an exception object of the given class, initalizes and
classloader.
IN:
- c............the class in which the error was found
+ c....the class in which the error was found
*******************************************************************************/
void exceptions_throw_classcircularityerror(classinfo *c)
{
- java_objectheader *o;
- char *msg;
- s4 msglen;
-
- /* calculate message length */
-
- msglen = utf_bytes(c->name) + strlen("0");
-
- /* allocate a buffer */
-
- msg = MNEW(char, msglen);
-
- /* print message into allocated buffer */
-
- utf_copy_classname(msg, c->name);
-
- o = new_exception_message(utf_java_lang_ClassCircularityError, msg);
-
- MFREE(msg, char, msglen);
-
- if (o == NULL)
- return;
-
- *exceptionptr = o;
+ exceptions_throw_utf_utf(utf_java_lang_ClassCircularityError, c->name);
}
void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
{
- java_objectheader *o;
- char *msg;
- s4 msglen;
- va_list ap;
+ char *msg;
+ s4 msglen;
+ va_list ap;
+ utf *u;
/* calculate message length */
if (c != NULL)
strcat(msg, ")");
- o = new_exception_message(utf_java_lang_ClassFormatError, msg);
+ u = utf_new_char(msg);
+
+ /* free memory */
MFREE(msg, char, msglen);
- *exceptionptr = o;
+ /* throw exception */
+
+ exceptions_throw_utf_utf(utf_java_lang_ClassFormatError, u);
}
java_objectheader *xptr;
java_objectheader *cause;
java_lang_Throwable *t;
- java_lang_String *s;
+ java_objectheader *s;
/* get the cause */
/* create new error */
t = (java_lang_Throwable *) cause;
- s = t->detailMessage;
+ s = (java_objectheader *) t->detailMessage;
- xptr = exceptions_new_utf_javastring(utf_java_lang_NoClassDefFoundError, s);
+ xptr = exceptions_new_utf_javastring(utf_java_lang_NoClassDefFoundError,
+ s);
/* we had an exception while creating the error */
void exceptions_throw_incompatibleclasschangeerror(classinfo *c, const char *message)
{
- java_objectheader *o;
- char *msg;
- s4 msglen;
+ char *msg;
+ s4 msglen;
+ utf *u;
/* calculate exception message length */
utf_copy_classname(msg, c->name);
strcat(msg, message);
- o = native_new_and_init_string(utf_java_lang_IncompatibleClassChangeError,
- javastring_new_from_utf_string(msg));
+ u = utf_new_char(msg);
/* free memory */
MFREE(msg, char, msglen);
- if (o == NULL)
- return;
+ /* throw exception */
- *exceptionptr = o;
+ exceptions_throw_utf_utf(utf_java_lang_IncompatibleClassChangeError, u);
}
void exceptions_throw_internalerror(const char *message, ...)
{
- java_objectheader *o;
- va_list ap;
- char *msg;
- s4 msglen;
+ va_list ap;
+ char *msg;
+ s4 msglen;
+ utf *u;
/* calculate exception message length */
vsprintf(msg, message, ap);
va_end(ap);
- /* create exception object */
-
- o = new_exception_message(utf_java_lang_InternalError, msg);
+ u = utf_new_char(msg);
/* free memory */
MFREE(msg, char, msglen);
- if (o == NULL)
- return;
+ /* throw exception */
- *exceptionptr = o;
+ exceptions_throw_utf_utf(utf_java_lang_InternalError, u);
}
void exceptions_throw_unsupportedclassversionerror(classinfo *c, u4 ma, u4 mi)
{
- java_objectheader *o;
- char *msg;
- s4 msglen;
+ char *msg;
+ s4 msglen;
+ utf *u;
/* calculate exception message length */
sprintf(msg + strlen(msg), " (Unsupported major.minor version %d.%d)",
ma, mi);
- /* create exception object */
-
- o = new_exception_message(utf_java_lang_UnsupportedClassVersionError, msg);
+ u = utf_new_char(msg);
/* free memory */
MFREE(msg, char, msglen);
- if (o == NULL)
- return;
+ /* throw exception */
- *exceptionptr = o;
+ exceptions_throw_utf_utf(utf_java_lang_UnsupportedClassVersionError, u);
}
void exceptions_throw_verifyerror(methodinfo *m, const char *message, ...)
{
- java_objectheader *o;
- va_list ap;
- char *msg;
- s4 msglen;
+ va_list ap;
+ char *msg;
+ s4 msglen;
+ utf *u;
/* calculate exception message length */
vsprintf(msg + strlen(msg), message, ap);
va_end(ap);
- /* create exception object */
-
- o = new_exception_message(utf_java_lang_VerifyError, msg);
+ u = utf_new_char(msg);
/* free memory */
MFREE(msg, char, msglen);
- *exceptionptr = o;
+ /* throw exception */
+
+ exceptions_throw_utf_utf(utf_java_lang_VerifyError, u);
}
*******************************************************************************/
-void exceptions_throw_verifyerror_for_stack(methodinfo *m,int type)
+void exceptions_throw_verifyerror_for_stack(methodinfo *m, int type)
{
- java_objectheader *o;
- char *msg;
- s4 msglen;
- char *typename;
+ char *msg;
+ s4 msglen;
+ char *typename;
+ utf *u;
/* calculate exception message length */
msglen = 0;
- if (m)
+ if (m != NULL)
msglen = strlen("(class: ") + utf_bytes(m->class->name) +
strlen(", method: ") + utf_bytes(m->name) +
strlen(" signature: ") + utf_bytes(m->descriptor) +
/* generate message */
- if (m) {
+ if (m != NULL) {
strcpy(msg, "(class: ");
utf_cat_classname(msg, m->class->name);
strcat(msg, ", method: ");
msg[0] = 0;
}
- strcat(msg,"Expecting to find ");
+ strcat(msg, "Expecting to find ");
+
switch (type) {
case TYPE_INT: typename = "integer"; break;
case TYPE_LNG: typename = "long"; break;
case TYPE_RET: typename = "returnAddress"; break;
default: typename = "<INVALID>"; assert(0); break;
}
+
strcat(msg, typename);
strcat(msg, " on stack");
- /* create exception object */
-
- o = new_exception_message(utf_java_lang_VerifyError, msg);
+ u = utf_new_char(msg);
/* free memory */
MFREE(msg, char, msglen);
- *exceptionptr = o;
+ /* throw exception */
+
+ exceptions_throw_utf_utf(utf_java_lang_VerifyError, u);
}
{
java_objectheader *o;
- o = new_exception_message(utf_java_lang_ArithmeticException, "/ by zero");
-
- if (o == NULL)
- return *exceptionptr;
+ o = exceptions_new_utf_utf(utf_java_lang_ArithmeticException,
+ utf_division_by_zero);
return o;
}
{
java_objectheader *e;
utf *classname;
- java_lang_String *s;
classname = o->vftbl->class->name;
- s = javastring_new(classname);
-
- e = native_new_and_init_string(class_java_lang_ClassCastException, s);
-
- if (e == NULL)
- return *exceptionptr;
+ e = exceptions_new_class_utf(class_java_lang_ClassCastException, classname);
return e;
}
utf_display_printable_ascii_classname(t->header.vftbl->class->name);
if (t->detailMessage != NULL) {
- u = javastring_toutf(t->detailMessage, false);
+ u = javastring_toutf((java_objectheader *) t->detailMessage, false);
printf(": ");
utf_display_printable_ascii(u);
printf("Caused by: ");
utf_display_printable_ascii_classname(cause->header.vftbl->class->name);
- if (cause->detailMessage) {
- u = javastring_toutf(cause->detailMessage, false);
+ if (cause->detailMessage != NULL) {
+ u = javastring_toutf((java_objectheader *) cause->detailMessage,
+ false);
printf(": ");
utf_display_printable_ascii(u);