nat/GtkLabelPeer.c has been removed
[cacao.git] / builtin.c
index 017eb1aea9a5dbe232481ecc23a559ac343780c2..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 1112 2004-05-31 15:47:20Z jowenn $
+   $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;
        
@@ -490,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;
@@ -692,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); */
 
@@ -1118,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);
@@ -1132,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);
@@ -1166,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
 }
@@ -1802,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
 }
@@ -1812,10 +1820,15 @@ 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=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;
+#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;
 }