--- a/config/config.mk
+++ b/config/config.mk
@@ -521,17 +521,17 @@ ifeq ($(OS_ARCH),Darwin)
# Darwin doesn't cross-compile, so just set both types of flags here.
HOST_CMFLAGS += -fobjc-exceptions
HOST_CMMFLAGS += -fobjc-exceptions
OS_COMPILE_CMFLAGS += -fobjc-exceptions
OS_COMPILE_CMMFLAGS += -fobjc-exceptions
endif
COMPILE_CFLAGS = $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CFLAGS)
-COMPILE_CXXFLAGS = $(VISIBILITY_FLAGS) $(STL_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
+COMPILE_CXXFLAGS = $(STL_FLAGS) $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
COMPILE_CMFLAGS = $(OS_COMPILE_CMFLAGS)
COMPILE_CMMFLAGS = $(OS_COMPILE_CMMFLAGS)
ifndef CROSS_COMPILE
HOST_CFLAGS += $(RTL_FLAGS)
endif
#
--- a/config/gcc-stl-wrapper.template.h
+++ b/config/gcc-stl-wrapper.template.h
@@ -40,23 +40,33 @@
#ifndef mozilla_${HEADER}_h
#define mozilla_${HEADER}_h
#if __EXCEPTIONS
# error "STL code can only be used with -fno-exceptions"
#endif
+// Silence "warning: #include_next is a GCC extension"
+#pragma GCC system_header
+
+// mozalloc.h wants <new>; break the cycle by always explicitly
+// including <new> here. NB: this is a tad sneaky. Sez the gcc docs:
+//
+// `#include_next' does not distinguish between <file> and "file"
+// inclusion, nor does it check that the file you specify has the
+// same name as the current file. It simply looks for the file
+// named, starting with the directory in the search path after the
+// one where the current file was found.
+#include_next <new>
+
// See if we're in code that can use mozalloc. NB: this duplicates
// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
// can't build with that being included before base/basictypes.h.
#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
-# include <new> // to give mozalloc std::bad_alloc
-# include <stdlib.h> // to give mozalloc malloc/free decls
-# include <string.h>
# include "mozilla/mozalloc.h"
#else
# error "STL code can only be used with infallible ::operator new()"
#endif
#if defined(DEBUG) && !defined(_GLIBCXX_DEBUG)
// Enable checked iterators and other goodies
//
@@ -73,13 +83,13 @@
// gcc calls a __throw_*() function from bits/functexcept.h when it
// wants to "throw an exception". functexcept exists nominally to
// support -fno-exceptions, but since we'll always use the system
// libstdc++, and it's compiled with exceptions, then in practice
// these __throw_*() functions will always throw exceptions (shades of
// -fshort-wchar). We don't want that and so define our own inlined
// __throw_*().
-#ifndef mozilla_functexcept_h
-# include "mozilla/functexcept.h"
+#ifndef mozilla_throw_gcc_h
+# include "mozilla/throw_gcc.h"
#endif
#endif // if mozilla_${HEADER}_h
--- a/config/make-stl-wrappers.py
+++ b/config/make-stl-wrappers.py
@@ -57,27 +57,29 @@ def header_path(header, compiler):
def is_comment(line):
return re.match(r'\s*#.*', line)
def main(outdir, compiler, template_file, header_list_file):
if not os.path.isdir(outdir):
os.mkdir(outdir)
template = open(template_file, 'r').read()
-
+ path_to_new = header_path('new', compiler)
+
for header in open(header_list_file, 'r'):
header = header.rstrip()
if 0 == len(header) or is_comment(header):
continue
path = header_path(header, compiler)
try:
f = open(os.path.join(outdir, header), 'w')
f.write(string.Template(template).substitute(HEADER=header,
- HEADER_PATH=path))
+ HEADER_PATH=path,
+ NEW_HEADER_PATH=path_to_new))
finally:
f.close()
if __name__ == '__main__':
if 5 != len(sys.argv):
print >>sys.stderr, """Usage:
python %s OUT_DIR ('msvc'|'gcc') TEMPLATE_FILE HEADER_LIST_FILE
--- a/config/msvc-stl-wrapper.template.h
+++ b/config/msvc-stl-wrapper.template.h
@@ -40,23 +40,32 @@
#ifndef mozilla_${HEADER}_h
#define mozilla_${HEADER}_h
#if _HAS_EXCEPTIONS
# error "STL code can only be used with -fno-exceptions"
#endif
+// Code built with !_HAS_EXCEPTIONS calls std::_Throw(), but the win2k
+// CRT doesn't export std::_Throw(). So we define it.
+#ifndef mozilla_Throw_h
+# include "mozilla/throw_msvc.h"
+#endif
+
+// Code might include <new> before other wrapped headers, but <new>
+// includes <exception> and so we want to wrap it. But mozalloc.h
+// wants <new> also, so we break the cycle by always explicitly
+// including <new> here.
+#include <${NEW_HEADER_PATH}>
+
// See if we're in code that can use mozalloc. NB: this duplicates
// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
// can't build with that being included before base/basictypes.h.
#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
-# include <new> // to give mozalloc std::bad_alloc
-# include <stdlib.h> // to give mozalloc malloc/free decls
-# include <string.h>
# include "mozilla/mozalloc.h"
#else
# error "STL code can only be used with infallible ::operator new()"
#endif
#ifdef DEBUG
// From
// http://msdn.microsoft.com/en-us/library/aa985982%28VS.80%29.aspx
--- a/config/stl-headers
+++ b/config/stl-headers
@@ -7,13 +7,22 @@
# At build time, each header listed here is converted into a "wrapper
# header" that is installed into dist/stl_includes.
#
# If you would like to request a new STL header <foo> be added, please
# file a Core:XPCOM bug with a title like "STL: Review exception
# safety of <foo> for gcc and MSVC".
#
+new
+
# FIXME: these headers haven't been reviewed yet, but we use them
-# unsafely in modules/libpr0n, so we might as well prevent it from
+# unsafely in Gecko, so we might as well prevent them from
# throwing exceptions
algorithm
+deque
+iostream
+list
+map
+memory
+stack
+string
vector
--- a/embedding/browser/gtk/tests/Makefile.in
+++ b/embedding/browser/gtk/tests/Makefile.in
@@ -71,16 +71,17 @@ endif
include $(topsrcdir)/config/config.mk
include $(topsrcdir)/config/rules.mk
LIBS += $(XPCOM_STANDALONE_GLUE_LDOPTS)
DEFINES += -DXPCOM_GLUE
+STL_FLAGS =
CXXFLAGS += $(MOZ_GTK2_CFLAGS)
ifdef ENABLE_GNOME
CXXFLAGS += `gnome-config --cflags gnomeui`
EXTRA_LIBS += `gnome-config --libs gnomeui`
endif
--- a/js/src/config/config.mk
+++ b/js/src/config/config.mk
@@ -521,17 +521,17 @@ ifeq ($(OS_ARCH),Darwin)
# Darwin doesn't cross-compile, so just set both types of flags here.
HOST_CMFLAGS += -fobjc-exceptions
HOST_CMMFLAGS += -fobjc-exceptions
OS_COMPILE_CMFLAGS += -fobjc-exceptions
OS_COMPILE_CMMFLAGS += -fobjc-exceptions
endif
COMPILE_CFLAGS = $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CFLAGS)
-COMPILE_CXXFLAGS = $(VISIBILITY_FLAGS) $(STL_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
+COMPILE_CXXFLAGS = $(STL_FLAGS) $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
COMPILE_CMFLAGS = $(OS_COMPILE_CMFLAGS)
COMPILE_CMMFLAGS = $(OS_COMPILE_CMMFLAGS)
ifndef CROSS_COMPILE
HOST_CFLAGS += $(RTL_FLAGS)
endif
#
--- a/memory/mozalloc/Makefile.in
+++ b/memory/mozalloc/Makefile.in
@@ -39,16 +39,20 @@
DEPTH = ../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
VISIBILITY_FLAGS=
+STL_FLAGS =
+ifdef _MSC_VER
+STL_FLAGS = -D_HAS_EXCEPTIONS=0
+endif
MODULE = mozalloc
LIBRARY_NAME = mozalloc
FORCE_SHARED_LIB= 1
DIST_INSTALL = 1
ifeq (,$(filter-out WINCE,$(OS_ARCH)))
# mozalloc gets its allocation methods from the shunt, which gets their
@@ -57,16 +61,32 @@ OS_LIBS =
endif
ifeq (,$(filter-out OS2,$(OS_ARCH)))
# The strndup declaration in string.h is in an ifdef __USE_GNU section
DEFINES += -D_GNU_SOURCE
endif
EXPORTS_NAMESPACES = mozilla
-EXPORTS_mozilla = mozalloc.h mozalloc_macro_wrappers.h mozalloc_oom.h
+EXPORTS_mozilla = \
+ mozalloc.h \
+ mozalloc_abort.h \
+ mozalloc_macro_wrappers.h \
+ mozalloc_oom.h \
+ $(NULL)
-CPPSRCS = \
+CPPSRCS = \
mozalloc.cpp \
+ mozalloc_abort.cpp \
mozalloc_oom.cpp \
$(NULL)
+ifdef WRAP_STL_INCLUDES
+ifdef GCC_VERSION
+EXPORTS_mozilla += throw_gcc.h
+endif
+ifdef _MSC_VER
+EXPORTS_mozilla += throw_msvc.h
+CPPSRCS += throw_msvc.cpp
+endif
+endif # WRAP_STL_INCLUDES
+
include $(topsrcdir)/config/rules.mk
--- a/memory/mozalloc/mozalloc.h
+++ b/memory/mozalloc/mozalloc.h
@@ -36,28 +36,26 @@
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_mozalloc_h
#define mozilla_mozalloc_h
-
/*
* https://bugzilla.mozilla.org/show_bug.cgi?id=427099
*/
-/*
- * NB: this header depends on the symbols malloc(), free(), and
- * std::bad_alloc. But because this header is used in situations
- * where malloc/free have different visibility, we rely on code
- * including this header to provide the declarations of malloc/free.
- * I.e., we don't #include <stdlib.h> or <new> on purpose.
- */
+#include <stdlib.h>
+#include <string.h>
+#if defined(__cplusplus)
+# include <new>
+#endif
+
#if defined(MOZALLOC_EXPORT)
// do nothing: it's been defined to __declspec(dllexport) by
// mozalloc*.cpp on platforms where that's required
#elif defined(XP_WIN) || (defined(XP_OS2) && defined(__declspec))
# define MOZALLOC_EXPORT __declspec(dllimport)
#elif defined(HAVE_VISIBILITY_ATTRIBUTE)
/* Make sure symbols are still exported even if we're wrapped in a
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/mozalloc_abort.cpp
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Code
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Jones <jones.chris.g@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <stdio.h>
+#include <stdlib.h> // for abort()
+
+#if defined(_WIN32)
+# include <signal.h> // for raise
+#elif defined(XP_UNIX)
+# include <unistd.h> // for _exit
+#endif
+
+#if defined(XP_WIN) || (defined(XP_OS2) && defined(__declspec))
+# define MOZALLOC_EXPORT __declspec(dllexport)
+#endif
+
+#include "mozilla/mozalloc_abort.h"
+
+static int gDummyCounter;
+
+void
+mozalloc_abort(const char* const msg)
+{
+ fputs(msg, stderr);
+ fputs("\n", stderr);
+
+ // XXX/cjones: most of this function was copied from
+ // xpcom/base/nsDebugImpl.cpp:Abort(), except that we assume on
+ // UNIX-like platforms can directly abort() rather than need to go
+ // through PR_Abort(). we don't want this code to rely on NSPR.
+
+ // FIXME/bug 558928: improve implementation for windows/wince
+
+#if defined(_WIN32)
+# if !defined(WINCE)
+ //This should exit us
+ raise(SIGABRT);
+# endif
+ //If we are ignored exit this way..
+ _exit(3);
+#elif defined(XP_UNIX) || defined(XP_OS2) || defined(XP_BEOS)
+ abort();
+#else
+# warning not attempting to abort() on this platform
+#endif
+
+ // Still haven't aborted? Try dereferencing null.
+ // (Written this way to lessen the likelihood of it being optimized away.)
+ gDummyCounter += *((int*) 0); // TODO annotation saying we know
+ // this is crazy
+
+ // Still haven't aborted? Try _exit().
+ _exit(127);
+}
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/mozalloc_abort.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Code
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Jones <jones.chris.g@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef mozilla_mozalloc_abort_h
+#define mozilla_mozalloc_abort_h
+
+#if defined(MOZALLOC_EXPORT)
+// do nothing: it's been defined to __declspec(dllexport) by
+// mozalloc*.cpp on platforms where that's required
+#elif defined(XP_WIN) || (defined(XP_OS2) && defined(__declspec))
+# define MOZALLOC_EXPORT __declspec(dllimport)
+#elif defined(HAVE_VISIBILITY_ATTRIBUTE)
+/* Make sure symbols are still exported even if we're wrapped in a
+ * |visibility push(hidden)| blanket. */
+# define MOZALLOC_EXPORT __attribute__ ((visibility ("default")))
+#else
+# define MOZALLOC_EXPORT
+#endif
+
+/**
+ * Terminate this process in such a way that breakpad is triggered, if
+ * at all possible.
+ */
+MOZALLOC_EXPORT void mozalloc_abort(const char* const msg) NS_NORETURN;
+
+
+#endif /* ifndef mozilla_mozalloc_abort_h */
--- a/memory/mozalloc/mozalloc_oom.cpp
+++ b/memory/mozalloc/mozalloc_oom.cpp
@@ -33,57 +33,23 @@
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
-#include <stdlib.h> // for abort()
-
-#if defined(_WIN32)
-# include <signal.h> // for raise
-#elif defined(XP_UNIX)
-# include <unistd.h> // for _exit
-#endif
-
#if defined(XP_WIN) || (defined(XP_OS2) && defined(__declspec))
# define MOZALLOC_EXPORT __declspec(dllexport)
#endif
+#include "mozilla/mozalloc_abort.h"
#include "mozilla/mozalloc_oom.h"
-static int gDummyCounter;
-
void
mozalloc_handle_oom()
{
// NB: this is handle_oom() stage 1, which simply aborts on OOM.
// we might proceed to a stage 2 in which an attempt is made to
// reclaim memory
-
- // XXX/cjones: most of this function was copied from
- // xpcom/base/nsDebugImpl.cpp:Abort(), except that we assume on
- // UNIX-like platforms can directly abort() rather than need to go
- // through PR_Abort(). we don't want this code to rely on NSPR.
-
-#if defined(_WIN32)
-# if !defined(WINCE)
- //This should exit us
- raise(SIGABRT);
-# endif
- //If we are ignored exit this way..
- _exit(3);
-#elif defined(XP_UNIX) || defined(XP_OS2) || defined(XP_BEOS)
- abort();
-#else
-# warning not attempting to abort() on this platform
-#endif
-
- // Still haven't aborted? Try dereferencing null.
- // (Written this way to lessen the likelihood of it being optimized away.)
- gDummyCounter += *((int*) 0); // TODO annotation saying we know
- // this is crazy
-
- // Still haven't aborted? Try _exit().
- _exit(127);
+ mozalloc_abort("out of memory");
}
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/throw_gcc.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Code
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Jones <jones.chris.g@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef mozilla_throw_gcc_h
+#define mozilla_throw_gcc_h
+
+#include <stdio.h> // snprintf
+
+// For gcc, we define these inline to abort so that we're absolutely
+// certain that (i) no exceptions are thrown from Gecko; (ii) these
+// errors are always terminal and caught by breakpad.
+
+#include "mozilla/mozalloc_abort.h"
+
+namespace std {
+
+// NB: user code is not supposed to touch the std:: namespace. We're
+// doing this after careful review because we want to define our own
+// exception throwing semantics. Don't try this at home!
+
+inline void NS_NORETURN
+__throw_bad_exception(void)
+{
+ mozalloc_abort("fatal: STL threw bad_exception");
+}
+
+inline void NS_NORETURN
+__throw_bad_alloc(void)
+{
+ mozalloc_abort("fatal: STL threw bad_alloc");
+}
+
+inline void NS_NORETURN
+__throw_bad_cast(void)
+{
+ mozalloc_abort("fatal: STL threw bad_cast");
+}
+
+inline void NS_NORETURN
+__throw_bad_typeid(void)
+{
+ mozalloc_abort("fatal: STL threw bad_typeid");
+}
+
+inline void NS_NORETURN
+__throw_logic_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_domain_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_invalid_argument(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_length_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_out_of_range(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_runtime_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_range_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_overflow_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_underflow_error(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_ios_failure(const char* msg)
+{
+ mozalloc_abort(msg);
+}
+
+inline void NS_NORETURN
+__throw_system_error(int err)
+{
+ char error[128];
+ snprintf(error, sizeof(error)-1,
+ "fatal: STL threw system_error: %s (%d)", strerror(err), err);
+ mozalloc_abort(error);
+}
+
+} // namespace std
+
+#endif // mozilla_throw_gcc_h
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/throw_msvc.cpp
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Code
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Jones <jones.chris.g@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <exception>
+
+#if defined(XP_WIN) || (defined(XP_OS2) && defined(__declspec))
+# define MOZALLOC_EXPORT __declspec(dllexport)
+#endif
+
+#include "mozilla/mozalloc_abort.h"
+
+namespace std {
+
+// NB: user code is not supposed to touch the std:: namespace. We're
+// doing this after careful review because we want to define our own
+// exception throwing semantics. Don't try this at home!
+
+__declspec(dllexport) void mozilla_Throw(const exception& e);
+
+void
+mozilla_Throw(const exception& e)
+{
+ mozalloc_abort(e.what());
+}
+
+} // namespace std
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/throw_msvc.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Code
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Jones <jones.chris.g@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef mozilla_throw_msvc_h
+#define mozilla_throw_msvc_h
+
+// For MSVC, we define our own _Throw because the Win2k CRT doesn't
+// export it.
+
+#ifdef _EXCEPTION_
+# error "Unable to wrap _Throw(); CRT _Throw() already declared"
+#endif
+
+#define _Throw mozilla_Throw
+#include <exception>
+
+#endif // mozilla_throw_msvc_h
--- a/profile/dirserviceprovider/standalone/Makefile.in
+++ b/profile/dirserviceprovider/standalone/Makefile.in
@@ -50,13 +50,14 @@ CPPSRCS = $(MODULES_PROFILEDIRSERVICE_S
# we don't want the shared lib
FORCE_STATIC_LIB = 1
include $(topsrcdir)/config/rules.mk
LOCAL_INCLUDES = -I$(srcdir)/../src
DEFINES += -DXPCOM_GLUE
+STL_FLAGS =
export:: $(MODULES_PROFILEDIRSERVICE_SRC_CSRCS)
$(INSTALL) $^ .
GARBAGE = $(notdir $(MODULES_PROFILEDIRSERVICE_SRC_CSRCS))
--- a/xpcom/base/nscore.h
+++ b/xpcom/base/nscore.h
@@ -42,23 +42,16 @@
* c++ definitions needed by nscore.h
*/
#ifndef _XPCOM_CONFIG_H_
#include "xpcom-config.h"
#endif
/* Definitions of functions and operators that allocate memory. */
#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
-# if defined(__cplusplus)
-# include NEW_H /* to give mozalloc std::bad_alloc */
-# endif
-/* include these to avoid the macro wrappers causing these headers to
- * declare system functions with moz_ prefixes */
-# include <stdlib.h>
-# include <string.h>
# include "mozilla/mozalloc.h"
# include "mozilla/mozalloc_macro_wrappers.h"
#endif
/**
* Incorporate the core NSPR data types which XPCOM uses.
*/
#include "prtypes.h"
--- a/xpcom/glue/Makefile.in
+++ b/xpcom/glue/Makefile.in
@@ -129,22 +129,16 @@ EXPORTS_mozilla = \
BlockingResourceBase.h \
CondVar.h \
DeadlockDetector.h \
Monitor.h \
Mutex.h \
SSE.h \
$(NULL)
-ifdef WRAP_STL_INCLUDES
-ifdef GCC_VERSION
-EXPORTS_mozilla += functexcept.h
-endif
-endif
-
SDK_LIBRARY = \
$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
$(NULL)
# we don't want the shared lib, but we want to force the creation of a static lib.
FORCE_STATIC_LIB = 1
deleted file mode 100644
--- a/xpcom/glue/functexcept.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: sw=2 ts=2 et :
- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Code
- *
- * The Initial Developer of the Original Code is
- * The Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Chris Jones <jones.chris.g@gmail.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef mozilla_functexcept_h
-#define mozilla_functexcept_h
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// For gcc, we define these inline to abort so that we're absolutely
-// certain that (i) no exceptions are thrown from Gecko; (ii) these
-// errors are always terminal and caught by breakpad.
-
-// NB: It would be nice to #include "nsDebug.h" and use
-// NS_RUNTIMEABORT(), but because this file is used within chromium,
-// and nsDebug pulls in nscore, and nscore pulls in prtypes, and
-// chromium can't build with prtypes being included before
-// base/basictypes, then we have to roll our own aborting impl.
-
-// Assume that if we're building with gcc, we're on a platform where
-// abort() is fatal and triggers breakpad.
-#define MOZ_FE_ABORT(_msg) \
- do { \
- fputs(_msg, stderr); \
- fputs("\n", stderr); \
- abort(); \
- } while (0)
-
-namespace std {
-
-inline void NS_NORETURN
-__throw_bad_exception(void)
-{
- MOZ_FE_ABORT("fatal: STL threw bad_exception");
-}
-
-inline void NS_NORETURN
-__throw_bad_alloc(void)
-{
- MOZ_FE_ABORT("fatal: STL threw bad_alloc");
-}
-
-inline void NS_NORETURN
-__throw_bad_cast(void)
-{
- MOZ_FE_ABORT("fatal: STL threw bad_cast");
-}
-
-inline void NS_NORETURN
-__throw_bad_typeid(void)
-{
- MOZ_FE_ABORT("fatal: STL threw bad_typeid");
-}
-
-inline void NS_NORETURN
-__throw_logic_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_domain_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_invalid_argument(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_length_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_out_of_range(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_runtime_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_range_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_overflow_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_underflow_error(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_ios_failure(const char* msg)
-{
- MOZ_FE_ABORT(msg);
-}
-
-inline void NS_NORETURN
-__throw_system_error(int err)
-{
- char error[128];
- snprintf(error, sizeof(error)-1,
- "fatal: STL threw system_error: %s (%d)", strerror(err), err);
- MOZ_FE_ABORT(error);
-}
-
-} // namespace std
-
-#endif // mozilla_functexcept_h
--- a/xpcom/glue/standalone/Makefile.in
+++ b/xpcom/glue/standalone/Makefile.in
@@ -100,16 +100,19 @@ FORCE_STATIC_LIB = 1
# Force use of PIC
FORCE_USE_PIC = 1
# Pretend we're statically linking the CRT, even though we might not be: this
# avoids "msvcrp" and assembly dependencies from creeping into the directives
# for this library on Windows.
USE_STATIC_LIBS = 1
+# Don't use STL wrappers here (i.e. wrapped <new>); they require mozalloc
+STL_FLAGS =
+
GARBAGE += $(XPCOM_GLUE_SRC_LCSRCS) $(XPCOM_GLUE_SRC_LCPPSRCS) $(wildcard *.$(OBJ_SUFFIX))
SRCS_IN_OBJDIR = 1
include $(topsrcdir)/config/rules.mk
ifdef _MSC_VER
# Don't include directives about which CRT to use
--- a/xpcom/tools/registry/Makefile.in
+++ b/xpcom/tools/registry/Makefile.in
@@ -41,16 +41,17 @@ srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = xpcom
CPPSRCS = regxpcom.cpp
DEFINES += -DXPCOM_GLUE
+STL_FLAGS =
LOCAL_INCLUDES = \
-I$(srcdir)/../../build \
$(NULL)
SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=$(BIN_SUFFIX))
LIBS = \