diff options
Diffstat (limited to 'WebCore/platform/StaticConstructors.h')
-rw-r--r-- | WebCore/platform/StaticConstructors.h | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/WebCore/platform/StaticConstructors.h b/WebCore/platform/StaticConstructors.h index dbba7ff..26b44de 100644 --- a/WebCore/platform/StaticConstructors.h +++ b/WebCore/platform/StaticConstructors.h @@ -20,13 +20,38 @@ * */ -// For WebCore we need to avoid having static constructors. -// Our strategy is to declare the global objects with a different type (initialized to 0) -// and then use placement new to initialize the global objects later. This is not completely -// portable, and it would be good to figure out a 100% clean way that still avoids code that -// runs at init time. +#ifndef StaticConstructors_h +#define StaticConstructors_h -#ifndef AVOID_STATIC_CONSTRUCTORS +// For WebCore we need to avoid having static constructors. We achieve this +// with two separate methods for GCC and MSVC. Both methods prevent the static +// initializers from being registered and called on program startup. On GCC, we +// declare the global objects with a different type that can be POD default +// initialized by the linker/loader. On MSVC we use a special compiler feature +// to have the CRT ignore our static initializers. The constructors will never +// be called and the objects will be left uninitialized. +// +// With both of these approaches, we must define and explicitly call an init +// routine that uses placement new to create the objects and overwrite the +// uninitialized placeholders. +// +// This is not completely portable, but is what we have for now without +// changing how a lot of code accesses these global objects. + +#ifdef SKIP_STATIC_CONSTRUCTORS_ON_MSVC +// - Assume that all includes of this header want ALL of their static +// initializers ignored. This is currently the case. This means that if +// a .cc includes this header (or it somehow gets included), all static +// initializers after the include will not be executed. +// - We do this with a pragma, so that all of the static initializer pointers +// go into our own section, and the CRT won't call them. Eventually it would +// be nice if the section was discarded, because we don't want the pointers. +// See: http://msdn.microsoft.com/en-us/library/7977wcck(VS.80).aspx +#pragma warning(disable:4075) +#pragma init_seg(".unwantedstaticinits") +#endif + +#ifndef SKIP_STATIC_CONSTRUCTORS_ON_GCC // Define an global in the normal way. #if COMPILER(MSVC7) #define DEFINE_GLOBAL(type, name) \ @@ -47,3 +72,5 @@ void * name[(sizeof(type) + sizeof(void *) - 1) / sizeof(void *)]; #endif #endif + +#endif // StaticConstructors_h |