nativeLoad remove #ifdef JOWENNDEBUG
[cacao.git] / builtin.c
index 90541b5107052ef8d00e303d8cb9bd57bbbd08de..ae8f01742b4923add036e91635961a3d66f8f627 100644 (file)
--- a/builtin.c
+++ b/builtin.c
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 1296 2004-07-10 17:02:15Z stefan $
+   $Id: builtin.c 1369 2004-08-01 21:53:32Z stefan $
 
 */
 
 
-#include "global.h"
 #include <assert.h>
 #include <string.h>
 #include <math.h>
+#include "exceptions.h"
+#include "global.h"
 #include "options.h"
 #include "builtin.h"
 #include "native.h"
@@ -262,16 +263,16 @@ s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target)
 
 ******************************************************************************/
 
-java_objectheader *builtin_throw_exception(java_objectheader *local_exceptionptr)
+java_objectheader *builtin_throw_exception(java_objectheader *xptr)
 {
        if (verbose) {
                char logtext[MAXLOGTEXT];
                sprintf(logtext, "Builtin exception thrown: ");
-               if (local_exceptionptr) {
-                       java_lang_Throwable *t = (java_lang_Throwable *) local_exceptionptr;
+               if (xptr) {
+                       java_lang_Throwable *t = (java_lang_Throwable *) xptr;
 
                        utf_sprint_classname(logtext + strlen(logtext),
-                                                                local_exceptionptr->vftbl->class->name);
+                                                                xptr->vftbl->class->name);
 
                        if (t->detailMessage) {
                                sprintf(logtext + strlen(logtext), ": %s",
@@ -284,9 +285,9 @@ java_objectheader *builtin_throw_exception(java_objectheader *local_exceptionptr
                log_text(logtext);
        }
 
-       *exceptionptr = local_exceptionptr;
+       *exceptionptr = xptr;
 
-       return local_exceptionptr;
+       return xptr;
 }
 
 
@@ -477,10 +478,13 @@ java_objectheader *builtin_new(classinfo *c)
 
        if (!o)
                return NULL;
-       
+
        memset(o, 0, c->instancesize);
 
        o->vftbl = c->vftbl;
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       initObjectLock(o);
+#endif
 
        return o;
 }
@@ -518,6 +522,8 @@ java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl)
 #ifdef SIZE_FROM_CLASSINFO
        actualsize = align_size(dataoffset + size * componentsize);
        actualsize = dataoffset + size * componentsize;
+#else
+       actualsize = 0;
 #endif
 
        if (((u4) actualsize) < ((u4) size)) { /* overflow */
@@ -535,6 +541,9 @@ java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl)
        memset(a, 0, actualsize);
 
        a->objheader.vftbl = arrayvftbl;
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       initObjectLock(&a->objheader);
+#endif
        a->size = size;
 #ifdef SIZE_FROM_CLASSINFO
        a->alignedsize = actualsize;
@@ -756,11 +765,11 @@ java_arrayheader *builtin_nmultianewarray(int n, vftbl_t *arrayvftbl, long *dims
 
 u4 methodindent = 0;
 
-java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
-                                                                                  methodinfo *method,
-                                                                                  int *pos,
-                                                                                  int line,
-                                                                                  int noindent)
+java_objectheader *builtin_trace_exception(java_objectheader *xptr,
+                                                                                  methodinfo *m,
+                                                                                  void *pos,
+                                                                                  s4 line,
+                                                                                  s4 noindent)
 {
        if (!noindent) {
                if (methodindent)
@@ -769,33 +778,33 @@ java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                        log_text("WARNING: unmatched methodindent--");
        }
        if (verbose || runverbose || verboseexception) {
-               if (_exceptionptr) {
+               if (xptr) {
                        printf("Exception ");
-                       utf_display_classname(_exceptionptr->vftbl->class->name);
+                       utf_display_classname(xptr->vftbl->class->name);
 
                } else {
                        printf("Some Throwable");
                }
                printf(" thrown in ");
 
-               if (method) {
-                       utf_display_classname(method->class->name);
+               if (m) {
+                       utf_display_classname(m->class->name);
                        printf(".");
-                       utf_display(method->name);
-                       if (method->flags & ACC_SYNCHRONIZED)
+                       utf_display(m->name);
+                       if (m->flags & ACC_SYNCHRONIZED)
                                printf("(SYNC");
                        else
                                printf("(NOSYNC");
-                       if (method->flags & ACC_NATIVE) {
+                       if (m->flags & ACC_NATIVE) {
                                printf(",NATIVE");
-                               printf(")(%p) at position %p\n", method->entrypoint, pos);
+                               printf(")(%p) at position %p\n", m->entrypoint, pos);
                        } else {
-                               printf(")(%p) at position %p (",method->entrypoint,pos);
-                               if (method->class->sourcefile==NULL)
+                               printf(")(%p) at position %p (", m->entrypoint, pos);
+                               if (m->class->sourcefile==NULL)
                                        printf("<NO CLASSFILE INFORMATION>");
                                else
-                                       utf_display(method->class->sourcefile);
-                               printf(":%d)\n",line);
+                                       utf_display(m->class->sourcefile);
+                               printf(":%d)\n", line);
                        }
 
                } else
@@ -803,7 +812,7 @@ java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                fflush (stdout);
        }
 
-       return _exceptionptr;
+       return xptr;
 }
 
 
@@ -812,35 +821,35 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5,
 #if TRACE_ARGS_NUM > 6
                                                s8 a6, s8 a7,
 #endif
-                                               methodinfo *method)
+                                               methodinfo *m)
 {
-       int i;
+       s4 i;
        char logtext[MAXLOGTEXT];
        for (i = 0; i < methodindent; i++)
                logtext[i] = '\t';
 
        sprintf(logtext + methodindent, "called: ");
-       utf_sprint_classname(logtext + strlen(logtext), method->class->name);
+       utf_sprint_classname(logtext + strlen(logtext), m->class->name);
        sprintf(logtext + strlen(logtext), ".");
-       utf_sprint(logtext + strlen(logtext), method->name);
-       utf_sprint_classname(logtext + strlen(logtext), method->descriptor);
-
-       if ( method->flags & ACC_PUBLIC )       sprintf (logtext + strlen(logtext)," PUBLIC");
-       if ( method->flags & ACC_PRIVATE )      sprintf (logtext + strlen(logtext)," PRIVATE");
-       if ( method->flags & ACC_PROTECTED )    sprintf (logtext + strlen(logtext)," PROTECTED");
-       if ( method->flags & ACC_STATIC )       sprintf (logtext + strlen(logtext)," STATIC");
-       if ( method->flags & ACC_FINAL )        sprintf (logtext + strlen(logtext)," FINAL");
-       if ( method->flags & ACC_SYNCHRONIZED ) sprintf (logtext + strlen(logtext)," SYNCHRONIZED");
-       if ( method->flags & ACC_VOLATILE )     sprintf (logtext + strlen(logtext)," VOLATILE");
-       if ( method->flags & ACC_TRANSIENT )    sprintf (logtext + strlen(logtext)," TRANSIENT");
-       if ( method->flags & ACC_NATIVE )       sprintf (logtext + strlen(logtext)," NATIVE");
-       if ( method->flags & ACC_INTERFACE )    sprintf (logtext + strlen(logtext)," INTERFACE");
-       if ( method->flags & ACC_ABSTRACT )     sprintf (logtext + strlen(logtext)," ABSTRACT");
+       utf_sprint(logtext + strlen(logtext), m->name);
+       utf_sprint_classname(logtext + strlen(logtext), m->descriptor);
+
+       if (m->flags & ACC_PUBLIC)       sprintf(logtext + strlen(logtext), " PUBLIC");
+       if (m->flags & ACC_PRIVATE)      sprintf(logtext + strlen(logtext), " PRIVATE");
+       if (m->flags & ACC_PROTECTED)    sprintf(logtext + strlen(logtext), " PROTECTED");
+       if (m->flags & ACC_STATIC)       sprintf(logtext + strlen(logtext), " STATIC");
+       if (m->flags & ACC_FINAL)        sprintf(logtext + strlen(logtext), " FINAL");
+       if (m->flags & ACC_SYNCHRONIZED) sprintf(logtext + strlen(logtext), " SYNCHRONIZED");
+       if (m->flags & ACC_VOLATILE)     sprintf(logtext + strlen(logtext), " VOLATILE");
+       if (m->flags & ACC_TRANSIENT)    sprintf(logtext + strlen(logtext), " TRANSIENT");
+       if (m->flags & ACC_NATIVE)       sprintf(logtext + strlen(logtext), " NATIVE");
+       if (m->flags & ACC_INTERFACE)    sprintf(logtext + strlen(logtext), " INTERFACE");
+       if (m->flags & ACC_ABSTRACT)     sprintf(logtext + strlen(logtext), " ABSTRACT");
        
 
        sprintf(logtext + strlen(logtext), "(");
 
-       switch (method->paramcount) {
+       switch (m->paramcount) {
        case 0:
                break;
 
@@ -885,12 +894,12 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5,
 
        default:
                sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx, %llx, %llx, ...(%d)",
-                               a0,   a1,   a2,   a3,   a4,   a5,   a6,   a7,   method->paramcount - 8);
+                               a0,   a1,   a2,   a3,   a4,   a5,   a6,   a7,   m->paramcount - 8);
                break;
 #else
        default:
                sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx, ...(%d)",
-                               a0,   a1,   a2,   a3,   a4,   a5,   method->paramcount - 6);
+                               a0,   a1,   a2,   a3,   a4,   a5,   m->paramcount - 6);
                break;
 #endif
 #else
@@ -934,12 +943,12 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5,
 
        default:
                sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx, ...(%d)",
-                               a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  method->paramcount - 8);
+                               a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  m->paramcount - 8);
                break;
 #else
        default:
                sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, ...(%d)",
-                               a0,  a1,  a2,  a3,  a4,  a5,   method->paramcount - 6);
+                               a0,  a1,  a2,  a3,  a4,  a5,   m->paramcount - 6);
                break;
 #endif
 #endif
@@ -953,34 +962,34 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5,
 #endif
 
 
-void builtin_displaymethodstart(methodinfo *method)
+void builtin_displaymethodstart(methodinfo *m)
 {
        char logtext[MAXLOGTEXT];
        sprintf(logtext, "                                                                                              ");
        sprintf(logtext + methodindent, "called: ");
-       utf_sprint(logtext + strlen(logtext), method->class->name);
+       utf_sprint(logtext + strlen(logtext), m->class->name);
        sprintf(logtext + strlen(logtext), ".");
-       utf_sprint(logtext + strlen(logtext), method->name);
-       utf_sprint(logtext + strlen(logtext), method->descriptor);
-
-       if ( method->flags & ACC_PUBLIC )       sprintf (logtext + strlen(logtext)," PUBLIC");
-       if ( method->flags & ACC_PRIVATE )      sprintf (logtext + strlen(logtext)," PRIVATE");
-       if ( method->flags & ACC_PROTECTED )    sprintf (logtext + strlen(logtext)," PROTECTED");
-       if ( method->flags & ACC_STATIC )       sprintf (logtext + strlen(logtext)," STATIC");
-       if ( method->flags & ACC_FINAL )        sprintf (logtext + strlen(logtext)," FINAL");
-       if ( method->flags & ACC_SYNCHRONIZED ) sprintf (logtext + strlen(logtext)," SYNCHRONIZED");
-       if ( method->flags & ACC_VOLATILE )     sprintf (logtext + strlen(logtext)," VOLATILE");
-       if ( method->flags & ACC_TRANSIENT )    sprintf (logtext + strlen(logtext)," TRANSIENT");
-       if ( method->flags & ACC_NATIVE )       sprintf (logtext + strlen(logtext)," NATIVE");
-       if ( method->flags & ACC_INTERFACE )    sprintf (logtext + strlen(logtext)," INTERFACE");
-       if ( method->flags & ACC_ABSTRACT )     sprintf (logtext + strlen(logtext)," ABSTRACT");
+       utf_sprint(logtext + strlen(logtext), m->name);
+       utf_sprint(logtext + strlen(logtext), m->descriptor);
+
+       if (m->flags & ACC_PUBLIC)       sprintf(logtext + strlen(logtext), " PUBLIC");
+       if (m->flags & ACC_PRIVATE)      sprintf(logtext + strlen(logtext), " PRIVATE");
+       if (m->flags & ACC_PROTECTED)    sprintf(logtext + strlen(logtext), " PROTECTED");
+       if (m->flags & ACC_STATIC)       sprintf(logtext + strlen(logtext), " STATIC");
+       if (m->flags & ACC_FINAL)        sprintf(logtext + strlen(logtext), " FINAL");
+       if (m->flags & ACC_SYNCHRONIZED) sprintf(logtext + strlen(logtext), " SYNCHRONIZED");
+       if (m->flags & ACC_VOLATILE)     sprintf(logtext + strlen(logtext), " VOLATILE");
+       if (m->flags & ACC_TRANSIENT)    sprintf(logtext + strlen(logtext), " TRANSIENT");
+       if (m->flags & ACC_NATIVE)       sprintf(logtext + strlen(logtext), " NATIVE");
+       if (m->flags & ACC_INTERFACE)    sprintf(logtext + strlen(logtext), " INTERFACE");
+       if (m->flags & ACC_ABSTRACT)     sprintf(logtext + strlen(logtext), " ABSTRACT");
 
        log_text(logtext);
        methodindent++;
 }
 
 
-void builtin_displaymethodstop(methodinfo *method, s8 l, double d, float f)
+void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f)
 {
        int i;
        char logtext[MAXLOGTEXT];
@@ -992,12 +1001,12 @@ void builtin_displaymethodstop(methodinfo *method, s8 l, double d, float f)
                log_text("WARNING: unmatched methodindent--");
 
        sprintf(logtext + methodindent, "finished: ");
-       utf_sprint_classname(logtext + strlen(logtext), method->class->name);
+       utf_sprint_classname(logtext + strlen(logtext), m->class->name);
        sprintf(logtext + strlen(logtext), ".");
-       utf_sprint(logtext + strlen(logtext), method->name);
-       utf_sprint_classname(logtext + strlen(logtext), method->descriptor);
+       utf_sprint(logtext + strlen(logtext), m->name);
+       utf_sprint_classname(logtext + strlen(logtext), m->descriptor);
 
-       switch (method->returntype) {
+       switch (m->returntype) {
        case TYPE_INT:
                sprintf(logtext + strlen(logtext), "->%d", (s4) l);
                break;
@@ -1154,7 +1163,7 @@ void builtin_staticmonitorenter(classinfo *c)
 }
 
 
-void builtin_monitorexit(java_objectheader *o)
+void *builtin_monitorexit(java_objectheader *o)
 {
 #if defined(USE_THREADS)
 #if !defined(NATIVE_THREADS)
@@ -1174,8 +1183,10 @@ void builtin_monitorexit(java_objectheader *o)
                internal_unlock_mutex_for_object(o);
 
        --blockInts;
+       return o;
 #else
        monitorExit((threadobject *) THREADOBJECT, o);
+       return o;
 #endif
 #endif
 }
@@ -1790,10 +1801,12 @@ s4 builtin_dummy()
 
 *******************************************************************************/
 
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
 java_objectheader **builtin_asm_get_exceptionptrptr()
 {
        return builtin_get_exceptionptrptr();
 }
+#endif
 
 
 methodinfo *builtin_asm_get_threadrootmethod()