Browse Source

Oops, StringImpl's "the empty string" global was not always initialized.

These "oops forgot to initialize" bugs are getting annoying...
Andreas Kling 6 years ago
parent
commit
702d308e67
3 changed files with 14 additions and 7 deletions
  1. 9 4
      AK/StringImpl.cpp
  2. 1 0
      AK/StringImpl.h
  3. 4 3
      Kernel/init.cpp

+ 9 - 4
AK/StringImpl.cpp

@@ -4,12 +4,17 @@
 
 namespace AK {
 
+static StringImpl* s_theEmptyStringImpl = nullptr;
+
+void StringImpl::initializeGlobals()
+{
+    s_theEmptyStringImpl = new StringImpl(ConstructTheEmptyStringImpl);;
+}
+
 StringImpl& StringImpl::theEmptyStringImpl()
 {
-    static StringImpl* s = nullptr;
-    if (!s)
-        s = new StringImpl(ConstructTheEmptyStringImpl);
-    return *s;
+    ASSERT(s_theEmptyStringImpl);
+    return *s_theEmptyStringImpl;
 }
 
 StringImpl::~StringImpl()

+ 1 - 0
AK/StringImpl.h

@@ -15,6 +15,7 @@ public:
     RetainPtr<StringImpl> toUppercase() const;
 
     static StringImpl& theEmptyStringImpl();
+    static void initializeGlobals();
 
     ~StringImpl();
 

+ 4 - 3
Kernel/init.cpp

@@ -27,7 +27,7 @@
 #include "Console.h"
 
 #define TEST_VFS
-//#define TEST_ELF_LOADER
+#define TEST_ELF_LOADER
 //#define TEST_CRASHY_USER_PROCESSES
 
 static void motd_main() NORETURN;
@@ -102,8 +102,6 @@ static void init_stage2()
     // Anything that registers interrupts goes *after* PIC and IDT for obvious reasons.
     Syscall::initialize();
 
-    VirtualFileSystem::initializeGlobals();
-
     extern void panel_main();
 
     new Task(panel_main, "panel", IPC::Handle::PanelTask, Task::Ring0);
@@ -203,6 +201,9 @@ void init()
 
     MemoryManager::initialize();
 
+    VirtualFileSystem::initializeGlobals();
+    StringImpl::initializeGlobals();
+
     auto keyboard = make<Keyboard>();
 
     PIT::initialize();