* src/vm/field.cpp: Allocate literal strings later.
* src/vm/hook.hpp (Hook::class_linked): Call
linker_initialize_deferred_strings.
* src/vm/linker.cpp, src/vm/linker.hpp: Added linker_create_string_later,
linker_initialize_deferred_strings.
/* src/vm/field.cpp - field functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#include "vm/exceptions.hpp"
#include "vm/field.hpp"
#include "vm/global.h"
+#include "vm/globals.hpp"
#include "vm/loader.hpp"
#include "vm/options.h"
#include "vm/primitive.hpp"
/* Create Java-string from compressed UTF8-string. */
- f->value->a = literalstring_new(u);
+ if (!(class_java_lang_String->flags & CLASS_LINKED))
+ linker_create_string_later(reinterpret_cast<java_object_t**>(&f->value->a), u);
+ else
+ f->value->a = literalstring_new(u);
break;
default:
/* src/vm/hook.hpp - hook points inside the VM
- Copyright (C) 2009
+ Copyright (C) 2009, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#define _HOOK_HPP
#include "config.h"
+#include "vm/globals.hpp"
#if defined(ENABLE_OPAGENT)
#include "vm/jit/oprofile-agent.hpp"
inline void Hook::class_linked(classinfo *c)
{
- /* nop */
+ if (c == class_java_lang_String)
+ linker_initialize_deferred_strings();
}
inline void Hook::class_loaded(classinfo *c)
/* src/vm/linker.cpp - class linker functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#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
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 ***************************************************
/* src/vm/linker.h - class linker header
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
void linker_init(void);
classinfo *link_class(classinfo *c);
+void linker_create_string_later(java_object_t **a, utf *u);
+void linker_initialize_deferred_strings();
+
#ifdef __cplusplus
}
#endif