PR140 - repaired icedtea7
authorStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 20 Sep 2010 20:46:40 +0000 (22:46 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 20 Sep 2010 20:46:40 +0000 (22:46 +0200)
* 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
src/vm/hook.hpp
src/vm/linker.cpp
src/vm/linker.hpp

index 9d034b36cbcfefce3714e5dfb5db7f3211fca972..4f85068ed1b083847e4aa8522b50f96047006f0a 100644 (file)
@@ -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<java_object_t**>(&f->value->a), u);
+                               else
+                                       f->value->a = literalstring_new(u);
                                break;
 
                        default: 
index 0e6656bb49ed7a8acc353d31de61ae0993cbb5b1..e86d052b98ab16cf88b9419fe4b9a37edd51d5a0 100644 (file)
@@ -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)
index 42e82954adc96c6be5c9b4aa7192adeb4a25f1bd..4cede0109c4a7c2c99e9bbeb9114e892f04ee48b 100644 (file)
@@ -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 <vector>
+#include <utility>
+
 
 /* debugging macros ***********************************************************/
 
@@ -113,6 +116,9 @@ static bool linker_addinterface(classinfo *c, classinfo *ic);
 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
@@ -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 ***************************************************
 
index 2142ef8935b0a4ea9f80fc75f0b441b884536ea6..0d578be501a0eed9e18211f34f1a8e7a1cb89861 100644 (file)
@@ -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