summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/StaticConstructors.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/StaticConstructors.h')
-rw-r--r--WebCore/platform/StaticConstructors.h39
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