#include "threads/thread.h"
#include "threads/locks.h" /* schani */
-#include "sysdep/native-math.h"
+#include "native-math.h"
builtin_descriptor builtin_desc[] = {
{(functionptr) builtin_instanceof, "instanceof"},
{(functionptr) builtin_checkcast, "checkcast"},
+ {(functionptr) asm_builtin_checkcast, "checkcast"},
{(functionptr) builtin_arrayinstanceof, "arrayinstanceof"},
{(functionptr) builtin_checkarraycast, "checkarraycast"},
{(functionptr) asm_builtin_checkarraycast, "checkarraycast"},
*****************************************************************************/
-static s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
-{
+s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
+{
if (super->flags & ACC_INTERFACE)
return (sub->vftbl->interfacetablelength > super->index) &&
(sub->vftbl->interfacetable[-super->index] != NULL);
+ /*
+ while (sub != 0)
+ if (sub == super)
+ return 1;
+ else
+ sub = sub->super;
+
+ return 0;
+ */
+
return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
(unsigned) (super->vftbl->diffval);
}
s4 builtin_instanceof(java_objectheader *obj, classinfo *class)
{
-#ifdef DEBUG
+ #ifdef DEBUG
log_text ("builtin_instanceof called");
-#endif
+ #endif
if (!obj) return 0;
return builtin_isanysubclass (obj->vftbl->class, class);
if (builtin_isanysubclass (obj->vftbl->class, class))
return 1;
-#if DEBUG
+ /* #if DEBUG */
printf ("#### checkcast failed ");
- unicode_display (obj->vftbl->class->name);
+ utf_display (obj->vftbl->class->name);
printf (" -> ");
- unicode_display (class->name);
+ utf_display (class->name);
printf ("\n");
-#endif
+ /* #endif */
return 0;
}
if (!o) return 1;
if (o->vftbl->class != class_array) {
+#ifdef DEBUG
+ printf ("#### checkarraycast failed 1\n");
+#endif
return 0;
}
if (a->arraytype != desc->arraytype) {
+#ifdef DEBUG
+ printf ("#### checkarraycast failed 2\n");
+#endif
return 0;
}
switch (a->arraytype) {
case ARRAYTYPE_OBJECT: {
java_objectarray *oa = (java_objectarray*) o;
- return builtin_isanysubclass (oa->elementtype, desc->objectclass);
+ int result = builtin_isanysubclass (oa->elementtype, desc->objectclass);
+
+#ifdef DEBUG
+ if (!result)
+ printf ("#### checkarraycast failed 3\n");
+#endif
+ return result;
}
case ARRAYTYPE_ARRAY: {
java_arrayarray *aa = (java_arrayarray*) o;
- return builtin_descriptorscompatible
- (aa->elementdescriptor, desc->elementdescriptor);
+ int result = builtin_descriptorscompatible
+ (aa->elementdescriptor, desc->elementdescriptor);
+
+#ifdef DEBUG
+ if (!result)
+ printf ("#### checkarraycast failed 4\n");
+#endif
+ return result;
}
default:
return 1;
******************************************************************************/
-java_objectheader *builtin_throw_exception (java_objectheader *exceptionptr) {
- unicode_display (exceptionptr->vftbl->class->name);
- printf ("\n");
- fflush (stdout);
- return exceptionptr;
+java_objectheader *builtin_throw_exception (java_objectheader *local_exceptionptr) {
+ if (verbose) {
+ sprintf(logtext, "Builtin exception thrown: ");
+ utf_sprint(logtext + strlen(logtext), local_exceptionptr->vftbl->class->name);
+ dolog();
+ }
+ exceptionptr = local_exceptionptr;
+ return local_exceptionptr;
}
{
java_objectheader *o;
+ class_init(c);
+
#ifdef SIZE_FROM_CLASSINFO
c->alignedsize = align_size(c->instancesize);
o = heap_allocate ( c->alignedsize, true, c->finalizer );
methodindent--;
if (verbose || runverbose) {
printf("Exception ");
- unicode_display (exceptionptr->vftbl->class->name);
+ utf_display (exceptionptr->vftbl->class->name);
printf(" thrown in ");
if (method) {
- unicode_display (method->class->name);
+ utf_display (method->class->name);
printf(".");
- unicode_display (method->name);
+ utf_display (method->name);
if (method->flags & ACC_SYNCHRONIZED)
printf("(SYNC)");
else
{
sprintf (logtext, " ");
sprintf (logtext+methodindent, "called: ");
- unicode_sprint (logtext+strlen(logtext), method->class->name);
+ utf_sprint (logtext+strlen(logtext), method->class->name);
sprintf (logtext+strlen(logtext), ".");
- unicode_sprint (logtext+strlen(logtext), method->name);
- unicode_sprint (logtext+strlen(logtext), method->descriptor);
+ utf_sprint (logtext+strlen(logtext), method->name);
+ utf_sprint (logtext+strlen(logtext), method->descriptor);
sprintf (logtext+strlen(logtext), "(");
switch (method->paramcount) {
case 6:
{
sprintf (logtext, " ");
sprintf (logtext+methodindent, "called: ");
- unicode_sprint (logtext+strlen(logtext), method->class->name);
+ utf_sprint (logtext+strlen(logtext), method->class->name);
sprintf (logtext+strlen(logtext), ".");
- unicode_sprint (logtext+strlen(logtext), method->name);
- unicode_sprint (logtext+strlen(logtext), method->descriptor);
+ utf_sprint (logtext+strlen(logtext), method->name);
+ utf_sprint (logtext+strlen(logtext), method->descriptor);
dolog ();
methodindent++;
}
methodindent--;
sprintf (logtext, " ");
sprintf (logtext+methodindent, "finished: ");
- unicode_sprint (logtext+strlen(logtext), method->class->name);
+ utf_sprint (logtext+strlen(logtext), method->class->name);
sprintf (logtext+strlen(logtext), ".");
- unicode_sprint (logtext+strlen(logtext), method->name);
- unicode_sprint (logtext+strlen(logtext), method->descriptor);
+ utf_sprint (logtext+strlen(logtext), method->name);
+ utf_sprint (logtext+strlen(logtext), method->descriptor);
switch (method->returntype) {
case TYPE_INT:
case TYPE_LONG:
+ case TYPE_ADDRESS:
sprintf (logtext+strlen(logtext), "->%ld", l);
break;
case TYPE_FLOAT:
case TYPE_DOUBLE:
sprintf (logtext+strlen(logtext), "->%g", d);
break;
- case TYPE_ADDRESS:
- sprintf (logtext+strlen(logtext), "->%p", (void*) l);
- break;
}
dolog ();
}
{
sprintf (logtext, " ");
sprintf (logtext+methodindent, "exception abort: ");
- unicode_sprint (logtext+strlen(logtext), method->class->name);
+ utf_sprint (logtext+strlen(logtext), method->class->name);
sprintf (logtext+strlen(logtext), ".");
- unicode_sprint (logtext+strlen(logtext), method->name);
- unicode_sprint (logtext+strlen(logtext), method->descriptor);
+ utf_sprint (logtext+strlen(logtext), method->name);
+ utf_sprint (logtext+strlen(logtext), method->descriptor);
dolog ();
}