]> git.saurik.com Git - wxWidgets.git/commitdiff
Make it possible to use wxCharBuffer during program initialization.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Feb 2010 11:09:26 +0000 (11:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Feb 2010 11:09:26 +0000 (11:09 +0000)
wxCharBuffer might be used during static initialization, even if only
implicitly. E.g. it is used by wxString::Format() which can be used to
initialize a global string. But it uses the global s_untypedNullData variable
might not be initialized yet resulting in mysterious failures.

Fix this in the usual way by wrapping access to the variable via a function.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63585 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/buffer.h
src/common/string.cpp

index 864bb64eb74a74d49476de7e4fa7b3530a2a202a..4be2660b67f6337ec91ee3f3398056336ebacbbc 100644 (file)
@@ -56,12 +56,8 @@ struct UntypedBufferData
     bool m_owned;
 };
 
-// this has to be defined inside the DLL (and not e.g. as a static variable
-// inside an inline function) as otherwise MSVC gives link errors when the
-// functions are effectively inlined (i.e. in non-debug build)
-//
 // NB: this is defined in string.cpp and not the (non-existent) buffer.cpp
-extern WXDLLIMPEXP_DATA_BASE(UntypedBufferData * const) untypedNullDataPtr;
+WXDLLIMPEXP_BASE UntypedBufferData * GetUntypedNullData();
 
 } // namespace wxPrivate
 
@@ -186,7 +182,7 @@ protected:
     // placeholder for NULL string, to simplify this code
     static Data *GetNullData()
     {
-        return static_cast<Data *>(wxPrivate::untypedNullDataPtr);
+        return static_cast<Data *>(wxPrivate::GetUntypedNullData());
     }
 
     void IncRef()
index 9e9ba528fcbd6b11bd7c64154fa70179ecba8563..dcac014916affa78c76d317829b52d2a74ced9d3 100644 (file)
     #define wxStringStrlen   wxStrlen
 #endif
 
-// ----------------------------------------------------------------------------
-// global variables
-// ----------------------------------------------------------------------------
-
+// define a function declared in wx/buffer.h here as we don't have buffer.cpp
+// and don't want to add it just because of this simple function
 namespace wxPrivate
 {
 
-static UntypedBufferData s_untypedNullData(NULL, 0);
+// wxXXXBuffer classes can be (implicitly) used during global statics
+// initialization so wrap the status UntypedBufferData variable in a function
+// to make it safe to access it even before all global statics are initialized
+UntypedBufferData *GetUntypedNullData()
+{
+    static UntypedBufferData s_untypedNullData(NULL, 0);
 
-UntypedBufferData * const untypedNullDataPtr = &s_untypedNullData;
+    return &s_untypedNullData;
+}
 
 } // namespace wxPrivate