Skip to content

Commit da396e9

Browse files
committed
new: add rewrites for c++17
1 parent a1faa7f commit da396e9

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

cores/arduino/new

+22-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define NEW_H
99

1010
#include <stdlib.h>
11+
//#pragma long_calls
1112

1213
namespace std {
1314
struct nothrow_t {};
@@ -27,25 +28,36 @@ namespace std {
2728
using size_t = ::size_t;
2829
} // namespace std
2930

30-
[[gnu::weak]] void * operator new(std::size_t size);
31-
[[gnu::weak]] void * operator new[](std::size_t size);
31+
void * operator new(std::size_t size);
32+
void * operator new[](std::size_t size);
3233

33-
[[gnu::weak]] void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
34-
[[gnu::weak]] void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
34+
#if __cplusplus >= 201703L
35+
void * operator new(std::size_t count, std::align_val_t al);
36+
void * operator new[](std::size_t count, std::align_val_t al);
37+
38+
void* operator new(std::size_t count, std::align_val_t al,
39+
const std::nothrow_t& tag) noexcept;
40+
void* operator new[](std::size_t count, std::align_val_t al,
41+
const std::nothrow_t& tag) noexcept;
42+
#endif
43+
44+
void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
45+
void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
3546

3647
void * operator new(std::size_t size, void *place) noexcept;
3748
void * operator new[](std::size_t size, void *place) noexcept;
3849

39-
[[gnu::weak]] void operator delete(void * ptr) noexcept;
40-
[[gnu::weak]] void operator delete[](void * ptr) noexcept;
50+
51+
void operator delete(void * ptr) noexcept;
52+
void operator delete[](void * ptr) noexcept;
4153

4254
#if __cplusplus >= 201402L
43-
[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept;
44-
[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept;
55+
void operator delete(void* ptr, std::size_t size) noexcept;
56+
void operator delete[](void * ptr, std::size_t size) noexcept;
4557
#endif // __cplusplus >= 201402L
4658

47-
[[gnu::weak]] void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
48-
[[gnu::weak]] void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
59+
void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
60+
void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
4961

5062
void operator delete(void* ptr, void* place) noexcept;
5163
void operator delete[](void* ptr, void* place) noexcept;

cores/arduino/new.cpp

+31-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,36 @@ void * operator new[](std::size_t size) {
4444
return operator new(size);
4545
}
4646

47+
#if __cplusplus >= 201703L
48+
void* operator new(std::size_t count, std::align_val_t al) {
49+
return operator new(count);
50+
}
51+
52+
void* operator new[](std::size_t count, std::align_val_t al) {
53+
return operator new(count);
54+
}
55+
56+
void * operator new(std::size_t size, std::align_val_t al, const std::nothrow_t tag) noexcept {
57+
#if defined(NEW_TERMINATES_ON_FAILURE)
58+
// Cannot call throwing operator new as standard suggests, so call
59+
// new_helper directly then
60+
return new_helper(size);
61+
#else
62+
return operator new(size);
63+
#endif
64+
}
65+
66+
void * operator new[](std::size_t size, std::align_val_t al, const std::nothrow_t& tag) noexcept {
67+
#if defined(NEW_TERMINATES_ON_FAILURE)
68+
// Cannot call throwing operator new[] as standard suggests, so call
69+
// malloc directly then
70+
return new_helper(size);
71+
#else
72+
return operator new[](size);
73+
#endif
74+
}
75+
#endif
76+
4777
void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
4878
#if defined(NEW_TERMINATES_ON_FAILURE)
4979
// Cannot call throwing operator new as standard suggests, so call
@@ -102,4 +132,4 @@ void operator delete(void* ptr, void* place) noexcept {
102132
void operator delete[](void* ptr, void* place) noexcept {
103133
(void)ptr; (void)place; // unused
104134
// Nothing to do
105-
}
135+
}

0 commit comments

Comments
 (0)