nat/GtkLabelPeer.c has been removed
[cacao.git] / builtin.c
index ee0e36f2e1568204ab7fc71011e8cd8fa5eac809..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 1173 2004-06-16 14:56:18Z 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
 }