Backed out changeset 8c35a43033bc (bug 1349064)
authorSebastian Hengst <archaeopteryx@coole-files.de>
Thu, 06 Apr 2017 22:48:41 +0200
changeset 399873 bd2f9fee24e6487e59cbc10adb2658bb5d39ddee
parent 399872 4f6eed6971d566b05b263109b15864c187cb4d94
child 399874 e38daced6d84898d47541ea2bb2ca741b0a77660
push id7391
push usermtabara@mozilla.com
push dateMon, 12 Jun 2017 13:08:53 +0000
treeherdermozilla-beta@2191d7f87e2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1349064
milestone55.0a1
backs out8c35a43033bcec3e59ef307312050a2744403843
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 8c35a43033bc (bug 1349064)
config/msvc-stl-wrapper.template.h
memory/mozalloc/moz.build
memory/mozalloc/msvc_raise_wrappers.cpp
memory/mozalloc/msvc_raise_wrappers.h
memory/mozalloc/throw_msvc.h
--- a/config/msvc-stl-wrapper.template.h
+++ b/config/msvc-stl-wrapper.template.h
@@ -14,16 +14,22 @@
 
 // Include mozalloc after the STL header and all other headers it includes
 // have been preprocessed.
 #if !defined(MOZ_INCLUDE_MOZALLOC_H)
 #  define MOZ_INCLUDE_MOZALLOC_H
 #  define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
 #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
+
 #ifdef _DEBUG
 // From
 //   http://msdn.microsoft.com/en-us/library/aa985982%28VS.80%29.aspx
 // and
 //   http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx
 // there appear to be two types of STL container checking.  The
 // former is enabled by -D_DEBUG (which is implied by -MDd or -MTd), and
 // looks to be full generation/mutation checked iterators as done by
--- a/memory/mozalloc/moz.build
+++ b/memory/mozalloc/moz.build
@@ -12,16 +12,20 @@ EXPORTS.mozilla += [
 ]
 
 if CONFIG['WRAP_STL_INCLUDES']:
     if CONFIG['GNU_CXX']:
         EXPORTS.mozilla += ['throw_gcc.h']
     elif CONFIG['_MSC_VER']:
         DEFINES['_HAS_EXCEPTIONS'] = 0
         if CONFIG['MOZ_MSVC_STL_WRAP_RAISE']:
+            EXPORTS.mozilla += [
+                'msvc_raise_wrappers.h',
+                'throw_msvc.h',
+            ]
             SOURCES += [
                 'msvc_raise_wrappers.cpp',
             ]
 
 if CONFIG['OS_TARGET'] == 'WINNT':
     # Keep this file separate to avoid #include'ing windows.h everywhere.
     SOURCES += [
         'winheap.cpp',
--- a/memory/mozalloc/msvc_raise_wrappers.cpp
+++ b/memory/mozalloc/msvc_raise_wrappers.cpp
@@ -1,21 +1,63 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  * vim: sw=4 ts=4 et :
  */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-#include <exception>
+#include <stdio.h>
+
 #include "mozalloc_abort.h"
 
-static void __cdecl
-RaiseHandler(const std::exception& e)
+__declspec(noreturn) static void abort_from_exception(const char* const which,
+                                                      const char* const what);
+static void
+abort_from_exception(const char* const which,  const char* const what)
 {
-    mozalloc_abort(e.what());
+    fprintf(stderr, "fatal: STL threw %s: ", which);
+    mozalloc_abort(what);
+}
+
+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!
+
+MFBT_API __declspec(noreturn) void
+moz_Xinvalid_argument(const char* what)
+{
+    abort_from_exception("invalid_argument", what);
 }
 
-static struct StaticScopeStruct final {
-    StaticScopeStruct() {
-        std::exception::_Set_raise_handler(RaiseHandler);
-    }
-} StaticScopeInvoke;
+MFBT_API __declspec(noreturn) void
+moz_Xlength_error(const char* what)
+{
+    abort_from_exception("length_error", what);
+}
+
+MFBT_API __declspec(noreturn) void
+moz_Xout_of_range(const char* what)
+{
+    abort_from_exception("out_of_range", what);
+}
+
+MFBT_API __declspec(noreturn) void
+moz_Xoverflow_error(const char* what)
+{
+    abort_from_exception("overflow_error", what);
+}
+
+MFBT_API __declspec(noreturn) void
+moz_Xruntime_error(const char* what)
+{
+    abort_from_exception("runtime_error", what);
+}
+
+MFBT_API __declspec(noreturn) void
+moz_Xbad_function_call()
+{
+    abort_from_exception("bad_function_call", "bad function call");
+}
+
+} // namespace std
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/msvc_raise_wrappers.h
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_msvc_raise_wrappers_h
+#define mozilla_msvc_raise_wrappers_h
+
+#ifdef _XSTDDEF_
+#  error "Unable to wrap _RAISE(); CRT _RAISE() already defined"
+#endif
+#ifdef _XUTILITY_
+#  error "Unable to wrap _X[exception](); CRT versions already declared"
+#endif
+#ifdef _FUNCTIONAL_
+#  error "Unable to wrap _Xbad_function_call(); CRT version already declared"
+#endif
+
+#include "mozilla/mozalloc_abort.h"
+
+// xutility will declare the following functions in the std namespace.
+// We #define them to be named differently so we can ensure the exception
+// throwing semantics of these functions work exactly the way we want, by
+// defining our own versions in msvc_raise_wrappers.cpp.
+#  define _Xinvalid_argument  moz_Xinvalid_argument
+#  define _Xlength_error      moz_Xlength_error
+#  define _Xout_of_range      moz_Xout_of_range
+#  define _Xoverflow_error    moz_Xoverflow_error
+#  define _Xruntime_error     moz_Xruntime_error
+// used by <functional>
+#  define _Xbad_function_call moz_Xbad_function_call
+
+#  include <xstddef>
+#  include <xutility>
+
+#  undef _RAISE
+#  define _RAISE(x) mozalloc_abort((x).what())
+
+#endif  // ifndef mozilla_msvc_raise_wrappers_h
new file mode 100644
--- /dev/null
+++ b/memory/mozalloc/throw_msvc.h
@@ -0,0 +1,17 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_throw_msvc_h
+#define mozilla_throw_msvc_h
+
+#if defined(MOZ_MSVC_STL_WRAP_RAISE)
+#  include "msvc_raise_wrappers.h"
+#else
+#  error "Unknown STL wrapper tactic"
+#endif
+
+#endif  // mozilla_throw_msvc_h