nat/GtkLabelPeer.c has been removed
[cacao.git] / builtin.c
index 423b721b8121dd537cd02f9554089ef842bcba06..90541b5107052ef8d00e303d8cb9bd57bbbd08de 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -34,7 +34,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 1072 2004-05-19 17:20:12Z stefan $
+   $Id: builtin.c 1296 2004-07-10 17:02:15Z stefan $
 
 */
 
@@ -43,7 +43,7 @@
 #include <assert.h>
 #include <string.h>
 #include <math.h>
-#include "main.h"
+#include "options.h"
 #include "builtin.h"
 #include "native.h"
 #include "loader.h"
@@ -123,7 +123,7 @@ s4 builtin_isanysubclass(classinfo *sub, classinfo *super)
        return res;
 }
 
-s4 builtin_isanysubclass_vftbl(vftbl *sub,vftbl *super)
+s4 builtin_isanysubclass_vftbl(vftbl_t *sub,vftbl_t *super)
 {
        s4 res;
        int base;
@@ -240,7 +240,7 @@ static s4 builtin_descriptorscompatible(arraydescriptor *desc,arraydescriptor *t
                        
 *****************************************************************************/
 
-s4 builtin_checkarraycast(java_objectheader *o, vftbl *target)
+s4 builtin_checkarraycast(java_objectheader *o, vftbl_t *target)
 {
        arraydescriptor *desc;
        
@@ -251,7 +251,7 @@ s4 builtin_checkarraycast(java_objectheader *o, vftbl *target)
 }
 
 
-s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl *target)
+s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target)
 {
        if (!obj) return 1;
        return builtin_checkarraycast(obj, target);
@@ -268,9 +268,16 @@ java_objectheader *builtin_throw_exception(java_objectheader *local_exceptionptr
                char logtext[MAXLOGTEXT];
                sprintf(logtext, "Builtin exception thrown: ");
                if (local_exceptionptr) {
+                       java_lang_Throwable *t = (java_lang_Throwable *) local_exceptionptr;
+
                        utf_sprint_classname(logtext + strlen(logtext),
                                                                 local_exceptionptr->vftbl->class->name);
 
+                       if (t->detailMessage) {
+                               sprintf(logtext + strlen(logtext), ": %s",
+                                               javastring_tochar(t->detailMessage));
+                       }
+
                } else {
                        sprintf(logtext + strlen(logtext), "Error: <Nullpointer instead of exception>");
                }
@@ -296,8 +303,8 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
 {
        arraydescriptor *desc;
        arraydescriptor *valuedesc;
-       vftbl *componentvftbl;
-       vftbl *valuevftbl;
+       vftbl_t *componentvftbl;
+       vftbl_t *valuevftbl;
     int dim_m1;
        int base;
        castinfo classvalues;
@@ -352,8 +359,8 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
 s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
 {
        arraydescriptor *desc;
-       vftbl *elementvftbl;
-       vftbl *valuevftbl;
+       vftbl_t *elementvftbl;
+       vftbl_t *valuevftbl;
        s4 res;
        int base;
        castinfo classvalues;
@@ -395,8 +402,8 @@ s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
  * one-dimensional array of a class type */
 s4 builtin_canstore_onedim_class(java_objectarray *a, java_objectheader *o)
 {
-       vftbl *elementvftbl;
-       vftbl *valuevftbl;
+       vftbl_t *elementvftbl;
+       vftbl_t *valuevftbl;
        s4 res;
        castinfo classvalues;
        
@@ -444,29 +451,21 @@ java_objectheader *builtin_new(classinfo *c)
        java_objectheader *o;
 
        /* is the class loaded */
-       if (!c->loaded) {
-               class_load(c);
-       }
+       if (!c->loaded)
+               if (!class_load(c))
+                       return NULL;
 
        /* is the class linked */
-       if (!c->linked) {
-               class_link(c);
-       }
+       if (!c->linked)
+               if (!class_link(c))
+                       return NULL;
 
        if (!c->initialized) {
-               if (initverbose) {
-                       char logtext[MAXLOGTEXT];
-                       sprintf(logtext, "Initialize class ");
-                       utf_sprint_classname(logtext + strlen(logtext), c->name);
-                       sprintf(logtext + strlen(logtext), " (from builtin_new)");
-                       log_text(logtext);
-               }
-               (void) class_init(c);
+               if (initverbose)
+                       log_message_class("Initialize class (from builtin_new): ", c);
 
-               /* we had an ExceptionInInitializerError */
-               if (*exceptionptr) {
+               if (!class_init(c))
                        return NULL;
-               }
        }
 
 #ifdef SIZE_FROM_CLASSINFO
@@ -475,6 +474,7 @@ java_objectheader *builtin_new(classinfo *c)
 #else
        o = heap_allocate(c->instancesize, true, c->finalizer);
 #endif
+
        if (!o)
                return NULL;
        
@@ -485,6 +485,7 @@ java_objectheader *builtin_new(classinfo *c)
        return o;
 }
 
+
 /********************** Function: builtin_newarray **************************
 
        Creates an array with the given vftbl on the heap.
@@ -496,7 +497,7 @@ java_objectheader *builtin_new(classinfo *c)
 
 *****************************************************************************/
 
-java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl)
+java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl)
 {
        java_arrayheader *a;
        arraydescriptor *desc;
@@ -559,11 +560,13 @@ java_objectarray *builtin_anewarray(s4 size, classinfo *component)
 {
        /* is class loaded */
        if (!component->loaded)
-               class_load(component);
+               if (!class_load(component))
+                       return NULL;
 
        /* is class linked */
        if (!component->linked)
-               class_link(component);
+               if (!class_link(component))
+                       return NULL;
 
        return (java_objectarray *) builtin_newarray(size, class_array_of(component)->vftbl);
 }
@@ -696,12 +699,12 @@ java_booleanarray *builtin_newarray_boolean(s4 size)
 
 ******************************************************************************/
 
-java_arrayheader *builtin_nmultianewarray(int n, vftbl *arrayvftbl, long *dims)
+java_arrayheader *builtin_nmultianewarray(int n, vftbl_t *arrayvftbl, long *dims)
 /*  java_arrayheader *builtin_nmultianewarray(int n, classinfo *arrayclass, long *dims) */
 {
        s4 size, i;
        java_arrayheader *a;
-       vftbl *componentvftbl;
+       vftbl_t *componentvftbl;
 
 /*     utf_display(arrayclass->name); */
 
@@ -1122,10 +1125,6 @@ void builtin_monitorenter(java_objectheader *o)
 #if !defined(NATIVE_THREADS)
        int hashValue;
 
-       /*log_text("Monitor enter");*/
-
-       assert(blockInts == 0);
-
        ++blockInts;
 
        hashValue = MUTEX_HASH_VALUE(o);
@@ -1136,26 +1135,31 @@ void builtin_monitorenter(java_objectheader *o)
                internal_lock_mutex_for_object(o);
 
        --blockInts;
-
-       assert(blockInts == 0);
 #else
-       monitorEnter((threadobject*) THREADOBJECT, o);
+       monitorEnter((threadobject *) THREADOBJECT, o);
 #endif
 #endif
 }
 
-
-void builtin_monitorexit (java_objectheader *o)
+/*
+ * Locks the class object - needed for static synchronized methods.
+ * The use_class_as_object call is needed in order to circumvent a
+ * possible deadlock with builtin_monitorenter called by another
+ * thread calling use_class_as_object.
+ */
+void builtin_staticmonitorenter(classinfo *c)
 {
+       use_class_as_object(c);
+       builtin_monitorenter(&c->header);
+}
+
 
+void builtin_monitorexit(java_objectheader *o)
+{
 #if defined(USE_THREADS)
 #if !defined(NATIVE_THREADS)
        int hashValue;
 
-       /* log_text("Monitor leave"); */
-
-       assert(blockInts == 0);
-
        ++blockInts;
 
        hashValue = MUTEX_HASH_VALUE(o);
@@ -1170,10 +1174,8 @@ void builtin_monitorexit (java_objectheader *o)
                internal_unlock_mutex_for_object(o);
 
        --blockInts;
-
-       assert(blockInts == 0);
 #else
-       monitorExit((threadobject*) THREADOBJECT, o);
+       monitorExit((threadobject *) THREADOBJECT, o);
 #endif
 #endif
 }
@@ -1806,7 +1808,9 @@ inline void* builtin_asm_get_stackframeinfo()
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
        return &THREADINFO->_stackframeinfo;
 #else
+#if defined(__GNUC__)
 #warning FIXME FOR OLD THREAD IMPL (jowenn)
+#endif
                return &_thread_nativestackframeinfo; /* no threading, at least no native*/
 #endif
 }
@@ -1816,10 +1820,16 @@ stacktraceelement *builtin_stacktrace_copy(stacktraceelement **el,stacktraceelem
        size_t s;
        s=(end-begin);
        /*printf ("begin: %p, end: %p, diff: %ld, size :%ld\n",begin,end,s,s*sizeof(stacktraceelement));*/
-       *el=GCNEW(stacktraceelement,s+1);
+       *el=heap_allocate(sizeof(stacktraceelement)*(s+1), true, 0);
+#if 0
+       *el=MNEW(stacktraceelement,s+1); /*GC*/
+#endif
        memcpy(*el,begin,(end-begin)*sizeof(stacktraceelement));
        (*el)[s].method=0;
-       (*el)[s].linenumber=0;
+#if defined(__GNUC__)
+#warning change this if line numbers bigger than u2 are allowed, the currently supported class file format does no allow that
+#endif
+       (*el)[s].linenumber=-1; /* -1 can never be reched otherwise, since line numbers are only u2, so it is save to use that as flag */
        return *el;
 }