*** empty log message ***
[cacao.git] / builtin.c
index c1de52db7c81258af511a57ca9cab306fbef1e8f..1d1cf3a01879743db902189415e330d6991efd5d 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -1,4 +1,3 @@
-/* -*- mode: c; tab-width: 4; c-basic-offset: 4 -*- */
 /****************************** builtin.c **************************************
 
        Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
 builtin_descriptor builtin_desc[] = {
        {(functionptr) builtin_instanceof,         "instanceof"},
        {(functionptr) builtin_checkcast,          "checkcast"},
-       {(functionptr) new_builtin_checkcast,      "checkcast"},
        {(functionptr) builtin_arrayinstanceof,    "arrayinstanceof"},
        {(functionptr) builtin_checkarraycast,     "checkarraycast"},
-       {(functionptr) new_builtin_checkarraycast, "checkarraycast"},
-       {(functionptr) new_builtin_aastore,        "aastore"},
+       {(functionptr) asm_builtin_checkarraycast, "checkarraycast"},
+       {(functionptr) asm_builtin_aastore,        "aastore"},
        {(functionptr) builtin_new,                "new"},
        {(functionptr) builtin_anewarray,          "anewarray"},
        {(functionptr) builtin_newarray_array,     "newarray_array"},
@@ -53,20 +51,20 @@ builtin_descriptor builtin_desc[] = {
        {(functionptr) builtin_displaymethodstart, "displaymethodstart"},
        {(functionptr) builtin_displaymethodstop,  "displaymethodstop"},
        {(functionptr) builtin_monitorenter,       "monitorenter"},
-       {(functionptr) new_builtin_monitorenter,   "monitorenter"},
+       {(functionptr) asm_builtin_monitorenter,   "monitorenter"},
        {(functionptr) builtin_monitorexit,        "monitorexit"},
-       {(functionptr) new_builtin_monitorexit,    "monitorexit"},
+       {(functionptr) asm_builtin_monitorexit,    "monitorexit"},
        {(functionptr) builtin_idiv,               "idiv"},
-       {(functionptr) new_builtin_idiv,           "idiv"},
+       {(functionptr) asm_builtin_idiv,           "idiv"},
        {(functionptr) builtin_irem,               "irem"},
-       {(functionptr) new_builtin_irem,           "irem"},
+       {(functionptr) asm_builtin_irem,           "irem"},
        {(functionptr) builtin_ladd,               "ladd"},
        {(functionptr) builtin_lsub,               "lsub"},
        {(functionptr) builtin_lmul,               "lmul"},
        {(functionptr) builtin_ldiv,               "ldiv"},
-       {(functionptr) new_builtin_ldiv,           "ldiv"},
+       {(functionptr) asm_builtin_ldiv,           "ldiv"},
        {(functionptr) builtin_lrem,               "lrem"},
-       {(functionptr) new_builtin_lrem,           "lrem"},
+       {(functionptr) asm_builtin_lrem,           "lrem"},
        {(functionptr) builtin_lshl,               "lshl"},
        {(functionptr) builtin_lshr,               "lshr"},
        {(functionptr) builtin_lushr,              "lushr"},
@@ -125,19 +123,12 @@ builtin_descriptor builtin_desc[] = {
 
 static s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
 {
-       if (super->flags & ACC_INTERFACE) {
-               u4 index = super->index;
-/*             if (sub->vftbl == NULL) return 0; */
-               if (index >= sub->vftbl->interfacetablelength) return 0;
-               return ( sub->vftbl->interfacevftbl[index] ) ? 1 : 0;
-               }
-       else {
-               while (sub) {
-                       if (sub==super) return 1;
-                       sub = sub->super;
-                       }
-               return 0;
-               }
+       if (super->flags & ACC_INTERFACE)
+               return (sub->vftbl->interfacetablelength > super->index) &&
+                      (sub->vftbl->interfacetable[-super->index] != NULL);
+
+       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+              (unsigned) (super->vftbl->diffval);
 }
 
 
@@ -179,23 +170,23 @@ s4 builtin_checkcast(java_objectheader *obj, classinfo *class)
        log_text ("builtin_checkcast called");
 #endif
 
-       if (!obj) return 1;
-       if ( builtin_isanysubclass (obj->vftbl->class, class) ) {
+       if (obj == NULL)
                return 1;
-                               }
+       if (builtin_isanysubclass (obj->vftbl->class, class))
+               return 1;
+
 #if DEBUG
-               printf ("#### checkcast failed ");
-               unicode_display (obj->vftbl->class->name);
-               printf (" -> ");
-               unicode_display (class->name);
-               printf ("\n");
+       printf ("#### checkcast failed ");
+       unicode_display (obj->vftbl->class->name);
+       printf (" -> ");
+       unicode_display (class->name);
+       printf ("\n");
 #endif
-               
+
        return 0;
 }
 
 
-
 /*********** interne Funktion: builtin_descriptorscompatible ******************
 
        "uberpr"uft, ob zwei Array-Typdescriptoren compartible sind, d.h.,
@@ -344,11 +335,19 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
                        
 *****************************************************************************/
 
+#define ALIGNMENT 3
+#define align_size(size)       ((size + ((1 << ALIGNMENT) - 1)) & ~((1 << ALIGNMENT) - 1))
+
 java_objectheader *builtin_new (classinfo *c)
 {
        java_objectheader *o;
-       
+
+#ifdef SIZE_FROM_CLASSINFO
+       c->alignedsize = align_size(c->instancesize);
+       o = heap_allocate ( c->alignedsize, true, c->finalizer );
+#else
        o = heap_allocate ( c->instancesize, true, c->finalizer );
+#endif
        if (!o) return NULL;
        
        memset (o, 0, c->instancesize);
@@ -371,20 +370,52 @@ java_objectheader *builtin_new (classinfo *c)
 
 *****************************************************************************/
 
+static
+void* __builtin_newarray(s4 base_size,
+                                                s4 size, 
+                                                bool references,
+                                                int elementsize,
+                                                int arraytype)
+{
+       java_arrayheader *a;
+#ifdef SIZE_FROM_CLASSINFO
+       s4 alignedsize = align_size(base_size + (size-1) * elementsize);
+       a = heap_allocate ( alignedsize, true, NULL );
+#else  
+       a = heap_allocate ( sizeof(java_objectarray) + (size-1) * elementsize, 
+                           references, 
+                                               NULL);
+#endif
+       if (!a) return NULL;
+
+#ifdef SIZE_FROM_CLASSINFO
+       memset(a, 0, alignedsize);
+#else
+       memset(a, 0, base_size + (size-1) * elementsize);
+#endif 
+
+       a -> objheader.vftbl = class_array -> vftbl;
+       a -> size = size;
+#ifdef SIZE_FROM_CLASSINFO
+       a -> alignedsize = alignedsize;
+#endif
+       a -> arraytype = arraytype;
+
+       return a;
+}
+
+
 java_objectarray *builtin_anewarray (s4 size, classinfo *elementtype)
 {
-       s4 i;
-       java_objectarray *a;
-       
-       a = heap_allocate ( sizeof(java_objectarray) + (size-1) * sizeof(void*), 
-                           true, 0 /* FALSE */ );
+       java_objectarray *a;    
+       a = (java_objectarray*)__builtin_newarray(sizeof(java_objectarray),
+                                                                                         size, 
+                                                                                         true, 
+                                                                                         sizeof(void*), 
+                                                                                         ARRAYTYPE_OBJECT);
        if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_OBJECT;
+
        a -> elementtype = elementtype;
-       for (i=0; i<size; i++) a->data[i] = NULL;
        return a;
 }
 
@@ -404,18 +435,15 @@ java_objectarray *builtin_anewarray (s4 size, classinfo *elementtype)
 java_arrayarray *builtin_newarray_array 
         (s4 size, constant_arraydescriptor *elementdesc)
 {
-       s4 i;
-       java_arrayarray *a;
-       
-       a = heap_allocate ( sizeof(java_arrayarray) + (size-1) * sizeof(void*), 
-                           true, NULL );
+       java_arrayarray *a;     
+       a = (java_arrayarray*)__builtin_newarray(sizeof(java_arrayarray),
+                                                                                        size, 
+                                                                                        true, 
+                                                                                        sizeof(void*), 
+                                                                                        ARRAYTYPE_ARRAY);
        if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_ARRAY;
+
        a -> elementdescriptor = elementdesc;
-       for (i=0; i<size; i++) a->data[i] = NULL;
        return a;
 }
 
@@ -431,17 +459,12 @@ java_arrayarray *builtin_newarray_array
 
 java_booleanarray *builtin_newarray_boolean (s4 size)
 {
-       java_booleanarray *a;
-       
-       a = heap_allocate ( sizeof(java_booleanarray) + (size-1) * sizeof(u1), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_BOOLEAN;
-       memset (a->data, 0, sizeof(u1) * size);
-
+       java_booleanarray *a;   
+       a = (java_booleanarray*)__builtin_newarray(sizeof(java_booleanarray),
+                                                                                          size, 
+                                                                                          false, 
+                                                                                          sizeof(u1), 
+                                                                                          ARRAYTYPE_BOOLEAN);
        return a;
 }
 
@@ -454,17 +477,12 @@ java_booleanarray *builtin_newarray_boolean (s4 size)
 
 java_chararray *builtin_newarray_char (s4 size)
 {
-       java_chararray *a;
-       
-       a = heap_allocate ( sizeof(java_chararray) + (size-1) * sizeof(u2), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_CHAR;
-       memset (a->data, 0, sizeof(u2) * size);
-
+       java_chararray *a;      
+       a = (java_chararray*)__builtin_newarray(sizeof(java_chararray),
+                                                                                       size, 
+                                                                                       false, 
+                                                                                       sizeof(u2), 
+                                                                                       ARRAYTYPE_CHAR);
        return a;
 }
 
@@ -478,17 +496,12 @@ java_chararray *builtin_newarray_char (s4 size)
 
 java_floatarray *builtin_newarray_float (s4 size)
 {
-       s4 i;
-       java_floatarray *a;
-       
-       a = heap_allocate ( sizeof(java_floatarray) + (size-1) * sizeof(float), 
-                           false, NULL );
-       if (!a) return NULL;
-
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_FLOAT;
-       for (i=0; i<size; i++) a->data[i] = 0.0;
+       java_floatarray *a;     
+       a = (java_floatarray*)__builtin_newarray(sizeof(java_floatarray),
+                                                                                        size, 
+                                                                                        false, 
+                                                                                        sizeof(float), 
+                                                                                        ARRAYTYPE_FLOAT);
        return a;
 }
 
@@ -502,17 +515,12 @@ java_floatarray *builtin_newarray_float (s4 size)
 
 java_doublearray *builtin_newarray_double (s4 size)
 {
-       s4 i;
-       java_doublearray *a;
-       
-       a = heap_allocate ( sizeof(java_doublearray) + (size-1) * sizeof(double), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_DOUBLE;
-       for (i=0; i<size; i++) a->data[i] = 0.0;
+       java_doublearray *a;    
+       a = (java_doublearray*)__builtin_newarray(sizeof(java_doublearray),
+                                                                                         size, 
+                                                                                         false, 
+                                                                                         sizeof(double), 
+                                                                                         ARRAYTYPE_DOUBLE);
        return a;
 }
 
@@ -528,16 +536,12 @@ java_doublearray *builtin_newarray_double (s4 size)
 
 java_bytearray *builtin_newarray_byte (s4 size)
 {
-       java_bytearray *a;
-       
-       a = heap_allocate ( sizeof(java_bytearray) + (size-1) * sizeof(s1), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array->vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_BYTE;
-       memset (a->data, 0, sizeof(u1) * size);
+       java_bytearray *a;      
+       a = (java_bytearray*)__builtin_newarray(sizeof(java_bytearray),
+                                                                                       size, 
+                                                                                       false, 
+                                                                                       sizeof(u1), 
+                                                                                       ARRAYTYPE_BYTE);
        return a;
 }
 
@@ -551,16 +555,12 @@ java_bytearray *builtin_newarray_byte (s4 size)
 
 java_shortarray *builtin_newarray_short (s4 size)
 {
-       java_shortarray *a;
-       
-       a = heap_allocate ( sizeof(java_shortarray) + (size-1) * sizeof(s2), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_SHORT;
-       memset (a->data, 0, sizeof(s2) * size);
+       java_shortarray *a;     
+       a = (java_shortarray*)__builtin_newarray(sizeof(java_shortarray),
+                                                                                          size, 
+                                                                                          false, 
+                                                                                          sizeof(s2), 
+                                                                                          ARRAYTYPE_SHORT);
        return a;
 }
 
@@ -574,16 +574,12 @@ java_shortarray *builtin_newarray_short (s4 size)
 
 java_intarray *builtin_newarray_int (s4 size)
 {
-       java_intarray *a;
-       
-       a = heap_allocate ( sizeof(java_intarray) + (size-1) * sizeof(s4), 
-                           false, NULL );
-       if (!a) return NULL;
-       
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_INT;
-       memset (a->data, 0, sizeof(s4) * size);
+       java_intarray *a;       
+       a = (java_intarray*)__builtin_newarray(sizeof(java_intarray),
+                                                                                  size, 
+                                                                                  false, 
+                                                                                  sizeof(s4), 
+                                                                                  ARRAYTYPE_INT);
        return a;
 }
 
@@ -597,16 +593,12 @@ java_intarray *builtin_newarray_int (s4 size)
 
 java_longarray *builtin_newarray_long (s4 size)
 {
-       java_longarray *a;
-       
-       a = heap_allocate ( sizeof(java_longarray) + (size-1) * sizeof(s8), 
-                           false, NULL );
-       if (!a) return NULL;
-
-       a -> header.objheader.vftbl = class_array -> vftbl;
-       a -> header.size = size;
-       a -> header.arraytype = ARRAYTYPE_LONG;
-       memset (a->data, 0, sizeof(s8) * size);
+       java_longarray *a;      
+       a = (java_longarray*)__builtin_newarray(sizeof(java_longarray),
+                                                                                       size, 
+                                                                                       false, 
+                                                                                       sizeof(s8), 
+                                                                                       ARRAYTYPE_LONG);
        return a;
 }
 
@@ -1619,3 +1611,16 @@ float builtin_d2f (double a)
                }
 }
 
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */