From e60e2e7532c2ce0657b23f0ba1338ea433529d2c Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Mon, 20 Sep 2010 22:46:40 +0200 Subject: [PATCH] PR140 - repaired icedtea7 * 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 | 8 ++++++-- src/vm/hook.hpp | 6 ++++-- src/vm/linker.cpp | 26 +++++++++++++++++++++++++- src/vm/linker.hpp | 5 ++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/vm/field.cpp b/src/vm/field.cpp index 9d034b36c..4f85068ed 100644 --- a/src/vm/field.cpp +++ b/src/vm/field.cpp @@ -1,6 +1,6 @@ /* 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. @@ -43,6 +43,7 @@ #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" @@ -296,7 +297,10 @@ bool field_load(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool) /* 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(&f->value->a), u); + else + f->value->a = literalstring_new(u); break; default: diff --git a/src/vm/hook.hpp b/src/vm/hook.hpp index 0e6656bb4..e86d052b9 100644 --- a/src/vm/hook.hpp +++ b/src/vm/hook.hpp @@ -1,6 +1,6 @@ /* 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. @@ -27,6 +27,7 @@ #define _HOOK_HPP #include "config.h" +#include "vm/globals.hpp" #if defined(ENABLE_OPAGENT) #include "vm/jit/oprofile-agent.hpp" @@ -71,7 +72,8 @@ inline void Hook::breakpoint(Breakpoint *bp) 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) diff --git a/src/vm/linker.cpp b/src/vm/linker.cpp index 42e82954a..4cede0109 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-2005, 2006, 2007, 2008, 2010 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -56,6 +56,9 @@ #include "vm/jit/asmpart.h" #include "vm/jit/stubs.hpp" +#include +#include + /* debugging macros ***********************************************************/ @@ -113,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 @@ -1190,6 +1196,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 *************************************************** diff --git a/src/vm/linker.hpp b/src/vm/linker.hpp index 2142ef893..0d578be50 100644 --- a/src/vm/linker.hpp +++ b/src/vm/linker.hpp @@ -1,6 +1,6 @@ /* 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. @@ -90,6 +90,9 @@ void linker_preinit(void); 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 -- 2.25.1