Bug 1376057 - Replace MSVC wrappers with std::exception::_Set_raise_handler. - r=froydnj
authorJeff Gilbert <jgilbert@mozilla.com>
Wed, 22 Mar 2017 16:43:11 -0700
changeset 366274 37e047b6187f8a2cc9ce30268d42977e679db84e
parent 366273 7da6c99070996a8d0baa4013d4c0b515f8045fa2
child 366275 abb82362d85b137b26ff42cb261dead6f0ce2ac8
push id32099
push usercbook@mozilla.com
push dateWed, 28 Jun 2017 11:23:49 +0000
treeherdermozilla-central@306d2070e105 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfroydnj
bugs1376057
milestone56.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 1376057 - 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