Bug 1349064 - Replace MSVC wrappers with std::exception::_Set_raise_handler. - r=froydnj
☠☠ backed out by bd2f9fee24e6 ☠ ☠
authorJeff Gilbert <jgilbert@mozilla.com>
Wed, 22 Mar 2017 16:43:11 -0700
changeset 351609 8c35a43033bcec3e59ef307312050a2744403843
parent 351608 02e10c8eeb95d911e8eacbfb12c35aa6c6c61be8
child 351610 1506a6e5ee3711cb8690f35aac5a95b17458214e
push id88904
push userjgilbert@mozilla.com
push dateThu, 06 Apr 2017 20:06:11 +0000
treeherdermozilla-inbound@1506a6e5ee37 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfroydnj
bugs1349064
milestone55.0a1
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
Bug 1349064 - Replace MSVC wrappers with std::exception::_Set_raise_handler. - r=froydnj MozReview-Commit-ID: MG5c4bzDlI
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,22 +14,16 @@
 
 // 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,20 +12,16 @@ 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,63 +1,21 @@
 /* -*- 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 <stdio.h>
-
+#include <exception>
 #include "mozalloc_abort.h"
 
-__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)
+static void __cdecl
+RaiseHandler(const std::exception& e)
 {
-    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);
+    mozalloc_abort(e.what());
 }
 
-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
+static struct StaticScopeStruct final {
+    StaticScopeStruct() {
+        std::exception::_Set_raise_handler(RaiseHandler);
+    }
+} StaticScopeInvoke;
deleted file mode 100644
--- a/memory/mozalloc/msvc_raise_wrappers.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- 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
deleted file mode 100644
--- a/memory/mozalloc/throw_msvc.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- 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