Attached is a patch to make operator new on MSVC conforming to the C++
Standard.
ChangeLog:
* _config-msvcrt.h: #undefine _RWSTD_NO_NEW_THROWS and
_RWSTD_NO_NEW_OFLOW_SAFE macros if they're #defined.
* memory.cpp (__rw_new_handler_imp): Throw std::bad_alloc() if no user
handler installed.
(set_new_handler): Don't invoke _set_new_handler().
* new_supp.cpp: New file with helper object to make operator new
conforming to the C++ Standard
Farid.
Index: include/rw/_config-msvcrt.h
===================================================================
--- include/rw/_config-msvcrt.h (revision 570339)
+++ include/rw/_config-msvcrt.h (working copy)
@@ -148,6 +148,14 @@
# define _RWSTD_NO_DEPRECATED_C_HEADERS
#endif // _RWSTD_NO_DEPRECATED_C_HEADERS
+#ifdef _RWSTD_NO_NEW_THROWS
+# undef _RWSTD_NO_NEW_THROWS
+#endif // _RWSTD_NO_NEW_THROWS
+
+#ifdef _RWSTD_NO_NEW_OFLOW_SAFE
+# undef _RWSTD_NO_NEW_OFLOW_SAFE
+#endif // _RWSTD_NO_NEW_OFLOW_SAFE
+
// operator new and delete is not reliably replaceable across
// shared library boundaries, which includes the shared library
// version of the language support library
Index: src/memory.cpp
===================================================================
--- src/memory.cpp (revision 570339)
+++ src/memory.cpp (working copy)
@@ -178,20 +178,22 @@
#ifdef _MSC_VER
-typedef int (*__rw_new_handler_t)(_RWSTD_SIZE_T);
-
-_RWSTD_DLLIMPORT __rw_new_handler_t _set_new_handler (__rw_new_handler_t);
-
_RWSTD_NAMESPACE (__rw) {
static _STD::new_handler __rw_new_handler /* = 0 */;
-static int __rw_new_handler_imp (_RWSTD_SIZE_T)
+int __rw_new_handler_imp (_RWSTD_SIZE_T)
{
- _RWSTD_ASSERT (0 != __rw_new_handler);
+ if (!__rw_new_handler)
+#if _MSC_VER <= 1310
+ _RW::__rw_throw (_RWSTD_ERROR_FIRST + 3 /* == bad_alloc */);
+#else
+ return 0; // operator new will throw std::bad_alloc()
+#endif
__rw_new_handler ();
+ // repeat memory allocation
return 1;
}
@@ -214,8 +216,6 @@
_RW::__rw_new_handler = handler;
- _set_new_handler (_RW::__rw_new_handler_imp);
-
return save;
}
Index: src/new_supp.cpp
===================================================================
--- src/new_supp.cpp (revision 0)
+++ src/new_supp.cpp (revision 0)
@@ -0,0 +1,58 @@
+ /***************************************************************************
+ *
+ * new_supp.cpp - helper object to make operator new conforming
+ * to the C++ Standard
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ **************************************************************************/
+
+#define _RWSTD_LIB_SRC
+
+#ifdef _MSC_VER
+
+#include <rw/_defs.h>
+
+
+typedef int (*__rw_new_handler_t)(_RWSTD_SIZE_T);
+
+_RWSTD_DLLIMPORT __rw_new_handler_t _set_new_handler (__rw_new_handler_t);
+
+_RWSTD_NAMESPACE (__rw) {
+
+int __rw_new_handler_imp (_RWSTD_SIZE_T);
+
+} // namespace __rw
+
+
+#pragma init_seg (lib)
+
+struct __rw_new_handler_init_t
+{
+ __rw_new_handler_init_t () {
+ _set_new_handler (_RW::__rw_new_handler_imp);
+ }
+};
+
+static __rw_new_handler_init_t __rw_new_handler_init;
+
+
+#endif // _MSC_VER
Property changes on: src\new_supp.cpp
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native