merged volatile memory barriers
[cacao.git] / src / vm / linker.cpp
index a29ffaa86bdaa1704985bbba61c339c41c2a11dd..42e82954adc96c6be5c9b4aa7192adeb4a25f1bd 100644 (file)
@@ -1,4 +1,4 @@
-/* src/vm/linker.c - class linker functions
+/* src/vm/linker.cpp - class linker functions
 
    Copyright (C) 1996-2005, 2006, 2007, 2008
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
 #include "vm/types.h"
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
 #include "native/native.hpp"
 
 #include "threads/lock.hpp"
 #include "threads/mutex.hpp"
 
-#include "toolbox/logging.h"
+#include "toolbox/logging.hpp"
 
 #include "vm/access.hpp"
 #include "vm/array.hpp"
@@ -45,6 +45,7 @@
 #include "vm/classcache.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/globals.hpp"
+#include "vm/hook.hpp"
 #include "vm/loader.hpp"
 #include "vm/options.h"
 #include "vm/primitive.hpp"
@@ -425,6 +426,9 @@ classinfo *link_class(classinfo *c)
 
        RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
 
+       // Hook point just after a class was linked.
+       Hook::class_linked(r);
+
        return r;
 }
 
@@ -531,7 +535,7 @@ static bool linker_overwrite_method(methodinfo *mg,
 
 *******************************************************************************/
 
-static void build_display(classinfo *c)
+static classinfo *build_display(classinfo *c)
 {
        int depth, i;
        int depth_fixed;
@@ -558,7 +562,8 @@ static void build_display(classinfo *c)
                super = c->super;
        } while (false);
        if (super) {
-               build_display(super);
+               if (!link_class(super))
+                       return NULL;
                depth = super->vftbl->subtype_depth + 1;
        } else
                /* java.lang.Object doesn't have a super class. */
@@ -586,6 +591,8 @@ static void build_display(classinfo *c)
                c->vftbl->subtype_display[i] = NULL;
        c->vftbl->subtype_offset = OFFSET(vftbl_t, subtype_display[0]) + sizeof(vftbl_t*) * depth_fixed;
        c->vftbl->subtype_depth = depth;
+
+       return c;
 }
 #endif
 
@@ -995,7 +1002,8 @@ static classinfo *link_class_intern(classinfo *c)
        RT_TIMING_GET_TIME(time_subclasses);
 
 #if USES_NEW_SUBTYPE
-       build_display(c);
+       if (!build_display(c))
+               return NULL;
 #endif
 
        /* revert the linking state and class is linked */
@@ -1104,8 +1112,8 @@ static arraydescriptor *link_array(classinfo *c)
                        desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
 
                        if (compvftbl->arraydesc->dimension >= 255) {
-                               log_text("Creating array of dimension >255");
-                               assert(0);
+                               exceptions_throw_illegalargumentexception();
+                               return NULL;
                        }
 
                        desc->dimension = compvftbl->arraydesc->dimension + 1;
@@ -1399,7 +1407,7 @@ static s4 class_highestinterface(classinfo *c)
  * Emacs will automagically detect them.
  * ---------------------------------------------------------------------
  * Local variables:
- * mode: c
+ * mode: c++
  * indent-tabs-mode: t
  * c-basic-offset: 4
  * tab-width: 4