Bug 1349064 - Replace MSVC wrappers with std::exception::_Set_raise_handler. - r=froydnj draft
authorJeff Gilbert <jgilbert@mozilla.com>
Wed, 22 Mar 2017 16:43:11 -0700
changeset 555761 3869d5547711c259204e991e992f4027dfcc7a54
parent 555760 a40ee3552b310f0ad582dcbf200ffd18a91b97a9
child 555762 7c47b58285efc397719af949990c506386ff558b
push id52333
push userbmo:jgilbert@mozilla.com
push dateTue, 04 Apr 2017 20:23:40 +0000
reviewersfroydnj
bugs1349064
milestone55.0a1
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