Changed some blockInts assertions to > 0.
[cacao.git] / builtin.c
index 1d1cf3a01879743db902189415e330d6991efd5d..a2977346aba7baba45360be43a51cafc237cc4dd 100644 (file)
--- a/builtin.c
+++ b/builtin.c
 #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"},
@@ -121,12 +122,22 @@ builtin_descriptor builtin_desc[] = {
                        
 *****************************************************************************/                 
 
-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);
 }
@@ -144,9 +155,9 @@ static s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
 
 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);
@@ -175,13 +186,13 @@ s4 builtin_checkcast(java_objectheader *obj, classinfo *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;
 }
@@ -240,22 +251,40 @@ s4 builtin_checkarraycast(java_objectheader *o, constant_arraydescriptor *desc)
 
        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;
@@ -275,11 +304,14 @@ s4 builtin_arrayinstanceof
 
 ******************************************************************************/
 
-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;
 }
 
 
@@ -342,6 +374,8 @@ java_objectheader *builtin_new (classinfo *c)
 {
        java_objectheader *o;
 
+       class_init(c);
+
 #ifdef SIZE_FROM_CLASSINFO
        c->alignedsize = align_size(c->instancesize);
        o = heap_allocate ( c->alignedsize, true, c->finalizer );
@@ -798,12 +832,12 @@ java_objectheader *builtin_trace_exception (java_objectheader *exceptionptr,
                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
@@ -823,10 +857,10 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
 {
        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:
@@ -861,10 +895,10 @@ void builtin_displaymethodstart(methodinfo *method)
 {
        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++;
 }
@@ -874,22 +908,20 @@ void builtin_displaymethodstop(methodinfo *method, long l, double d)
        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 ();
 }
@@ -898,10 +930,10 @@ void builtin_displaymethodexception(methodinfo *method)
 {
        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 ();
 }