@@ -13,86 +13,130 @@ module core.stdcpp.new_;
13
13
14
14
import core.stdcpp.xutility : __cpp_sized_deallocation, __cpp_aligned_new;
15
15
16
+ @nogc :
17
+
16
18
// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
17
19
enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16 ;
18
20
21
+ extern (C++ , " std" )
22
+ {
23
+ // /
24
+ struct nothrow_t {}
19
25
20
- extern (C++ ):
26
+ // /
27
+ enum align_val_t : size_t { defaultAlignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__ };
28
+ }
21
29
22
- // /
23
- extern (C++ , " std" ) enum align_val_t : size_t { defaultAlignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__ };
30
+
31
+ // raw C++ functions
32
+ extern (C++ ):
24
33
25
34
// / Binding for ::operator new(std::size_t count)
26
35
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 ;
28
41
29
42
// / Binding for ::operator delete(void* ptr)
30
43
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 ;
32
49
33
50
static if (__cpp_sized_deallocation)
34
51
{
35
52
// / Binding for ::operator delete(void* ptr, size_t size)
36
53
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);
38
55
}
39
56
static if (__cpp_aligned_new)
40
57
{
41
58
// / Binding for ::operator new(std::size_t count, std::align_val_t al)
42
59
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 ;
44
65
45
66
// / Binding for ::operator delete(void* ptr, std::align_val_t al)
46
67
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 ;
48
73
49
74
// / Binding for ::operator delete(void* ptr, size_t size, std::align_val_t al)
50
75
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);
52
77
}
53
78
54
79
private :
80
+ extern (D ):
81
+
82
+ __gshared immutable nothrow_t std_nothrow;
55
83
56
84
// we have to hard-code the mangling for the global new/delete operators
57
85
version (CppRuntime_Microsoft )
58
86
{
59
87
version (D_LP64 )
60
88
{
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" ;
67
99
}
68
100
else
69
101
{
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" ;
76
112
}
77
113
}
78
114
else
79
115
{
80
116
version (D_LP64 )
81
117
{
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" ;
88
128
}
89
129
else
90
130
{
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" ;
97
141
}
98
142
}
0 commit comments