X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Flinker.cpp;h=aa6cc39bc98a4799ed92bd710e4db67a09628b43;hb=4a6cefba48d8720b9e33f2e89823b8ed7fa0b78d;hp=d956341e88bd873662de15b804a2ce9e6ba9e1cf;hpb=de9b1afc38aa888edd275907f9dff63ab86d79d5;p=cacao.git diff --git a/src/vm/linker.cpp b/src/vm/linker.cpp index d956341e8..aa6cc39bc 100644 --- a/src/vm/linker.cpp +++ b/src/vm/linker.cpp @@ -1,6 +1,6 @@ /* 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. @@ -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" @@ -55,6 +56,9 @@ #include "vm/jit/asmpart.h" #include "vm/jit/stubs.hpp" +#include +#include + /* debugging macros ***********************************************************/ @@ -112,6 +116,9 @@ static bool linker_addinterface(classinfo *c, classinfo *ic); static s4 class_highestinterface(classinfo *c); +typedef std::vector > deferred_strings_vec_t; +static deferred_strings_vec_t deferred_strings; + /* linker_init ***************************************************************** Initializes the linker subsystem and links classes required for the @@ -291,6 +298,12 @@ void linker_init(void) if (!link_class(class_sun_reflect_MagicAccessorImpl)) vm_abort("linker_init: linking failed"); + + if (!link_class(class_sun_reflect_MethodAccessorImpl)) + vm_abort("linker_init: linking failed"); + + if (!link_class(class_sun_reflect_ConstructorAccessorImpl)) + vm_abort("linker_init: linking failed"); # endif if (!link_class(arrayclass_java_lang_Object)) @@ -376,7 +389,7 @@ classinfo *link_class(classinfo *c) if (c == NULL) { exceptions_throw_nullpointerexception(); - return NULL; + return 0; } LOCK_MONITOR_ENTER(c); @@ -425,6 +438,10 @@ 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. + if (!Hook::class_linked(r)) + return 0; + return r; } @@ -1186,6 +1203,24 @@ static arraydescriptor *link_array(classinfo *c) 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 ***************************************************