@@ -13,86 +13,130 @@ module core.stdcpp.new_;
1313
1414import core.stdcpp.xutility : __cpp_sized_deallocation, __cpp_aligned_new;
1515
16+ @nogc :
17+
1618// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
1719enum 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)
2635pragma (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)
3043pragma (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
3350static 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}
3956static 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
5479private :
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
5785version (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}
78114else
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