Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit bf7e5bb

Browse files
committed
Support nothrow new.
1 parent 9e68f65 commit bf7e5bb

File tree

1 file changed

+77
-33
lines changed

1 file changed

+77
-33
lines changed

src/core/stdcpp/new_.d

Lines changed: 77 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,86 +13,130 @@ module core.stdcpp.new_;
1313

1414
import core.stdcpp.xutility : __cpp_sized_deallocation, __cpp_aligned_new;
1515

16+
@nogc:
17+
1618
// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
1719
enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16;
1820

21+
extern (C++, "std")
22+
{
23+
///
24+
struct nothrow_t {}
1925

20-
extern (C++):
26+
///
27+
enum align_val_t : size_t { defaultAlignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__ };
28+
}
2129

22-
///
23-
extern (C++, "std") enum align_val_t : size_t { defaultAlignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__ };
30+
31+
// raw C++ functions
32+
extern(C++):
2433

2534
/// Binding for ::operator new(std::size_t count)
2635
pragma(mangle, __new_mangle)
27-
void* __cpp_new(size_t count) @nogc;
36+
void* __cpp_new(size_t count);
37+
38+
/// Binding for ::operator new(std::size_t count, const std::nothrow_t&)
39+
pragma(mangle, __new_nothrow_mangle)
40+
void* __cpp_new_nothrow(size_t count, ref const(nothrow_t) = std_nothrow) nothrow;
2841

2942
/// Binding for ::operator delete(void* ptr)
3043
pragma(mangle, __delete_mangle)
31-
void __cpp_delete(void* ptr) @nogc;
44+
void __cpp_delete(void* ptr);
45+
46+
/// Binding for ::operator delete(void* ptr, const std::nothrow_t& tag)
47+
pragma(mangle, __delete_nothrow_mangle)
48+
void __cpp_delete_nothrow(void* ptr, ref const(nothrow_t) = std_nothrow) nothrow;
3249

3350
static if (__cpp_sized_deallocation)
3451
{
3552
/// Binding for ::operator delete(void* ptr, size_t size)
3653
pragma(mangle, __delete_size_mangle)
37-
void __cpp_delete_size(void* ptr, size_t size) @nogc;
54+
void __cpp_delete_size(void* ptr, size_t size);
3855
}
3956
static if (__cpp_aligned_new)
4057
{
4158
/// Binding for ::operator new(std::size_t count, std::align_val_t al)
4259
pragma(mangle, __new_align_mangle)
43-
void* __cpp_new_aligned(size_t count, align_val_t alignment) @nogc;
60+
void* __cpp_new_aligned(size_t count, align_val_t alignment);
61+
62+
/// Binding for ::operator new(std::size_t count, std::align_val_t al, const std::nothrow_t&)
63+
pragma(mangle, __new_aligned_nothrow_mangle)
64+
void* __cpp_new_aligned_nothrow(size_t count, align_val_t alignment, ref const(nothrow_t) = std_nothrow) nothrow;
4465

4566
/// Binding for ::operator delete(void* ptr, std::align_val_t al)
4667
pragma(mangle, __delete_align_mangle)
47-
void __cpp_delete_aligned(void* ptr, align_val_t alignment) @nogc;
68+
void __cpp_delete_aligned(void* ptr, align_val_t alignment);
69+
70+
/// Binding for ::operator delete(void* ptr, std::align_val_t al, const std::nothrow_t& tag)
71+
pragma(mangle, __delete_align_nothrow_mangle)
72+
void __cpp_delete_align_nothrow(void* ptr, align_val_t alignment, ref const(nothrow_t) = std_nothrow) nothrow;
4873

4974
/// Binding for ::operator delete(void* ptr, size_t size, std::align_val_t al)
5075
pragma(mangle, __delete_size_align_mangle)
51-
void __cpp_delete_size_aligned(void* ptr, size_t size, align_val_t alignment) @nogc;
76+
void __cpp_delete_size_aligned(void* ptr, size_t size, align_val_t alignment);
5277
}
5378

5479
private:
80+
extern (D):
81+
82+
__gshared immutable nothrow_t std_nothrow;
5583

5684
// we have to hard-code the mangling for the global new/delete operators
5785
version (CppRuntime_Microsoft)
5886
{
5987
version (D_LP64)
6088
{
61-
enum __new_mangle = "??2@YAPEAX_K@Z";
62-
enum __delete_mangle = "??3@YAXPEAX@Z";
63-
enum __delete_size_mangle = "??3@YAXPEAX_K@Z";
64-
enum __new_align_mangle = "??2@YAPEAX_KW4align_val_t@std@@@Z";
65-
enum __delete_align_mangle = "??3@YAXPEAXW4align_val_t@std@@@Z";
66-
enum __delete_size_align_mangle = "??3@YAXPEAX_KW4align_val_t@std@@@Z";
89+
enum __new_mangle = "??2@YAPEAX_K@Z";
90+
enum __new_nothrow_mangle = "??2@YAPEAX_KAEBUnothrow_t@std@@@Z";
91+
enum __delete_mangle = "??3@YAXPEAX@Z";
92+
enum __delete_nothrow_mangle = "??3@YAXPEAXAEBUnothrow_t@std@@@Z";
93+
enum __delete_size_mangle = "??3@YAXPEAX_K@Z";
94+
enum __new_align_mangle = "??2@YAPEAX_KW4align_val_t@std@@@Z";
95+
enum __new_aligned_nothrow_mangle = "??2@YAPEAX_KW4align_val_t@std@@AEBUnothrow_t@1@@Z";
96+
enum __delete_align_mangle = "??3@YAXPEAXW4align_val_t@std@@@Z";
97+
enum __delete_align_nothrow_mangle = "??3@YAXPEAXW4align_val_t@std@@AEBUnothrow_t@1@@Z";
98+
enum __delete_size_align_mangle = "??3@YAXPEAX_KW4align_val_t@std@@@Z";
6799
}
68100
else
69101
{
70-
enum __new_mangle = "??2@YAPAXI@Z";
71-
enum __delete_mangle = "??3@YAXPAX@Z";
72-
enum __delete_size_mangle = "??3@YAXPAXI@Z";
73-
enum __new_align_mangle = "??2@YAPAXIW4align_val_t@std@@@Z";
74-
enum __delete_align_mangle = "??3@YAXPAXW4align_val_t@std@@@Z";
75-
enum __delete_size_align_mangle = "??3@YAXPAXIW4align_val_t@std@@@Z";
102+
enum __new_mangle = "??2@YAPAXI@Z";
103+
enum __new_nothrow_mangle = "??2@YAPAXIABUnothrow_t@std@@@Z";
104+
enum __delete_mangle = "??3@YAXPAX@Z";
105+
enum __delete_nothrow_mangle = "??3@YAXPAXABUnothrow_t@std@@@Z";
106+
enum __delete_size_mangle = "??3@YAXPAXI@Z";
107+
enum __new_align_mangle = "??2@YAPAXIW4align_val_t@std@@@Z";
108+
enum __new_aligned_nothrow_mangle = "??2@YAPAXIW4align_val_t@std@@ABUnothrow_t@1@@Z";
109+
enum __delete_align_mangle = "??3@YAXPAXW4align_val_t@std@@@Z";
110+
enum __delete_align_nothrow_mangle = "??3@YAXPAXW4align_val_t@std@@ABUnothrow_t@1@@Z";
111+
enum __delete_size_align_mangle = "??3@YAXPAXIW4align_val_t@std@@@Z";
76112
}
77113
}
78114
else
79115
{
80116
version (D_LP64)
81117
{
82-
enum __new_mangle = "_Znwm";
83-
enum __delete_mangle = "_ZdlPv";
84-
enum __delete_size_mangle = "_ZdlPvm";
85-
enum __new_align_mangle = "_ZnwmSt11align_val_t";
86-
enum __delete_align_mangle = "_ZdlPvSt11align_val_t";
87-
enum __delete_size_align_mangle = "_ZdlPvmSt11align_val_t";
118+
enum __new_mangle = "_Znwm";
119+
enum __new_nothrow_mangle = "_ZnwmRKSt9nothrow_t";
120+
enum __delete_mangle = "_ZdlPv";
121+
enum __delete_nothrow_mangle = "_ZdlPvRKSt9nothrow_t";
122+
enum __delete_size_mangle = "_ZdlPvm";
123+
enum __new_align_mangle = "_ZnwmSt11align_val_t";
124+
enum __new_aligned_nothrow_mangle = "_ZnwmSt11align_val_tRKSt9nothrow_t";
125+
enum __delete_align_mangle = "_ZdlPvSt11align_val_t";
126+
enum __delete_align_nothrow_mangle = "_ZdlPvSt11align_val_tRKSt9nothrow_t";
127+
enum __delete_size_align_mangle = "_ZdlPvmSt11align_val_t";
88128
}
89129
else
90130
{
91-
enum __new_mangle = "_Znwj";
92-
enum __delete_mangle = "_ZdlPv";
93-
enum __delete_size_mangle = "_ZdlPvj";
94-
enum __new_align_mangle = "_ZnwjSt11align_val_t";
95-
enum __delete_align_mangle = "_ZdlPvSt11align_val_t";
96-
enum __delete_size_align_mangle = "_ZdlPvjSt11align_val_t";
131+
enum __new_mangle = "_Znwj";
132+
enum __new_nothrow_mangle = "_ZnwjRKSt9nothrow_t";
133+
enum __delete_mangle = "_ZdlPv";
134+
enum __delete_nothrow_mangle = "_ZdlPvRKSt9nothrow_t";
135+
enum __delete_size_mangle = "_ZdlPvj";
136+
enum __new_align_mangle = "_ZnwjSt11align_val_t";
137+
enum __new_aligned_nothrow_mangle = "_ZnwjSt11align_val_tRKSt9nothrow_t";
138+
enum __delete_align_mangle = "_ZdlPvSt11align_val_t";
139+
enum __delete_align_nothrow_mangle = "_ZdlPvSt11align_val_tRKSt9nothrow_t";
140+
enum __delete_size_align_mangle = "_ZdlPvjSt11align_val_t";
97141
}
98142
}

0 commit comments

Comments
 (0)