diff options
author | Martino Facchin <m.facchin@arduino.cc> | 2020-10-15 10:36:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-15 10:36:33 +0200 |
commit | 6ec80154cd2ca52bce443afbbed8a1ad44d049cb (patch) | |
tree | 9f5ce5b42f26358b537dd9807a1c3f8617f5c3d7 /cores/arduino/new | |
parent | 3055c1efa3c6980c864f661e6c8cc5d5ac773af4 (diff) | |
parent | 6d292502e138b5c73705f0df8095ded3f1df956f (diff) |
Merge pull request #361 from matthijskooijman/improve-new
Improve and complete implementation of new/delete
Diffstat (limited to 'cores/arduino/new')
-rw-r--r-- | cores/arduino/new | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/cores/arduino/new b/cores/arduino/new index aa8ecb5..8cf2103 100644 --- a/cores/arduino/new +++ b/cores/arduino/new @@ -1,5 +1,66 @@ /* -this header is for compatibility with standard c++ header names -so that #include<new> works as expected + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "new.h" + +#ifndef NEW_H +#define NEW_H + +#include <stdlib.h> + +namespace std { + struct nothrow_t {}; + extern const nothrow_t nothrow; + + // These are not actually implemented, to prevent overhead and + // complexity. They are still declared to allow implementing + // them in user code if needed. + typedef void (*new_handler)(); + new_handler set_new_handler(new_handler new_p) noexcept; + new_handler get_new_handler() noexcept; + + // This is normally declared in various headers that we do not have + // available, so just define it here. We could also use ::size_t + // below, but then anyone including <new> can no longer assume + // std::size_t is available. + using size_t = ::size_t; +} // namespace std + +[[gnu::weak]] void * operator new(std::size_t size); +[[gnu::weak]] void * operator new[](std::size_t size); + +[[gnu::weak]] void * operator new(std::size_t size, const std::nothrow_t tag) noexcept; +[[gnu::weak]] void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept; + +void * operator new(std::size_t size, void *place) noexcept; +void * operator new[](std::size_t size, void *place) noexcept; + +[[gnu::weak]] void operator delete(void * ptr) noexcept; +[[gnu::weak]] void operator delete[](void * ptr) noexcept; + +#if __cplusplus >= 201402L +[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept; +[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept; +#endif // __cplusplus >= 201402L + +[[gnu::weak]] void operator delete(void* ptr, const std::nothrow_t& tag) noexcept; +[[gnu::weak]] void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept; + +void operator delete(void* ptr, void* place) noexcept; +void operator delete[](void* ptr, void* place) noexcept; + +#endif + |