forked from arduino/ArduinoCore-zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnew.cpp
135 lines (119 loc) · 3.64 KB
/
new.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* Copyright (c) 2024 Arduino SA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "new.h"
// The C++ spec dictates that allocation failure should cause the
// (non-nothrow version of the) operator new to throw an exception.
// Since we expect to have exceptions disabled, it would be more
// appropriate (and probably standards-compliant) to terminate instead.
// Historically failure causes null to be returned, but this define
// allows switching to more robust terminating behaviour (that might
// become the default at some point in the future). Note that any code
// that wants null to be returned can (and should) use the nothrow
// versions of the new statement anyway and is unaffected by this.
// #define NEW_TERMINATES_ON_FAILURE
namespace std {
// Defined in abi.cpp
void terminate();
const nothrow_t nothrow;
}
static void * new_helper(std::size_t size) {
// Even zero-sized allocations should return a unique pointer, but
// malloc does not guarantee this
if (size == 0)
size = 1;
return malloc(size);
}
void * operator new(std::size_t size) {
void *res = new_helper(size);
#if defined(NEW_TERMINATES_ON_FAILURE)
if (!res)
std::terminate();
#endif
return res;
}
void * operator new[](std::size_t size) {
return operator new(size);
}
#if __cplusplus >= 201703L
void* operator new(std::size_t count, std::align_val_t al) {
return operator new(count);
}
void* operator new[](std::size_t count, std::align_val_t al) {
return operator new(count);
}
void * operator new(std::size_t size, std::align_val_t al, const std::nothrow_t tag) noexcept {
#if defined(NEW_TERMINATES_ON_FAILURE)
// Cannot call throwing operator new as standard suggests, so call
// new_helper directly then
return new_helper(size);
#else
return operator new(size);
#endif
}
void * operator new[](std::size_t size, std::align_val_t al, const std::nothrow_t& tag) noexcept {
#if defined(NEW_TERMINATES_ON_FAILURE)
// Cannot call throwing operator new[] as standard suggests, so call
// malloc directly then
return new_helper(size);
#else
return operator new[](size);
#endif
}
#endif
void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
#if defined(NEW_TERMINATES_ON_FAILURE)
// Cannot call throwing operator new as standard suggests, so call
// new_helper directly then
return new_helper(size);
#else
return operator new(size);
#endif
}
void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept {
#if defined(NEW_TERMINATES_ON_FAILURE)
// Cannot call throwing operator new[] as standard suggests, so call
// malloc directly then
return new_helper(size);
#else
return operator new[](size);
#endif
}
void * operator new(std::size_t size, void *place) noexcept {
// Nothing to do
(void)size; // unused
return place;
}
void * operator new[](std::size_t size, void *place) noexcept {
return operator new(size, place);
}
void operator delete(void * ptr) noexcept {
free(ptr);
}
void operator delete[](void * ptr) noexcept {
operator delete(ptr);
}
#if __cplusplus >= 201402L
void operator delete(void* ptr, std::size_t size) noexcept {
operator delete(ptr);
}
void operator delete[](void * ptr, std::size_t size) noexcept {
operator delete[](ptr);
}
#endif // __cplusplus >= 201402L
void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
operator delete(ptr);
}
void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
operator delete[](ptr);
}
void operator delete(void* ptr, void* place) noexcept {
(void)ptr; (void)place; // unused
// Nothing to do
}
void operator delete[](void* ptr, void* place) noexcept {
(void)ptr; (void)place; // unused
// Nothing to do
}