Updated version, required for darwin
[cacao.git] / builtin.c
index 7aea2d8eee2a4a97a444baed180b9e7972444731..c70b0580c9b94aff40a374df02e352147b3debc3 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -13,7 +13,7 @@
                         Andreas  Krall          EMAIL: cacao@complang.tuwien.ac.at
                         Mark Probst             EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: 1996/12/03
+       Last Change: 2003/02/12
 
 *******************************************************************************/
 
@@ -40,8 +40,15 @@ builtin_descriptor builtin_desc[] = {
        {(functionptr) asm_builtin_checkarraycast, "checkarraycast"},
        {(functionptr) asm_builtin_aastore,                "aastore"},
        {(functionptr) builtin_new,                                "new"},
-       {(functionptr) builtin_anewarray,                  "anewarray"},
+       {(functionptr) builtin_anewarray,          "anewarray"},
        {(functionptr) builtin_newarray_array,     "newarray_array"},
+#ifdef __I386__
+       /*
+        * have 2 parameters (needs stack manipulation)
+        */
+       {(functionptr) asm_builtin_anewarray,      "anewarray"},
+       {(functionptr) asm_builtin_newarray_array, "newarray_array"},
+#endif
        {(functionptr) builtin_newarray_boolean,   "newarray_boolean"},
        {(functionptr) builtin_newarray_char,      "newarray_char"},
        {(functionptr) builtin_newarray_float,     "newarray_float"},
@@ -138,8 +145,8 @@ s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
        return 0;
        */
 
-       return (unsigned) (sub->baseval - super->baseval) <=
-                  (unsigned) (super->diffval);
+       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+                  (unsigned) (super->vftbl->diffval);
 }
 
 
@@ -846,13 +853,15 @@ java_objectheader *builtin_trace_exception (java_objectheader *exceptionptr,
 
 
 #ifdef TRACE_ARGS_NUM
-void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
+void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5,
 #if TRACE_ARGS_NUM > 6
-               long a6, long a7,
+               s8 a6, s8 a7,
 #endif
                                                methodinfo *method)
 {
-       sprintf (logtext, "                                                                                             ");
+       int i;
+       for (i=0; i<methodindent; i++)
+               logtext[i] = '\t';
        sprintf (logtext+methodindent, "called: ");
        utf_sprint (logtext+strlen(logtext), method->class->name);
        sprintf (logtext+strlen(logtext), ".");
@@ -862,34 +871,34 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
        switch (method->paramcount) {
 #if TRACE_ARGS_NUM > 6
                case 8:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx, %llx, %llx",
                                                                                           a0,  a1,      a2,  a3,  a4,  a5, a6, a7);
                        break;
                case 7:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx, %llx",
                                                                                           a0,  a1,      a2,  a3,  a4,  a5, a6);
                        break;
 #endif
                case 6:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx",
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx, %llx",
                                                                                           a0,  a1,      a2,  a3,  a4,  a5);
                        break;
                case 5:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx",
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx, %llx",
                                                                                           a0,  a1,      a2,  a3,  a4);
                        break;
                case 4:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx",
-                                                                                          a0,  a1,      a2,  a3);
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx, %llx",
+                                                                                          a0, a1, a2, a3);
                        break;
                case 3:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx", a0,  a1,      a2);
+                       sprintf(logtext+strlen(logtext), "%llx, %llx, %llx", a0, a1, a2);
                        break;
                case 2:
-                       sprintf(logtext+strlen(logtext), "%lx, %lx", a0,  a1);
+                       sprintf(logtext+strlen(logtext), "%llx, %llx", a0, a1);
                        break;
                case 1:
-                       sprintf(logtext+strlen(logtext), "%lx", a0);
+                       sprintf(logtext+strlen(logtext), "%llx", a0);
                        break;
                }
        sprintf (logtext+strlen(logtext), ")");
@@ -911,10 +920,12 @@ void builtin_displaymethodstart(methodinfo *method)
        methodindent++;
 }
 
-void builtin_displaymethodstop(methodinfo *method, long l, double d, float f)
+void builtin_displaymethodstop(methodinfo *method, s8 l, double d, float f)
 {
+       int i;
+       for (i=0; i<methodindent; i++)
+               logtext[i] = '\t';
        methodindent--;
-       sprintf (logtext, "                                                                                             ");
        sprintf (logtext+methodindent, "finished: ");
        utf_sprint (logtext+strlen(logtext), method->class->name);
        sprintf (logtext+strlen(logtext), ".");
@@ -938,7 +949,9 @@ void builtin_displaymethodstop(methodinfo *method, long l, double d, float f)
 
 void builtin_displaymethodexception(methodinfo *method)
 {
-       sprintf (logtext, "                                                                                             ");
+       int i;
+       for (i=0; i<methodindent; i++)
+               logtext[i] = '\t';
        sprintf (logtext+methodindent, "exception abort: ");
        utf_sprint (logtext+strlen(logtext), method->class->name);
        sprintf (logtext+strlen(logtext), ".");