-/* src/vm/linker.c - class linker functions
+/* src/vm/linker.cpp - class linker functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996, 2011
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of 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"
#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"
#include "vm/jit/asmpart.h"
#include "vm/jit/stubs.hpp"
+#include <vector>
+#include <utility>
+
/* debugging macros ***********************************************************/
static s4 class_highestinterface(classinfo *c);
+typedef std::vector<std::pair<java_object_t**, utf*> > deferred_strings_vec_t;
+static deferred_strings_vec_t deferred_strings;
+
/* linker_init *****************************************************************
Initializes the linker subsystem and links classes required for the
if (c == NULL) {
exceptions_throw_nullpointerexception();
- return NULL;
+ return 0;
}
LOCK_MONITOR_ENTER(c);
RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
+ // Hook point just after a class was linked.
+ if (!Hook::class_linked(r))
+ return 0;
+
return r;
}
*******************************************************************************/
-static void build_display(classinfo *c)
+static classinfo *build_display(classinfo *c)
{
int depth, i;
int depth_fixed;
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. */
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
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 */
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;
return desc;
}
+/* linker_create_string_later **************************************************
+
+ A hack so we can initialize java.lang.String objects during initialization.
+
+*******************************************************************************/
+void linker_create_string_later(java_object_t **a, utf *u)
+{
+ deferred_strings.push_back(std::make_pair(a, u));
+}
+
+void linker_initialize_deferred_strings()
+{
+ deferred_strings_vec_t::const_iterator it = deferred_strings.begin();
+ for (; it != deferred_strings.end(); ++it)
+ *it->first = literalstring_new(it->second);
+ deferred_strings.clear();
+}
+
/* linker_compute_subclasses ***************************************************
* Emacs will automagically detect them.
* ---------------------------------------------------------------------
* Local variables:
- * mode: c
+ * mode: c++
* indent-tabs-mode: t
* c-basic-offset: 4
* tab-width: 4